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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章