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 _TEXT_BASE: .word TEXT_BASE 而其中的_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
|