uboot引導過程

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);      //若是延時大於等於零,而且沒有在延時過程當中接收到按鍵,則引導內核。

}

}

相關文章
相關標籤/搜索