2. 程序从第178行的bl cpu_init_crit返回后,进入如下这段代码:
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
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
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
现在问题是这样的:
a.这个代码是什么作用?
b. _TEXT_BASE只是个变量,没任何东西,怎么会和_start相等呢?
c. 进入beq stact_setup这句话在执行后,还会返回这里吗?pc值怎么处理的?如果进入了stack_setup,那等它执行完后去执行哪一句?
d. _start_armboot: .word start_armboot这句话是定义一个变量,那请问它是如何与start_armboot关联起来的?如何转去执行start_armboot.c这个文件?
TEXT_BASE是在链接时就确定的。
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
上面这段的r0和r1是会相等的。
因为r0存放的是_start运行处的地址,当代码段被拷贝到TEXT_BASE并执行以后,_start和_TEXT_BASE应该就会cmpeq。这时候就是我之前说的,开始在RAM中执行了。
引用 15 楼 tankdin 的回复:
TEXT_BASE是在链接时就确定的。
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc d……