ldr r2, _armboot_start ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
这两行代码意思也很清楚,分别装载_armboot_start和_bss_start地址中的值,赋值给r2和r3 而_armboot_start和_bss_start的值,前面都已经提到过了,就是:
.globl _armboot_start
_armboot_start:
.word _start
.globl _bss_start
_bss_start:
.word __bss_start
而其中的_start,是我们uboot的代码的最开始的位置,而__bss_start的值,是在
中的:
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
...
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
...
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
所以,可以看出,__bss_start的位置,是bss的start开始位置,同时也是text+rodata+data的结束位置,即代码段,只读数据和已初始化的可写的数据的最末尾的位置。 其实我们也可以通过前面的方法,objdump出来,看到对应的值:
33d00048 <_bss_start>:
33d00048: 33d339d4 .word 0x33d339d4
是0x33d339d4。
| ||||
此处的意思就很清楚了,就是r2 = r3-r2,计算出 text + rodata + data 的大小,即整个需要载入的数据量是多少,用于下面的函数去拷贝这么多的数据到对应的内存的位置。 这里的实际的值是 r2 = r3 –r2 = 0x33d339d4 - 0x33d00000 = 0x000339d4
|






![[注意]](https://www.crifan.com/files/res/docbook/images/note.png)

