|
这些天在看44B0的bootloader,对其把程序拷贝到RAM中运行的程序段(是不是叫伪地址重映射呢?)非常迷惑,希望各位高手解答一下,非常感谢!!!
adr r0, ResetEntry[/COLOR];获取加载到的程序的起始地址
ldr r1, BaseOfROM
cmp r0, r1 ;若程序加载起始地址与运行时RO底部相同则直接初始化RAM
ldreq r0, TopOfROM
beq InitRamData
ldr r2, =CopyProcBeg[/COLOR];获取CopyProcBeg在RAM中运行的地址
sub r1, r2, r1[/COLOR]
add r0, r0, r1[/COLOR] ;(CopyProcBeg)RAM-Ro_Base+(ResetEntry)ROM,,计算CopyProcBeg在Flash的地址。
ldr r3, =CopyProcEnd
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0 ;先把CopyProcBeg程序段拷到RAM中。
ldr r3, TopOfROM
ldr pc, =CopyProcBeg ;再跳转到RAM运行CopyProcBeg 拷贝其他程序到RAM
;*********************************************** **************************
CopyProcBeg
0
ldmia r0!, {r4-r11}
stmia r2!, {r4-r11}
cmp r2, r3
bcc %B0
CopyProcEnd
sub r1, r2, r3
sub r0, r0, r1
按照这个说法,假设程序是烧进Flash中正常运行的话,那么程序的上半段就是在Flash中运行的。那么,在红色部分,ldr r2, =CopyProcBeg和ldr r3, =CopyProcEnd加到寄存器的是什么值呢?我总认为应该是这两个标号在Flash中加载的地址值吧? 但是它却用sub r1, r2, r1 和add r0, r0, r1两条指令计算CopyProcBeg程序在Flash中的绝对地址,可见上面两条指令加到寄存器的值应该是两个地址标号在RAM中运行的地址,然而此时程序是在Flash中运行的,怎么可能得到在RAM中运行的地址呢?
第二个问题就是程序开始用adr r0, ResetEntry得到加载时程序起始地址,类似的,能不能用adr r0, CopyProcBeg之类的同样获得CopyProcBeg在Flash中的地址呢?还是没有理解adr到底怎么使用的。 |
|