CPU为 ARM926EJ
REDBOOT的TEXT段都在FLASH中运行,没有拷贝到RAM。而且
REDBOOT的TEXT段的编译地址为C0000000(虚地址)开始.
实际FLASH地址从00000000开始
实际程序烧写到00000000开始的FLASH。也就是实际程序从00000000开始
执行。
摘录一段与MMU初始化有关的启动代码(CACHE在之前已经使能): bl hal_mmu_init FAKE_LED_MACRO(6)
// Enable MMU ldr r2,=10f ldr r1,=MMU_Control_Init|MMU_Control_M mcr MMU_CP,0,r1,MMU_Control,c0 mov pc,r2 10: nop nop
hal_mmu_init是C语言函数,将00000000开始的FLASH 映射到C0000000空
间, mcr MMU_CP,0,r1,MMU_Control,c0 使能MMU。
mov pc,r2 实现绝对跳转,跳到标号10开始的地方,该地址是绝对地
址,也是虚拟地址。因为此时MMU已经初始化完成,从下一条指令开始,程序从虚拟地址(编译指定的地
址)开始运行。
现在对mov pc,r2 这条指令的执行有点疑问,因为这条指令是从00000000开始的FLASH取指,但在这条指令之前MMU已经初始化完成,00000000开始的空间已经不存在,我在想 mcr MMU_CP,0,r1,MMU_Control,c0执行时,应该mov pc,r2这条
指令 已经取指,所以MMU使能后,mov pc,r2能被执行。
不知道这样理解对不对? |