少抱怨,多实干;
分类:
2008-11-12 15:50:46
uboot1.1.6中的关于代码搬家这代程序的分析(仅个人理解):
//这中是我个人的暂时理解,可能有错的地方,希望知道的朋友能够指出,谢谢!
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
//_start是当前代码的开始地址,在flash中
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
//_TEXT_BASE是RAM中代码段的连接地址,下面就是要把flash中的代码搬到从这个地址开始的RAM中来 ,RAM中
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
//_armboot_start这是ARM处理器运行第一条指令的地址,这个应该在RAM中
ldr r3, _bss_start
//_bss_start代码段的结束地址,从_armboot_start到_bss_start这之间的代码应该是arm运行阶段一的代码,它应该被放入到RAM中
sub r2, r3, r2 /* r2 <- size of armboot */
//计算出RAM中初始阶段代码段的长度
add r2, r0, r2 /* r2 <- source end address */
//让这个长度与_start地址相加,而会得到另一个地址,从这个地址到上面的_start地址应该是要拷贝的代码
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop