自己来解决吧:因为最后在Bootloader中要调用OEMLaunch()函数,实际上调用的是Launch()函数进行实际的跳转。Launch()函数由汇编实现: LEAF_ENTRY Launch ldr r2,=PhysicalStart ldr r3,=(VIR_RAM_START - PHY_RAM_START) sub r2,r2,r3 mov r1 ,#0x0070;//禁用MMU mcr p15,0,r1,c1,c0,0 nop mov pc,r2;跳转 nop 因为跳转地址是物理地址,,,所以在跳转之前,首先把MMU禁用 ,然后,通过直接给PC寄存器赋值,实现实际的跳转。
结论:初始化MMU要在跳转物理地址之后进行。bootlaoder中初始化MMU就是在地址重定位,即将程序搬移到RAN后进行的。之后 bootloader启动完毕,系统需要调转到OS去执行,用到了跳转物理地址,所以在这之前要关闭MMU,跳转完毕以后即可打开MMU,两次MMU映射的地址也是一样的。
|