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.

而关于_bss_start和_bss_end定义为.glogl即全局变量,是因为uboot的其他源码中要用<br />

到这两个变量,详情请自己去搜索源码。<br />

.globl FREE_RAM_END<br />

FREE_RAM_END:<br />

.word 0x0badc0de<br />

.globl FREE_RAM_SIZE<br />

FREE_RAM_SIZE:<br />

.word 0x0badc0de<br />

关于FREE_RAM_END和FREE_RAM_SIZE,这里只是两个标号,之所以也是声明为全局变量,是<br />

因为uboot的源码中会用到这两个变量。<br />

但是这里有点特别的是,这两个变量,将在本源码start.S中的后面要用到,而在后面用到这<br />

两个变量之前,uboot的C源码中,会先去修改这两个值,具体的逻辑是:<br />

本文件start.S中,后面有这两句:<br />

ldr pc, _start_armboot<br />

_start_armboot: .word start_armboot<br />

意思很明显,就是去调用start_armboot函数。<br />

而start_armboot函数是在:<br />

u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\lib_arm\board.c<br />

中:<br />

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

init_fnc_t *init_sequence[] = {<br />

。。。<br />

};<br />

cpu_init, /* basic cpu dependent setup */<br />

NULL,<br />

void start_armboot (void)<br />

{<br />

。。。<br />

init_fnc_t **init_fnc_ptr;<br />

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {<br />

}<br />

。。。<br />

}<br />

if ((*init_fnc_ptr)() != 0) {<br />

}<br />

hang ();

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

Saved successfully!

Ooh no, something went wrong!