u-boot源代碼的目錄結構
一、board中存放於開發板相關的配置文件,每個開發板都以子文件夾的形式出現。
二、Commom文件夾實現u-boot行下支持的命令,每個命令對應一個文件。
三、cpu中存放特定cpu架構相關的目錄,每一款cpu架構都對應了一個子目錄。
四、Doc是文檔目錄,有u-boot很是完善的文檔。
五、Drivers中是u-boot支持的各類設備的驅動程序。
六、Fs是支持的文件系統,其中最經常使用的是JFFS2文件系統。
七、Include文件夾是u-boot使用的頭文件,還有各類硬件平臺支持的彙編文件,系統配置文件和文件系統支持的文件。數組
八、lib_xxx與體系結構相關的庫文件。如ARM相關的庫放在lib_arm目錄下。
九、Net是與網絡協議相關的代碼,bootp協議、TFTP協議、NFS文件系統得實現。
十、Tooles是生成U-boot的工具。網絡
start.S -> start_armboot () -> main_loop ()
main_loop()會調用abortboot (bootdelay)判斷在delay time內有沒有鍵按下,並給出「Hit any key to stop autoboot」,若沒有鍵按下則run_command (s, 0)(s爲默認的bootcmd)。這裏默認的bootcmd須要根據內核的位置設置,若bootcmd未賦值,Uboot就會一直等待。若是敲入bootm,也會啓動kernel,而且傳入參數。若是使用tftp從pc中下載kernel並啓動也是能夠的。架構
cpu/arm920t/start.S:(代碼就不展開,簡單介紹)函數
.globl _start
_start: b start_code //set the cpu to SVC32 mode
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
工具
...
oop
start_code: /*set the cpu to SVC32 mode */fetch
...spa
relocate: /* relocate U-Boot to RAM 將uboot複製到ram */指針
...
stack_setup: /* Set up the stack 設置程序棧 */
code
...
ldr pc, _start_armboot //執行_start_armboot,第一個C函數
_start_armboot: .word start_armboot
...
lib_arm/broad.c:
start_armboot 是U-Boot 執行的第一個C 語言函數,完成系統初始化工做,進入主循環,處理用戶輸入的命令。
void start_armboot (void)
{
...
gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
...
/* 順序執行init_sequence 數組中的初始化函數 */
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
/* initialize environment */
env_relocate ();
//各類初始化...
...
/* Initialize from environment 經過環境變量初始化 */
if ((s = getenv ("loadaddr")) != NULL) {
load_addr = simple_strtoul (s, NULL, 16);
}
...
/* main_loop()循環不斷執行 */
for (;;) {
main_loop ();
}
}
init_sequence[]數組保存着基本的初始化函數指針。
init_fnc_t *init_sequence[] = {
cpu_init, /* 基本的處理器相關配置 -- cpu/arm920t/cpu.c */
board_init, /* 基本的板級相關配置 --board/smdk2410/smdk2410.c */
interrupt_init, /* 初始化例外處理 --cpu/arm920t/s3c24x0/interrupt.c */
env_init, /* 初始化環境變量 -- common/env_flash.c */
init_baudrate, /* 初始化波特率設置 -- lib_arm/board.c */
serial_init, /* 串口通信設置 -- cpu/arm920t/s3c24x0/serial.c*/
console_init_f, /* 控制檯初始化階段1 -- common/console.c */
display_banner, /* 打印u-boot 信息 -- lib_arm/board.c */
dram_init, /* 配置可用的RAM --board/smdk2410/smdk2410.c */
display_dram_config, /* 顯示RAM的配置大小 -- lib_arm/board.c */
NULL,
};
common/main.c:
void main_loop (void)
{
...
install_auto_complete();
s = getenv ("bootdelay");
s = getenv ("bootcmd");
if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
run_command (s, 0); //若是延時大於等於零,而且沒有在延時過程當中接收到按鍵,則引導內核。
}
}