x-loader启动过程分析

平台:omap zoom2
1: 从连接文件开始分析: board/omap3430labrador/x-load.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/omap3/start.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
可以看到入口地址是_start,在start.s文件中。
2:进入start.s文件:
里面对CPU进行适当的初始化。
最后跳到C代码中。
ldr pc, _start_armboot /* jump to C code */
文件中频繁出现的TEXT_BASE,_start是目标文件的入口地址。
TEXT_BASE通过 config.mk 中的 -Ttext $(TEXT_BASE) 来指定链接选项,从而更新链接脚本中的入口地址。
//_start : 这是 u-boot 的第一条指令入口地址 , 如果从 flash 启动,就是 0x0, 如果直接下载到 SDRAM 中执行,则是 TEXT_BASE
3:进入start_armboot函数(lib/board.c)
执行一系列的初始化函数
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
4:判断从mmc,nand,onenand,uart等加载uboot文件。
unsigned long offset = CFG_LOADADDR;
size = file_fat_read("u-boot.bin", (unsigned char *)offset, 0);
最后执行之 ((init_fnc_t *)CFG_LOADADDR)();
5:进入uboot.

发布了47 篇原创文章 · 获赞 235 · 访问量 28万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章