好了,我不过这个MMU了,做一次人肉MMU。
直接在恢复MMU那句之前,把SleepState_WakeAddr 0x804070AC 转换为对应的的映射地址 0x304070A
然后让程序跑到这里,的确是回到Awake_address 函数了。
然后是一堆恢复各状态寄存器的指令,都正常,一直到了这里:
; 2. Recover Last mode's REG's, & go back to caller of OALCPUPowerOff()
ldr sp, [r3, #SleepState_SVC_SP]
ldr lr, [sp], #4
ldmia sp!, {r4-r12}
mov pc, lr ; and now back to our sponsors
这里 sp 就是 R13啦,获得的是保存的 0xffffc79c ,然后我手动查 MMUTABLE
就是 0x31f43ffc 获得的表是 0x31f45c01 。然后查 这个内存 0x31ffc79c,晕,全部是0.
所以 这个 堆栈 指针指向的内容是0,下面的那个出栈就使 lr 是0 了, 这么我的程序就跑到0 了。
当然上面是我没有打开MMU 的情况下做的, 不知道真正的 MMU 查表出来的结果是否这样,但跟我现在
的情况比较相近了, 难道这个堆栈出错了?! 奇怪,内存中的其他地方都没有出错啊。