uboot啓動過程(代碼流程)
uboot啓動過程:
第一階段(彙編):(boot/fastboot/arch/arm/cpu/hi3798mx/start.S)//不同系統目錄位置可能不同
-------->.../* 硬件相關初始化 */
ldr pc, _start_armboot -->跳轉到第二階段
第二階段(C語言)
------->start_armboot():(boot/fastboot/arch/arm/lib/board.c)
設備外設的初始化
Android的recovery系統相關也在此。
logo顯示也放於此
...
main_loop():進入命令循環檢測
--------> (處理環境變量和控制檯人機交互)
1.生成環境變量mtdparts, 調用mtdparts_init
2.在啓動過程中
若無空格鍵按下則boot_zImage,即run_command(getenv("bootcmd"),0)--->讀取內核存儲位置
有空格鍵按下則 run_command("menu",0)
3.shell過程,讀取用戶的輸入並執行相應的命令
{
從控制檯獲得命令,保存在全局變量console_buffer中
解析命令行字符串,分割命令與參數,最後執行 run_command(...);
}
//*----------------------------------------------------------------------------------------------------------
run_command讀取控制檯bootcmd:
例如:bootcmd='sf read 1000000 100000 700000;bootm 1000000'
第一條命令 從flash上讀出內核 kernel是一個分區標誌
第二條命令 啓動命令指示了啓動地址:bootm addr
---------------------------------------------------------------------------------------------------------*//
進入run_command()中
---->find_cmd()在“u_boot_cmd”段找到bootm命令
---->"bootm"命令的執行函數爲do_bootm()
---->重啓函數表;
---->檢查是否有子命令;
---->bootm_start(cmdtp, flag, argc, argv)://獲取鏡像的信息並存入images
---->disable_interrupts();//禁用中斷
........
---->//將鏡像的數據從images.os.image_start複製到images.os.load 打印:Loading Kernel Image ... OK
bootm_load_os(images.os, &load_end, 1);
---->//根據操作系統的類型獲取引導操作系統的函數
boot_fn = boot_os[images.os.os];
---->boot_fn(0, argc, argv, &images);//調用do_bootm_linux
進入do_bootm_linux():獲取"bootargs"環境變量的值,最終將此值傳遞給linux內核.
---->void (*theKernel)(int zero, int arch, uint params);/* 第一個參數必須爲0,第二個參數爲機器類型,第三個參數爲傳遞給內核參數的其實地址0x1000000。 */ :定義
---->theKernel = (void (*)(int, int, uint))images->ep;//鏡像的入口地址處也就是需要執行的函數入口
.........//初始化傳遞給內核的標籤(tag)
---->printf ("\nStarting kernel ...\n\n");//引導內核之前最後一次打印信息。
---->theKernel (0, machid, bd->bi_boot_params);//跳到內核中執行
下面進入內核的啓動 !!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.