难点:
_start当前代码的开始地址。
_armboot_start是在前面定义了,是第一条指令的运行地址。
容易:
_TEXT_BASE 代码段的链接地址。
_bss_start 在链接脚本U-Boot.lds中定义,是代码段的结束地址。
uboot代码中重定位部分代码分析:
***************************************
由于在relocate:代码后有 CopyCode2Ram这个C函数,所以要进行两个操作:
1、stack_setup: ....的栈安装在C函数调用之前
2、进入C函数之前要将_bss段进行清空操作。执行clear_bss操作。
代码如下:
/* Set up the stack */
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 */
.....
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
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 clear_bss
.....
#if 1
bl CopyCode2Ram /* r0: source, r1: dest, r2: size */
#else
......(后面的代码不会执行!!!)
copy_loop: (这部分代码也相当于CopyCode2Ram函数的作用)
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
#endif
****************************************
_start当前代码的开始地址。
_armboot_start是在前面定义了,是第一条指令的运行地址。
容易:
_TEXT_BASE 代码段的链接地址。
_bss_start 在链接脚本U-Boot.lds中定义,是代码段的结束地址。
uboot代码中重定位部分代码分析:
***************************************
由于在relocate:代码后有 CopyCode2Ram这个C函数,所以要进行两个操作:
1、stack_setup: ....的栈安装在C函数调用之前
2、进入C函数之前要将_bss段进行清空操作。执行clear_bss操作。
代码如下:
/* Set up the stack */
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 */
.....
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
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 clear_bss
.....
#if 1
bl CopyCode2Ram /* r0: source, r1: dest, r2: size */
#else
......(后面的代码不会执行!!!)
copy_loop: (这部分代码也相当于CopyCode2Ram函数的作用)
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
#endif
****************************************