1.4.6. cal armboot size from _armboot_start

	1ldr	r2, _armboot_start
	ldr	r3, _bss_start
	2sub	r2, r3, r2		/* r2 <- size of armboot            */
        

1

这两行代码意思也很清楚,分别装载_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的值,是在

u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\board\EmbedSky\u-boot.lds

中的:

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 = _start = 0x33d00000

r3 =__bss_start = 0x33d339d4

2

此处的意思就很清楚了,就是r2 = r3-r2,计算出

text + rodata + data

的大小,即整个需要载入的数据量是多少,用于下面的函数去拷贝这么多的数据到对应的内存的位置。

这里的实际的值是

r2

= r3 –r2

= 0x33d339d4 - 0x33d00000

= 0x000339d4

[注意]注意

【总结】

到此刻位置,假定是从Nor Flash启动的话:

r0 = 0x0 = 我们代码此刻所在的位置

r1 = 0x33D00000 = 我们想要把我们的代码放到哪里

r2 = 0x000339d4 = 对应的代码的大小(此处的代码 = text + rodata + data)