02.07.2013 Views

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

对于mov指令的操作数的取值范围,请参见后面内容:<br />

mov指令的操作数的取值范围到底是多少<br />

【总结】<br />

adr r0, _start<br />

的伪代码,被翻译成实际汇编代码为:<br />

33d000a4: e24f00ac sub r0, pc, #172 ; 0xac<br />

其含义就是,通过计算PC+8-172 => _start的地址,<br />

而_start的地址,即相对代码段的0地址,是这个地址在运行时刻的值,而当ARM920T加电启<br />

动后,,此处是从Nor Flash启动,对应的代码,也是在Nor Flash中,对应的物理地址是0x0,<br />

所以,此时_start的值就是0,而不是0x33d00000。<br />

所以,此时:<br />

r0 = 0x0<br />

ldr r1, _TEXT_BASE /* test if we run from flash or RAM */<br />

这里的_TEXT_BASE的含义,前面已经说过了,那就是:<br />

“_TEXT_BASE:<br />

.word TEXT_BASE<br />

得知,地址为_TEXT_BASE的内存中的内容,就是<br />

u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\board\EmbedSky\config.mk<br />

中的:<br />

TEXT_BASE = 0x33D00000”<br />

所以,此处就是<br />

r1 = 0x33D00000<br />

cmp r0, r1 /* don't reloc during debug */<br />

beq clear_bss<br />

这两句很简单,就是比较r0和r1。而<br />

r0 = 0x0<br />

r1 = 0x33D00000<br />

所以不相等,因此beq发现两者不相等,就不会去跳转到clear_bss,不会去执行对应的将bss<br />

段清零的动作了。<br />

ldr r2, _armboot_start<br />

ldr r3, _bss_start<br />

这两行代码意思也很清楚,分别装载_armboot_start和_bss_start地址中的值,赋值给r2<br />

和r3.<br />

而_armboot_start和_bss_start的值,前面都已经提到过了,就是:<br />

┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳<br />

.globl _armboot_start

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!