Bootm命令用來從memory啟動內(nèi)核,bootm命令的執(zhí)行流程如下圖所示。
在串口終端輸入bootm命令后,執(zhí)行do_bootm函數(shù)來完成相應(yīng)的功能。Do_bootm函數(shù)首先調(diào)用bootm_start函數(shù)。(如果不輸入,應(yīng)該也有。)
Bootm_start函數(shù)的主要作用是獲取內(nèi)核映像文件的相關(guān)信息,并保存到全局變量images中,image是struct bootm_headers結(jié)構(gòu)類型,用來保存可執(zhí)行內(nèi)核映像的相關(guān)信息,主要包括內(nèi)核映像的加載地址、起始地址、可執(zhí)行入口地址等。
獲取內(nèi)核映像的相關(guān)信息是為后面的加載內(nèi)核做準(zhǔn)備;
內(nèi)核可執(zhí)行映像文件頭包含了這些信息,這是通過工具mkimage加上去的。接下來執(zhí)行bootm_load_os函數(shù)。
if (load !=image_start) {
memmove_wd ((void *)load,
(void *)image_start, image_len, CHUNKSZ);
}
Image_start是不包括內(nèi)核映像文件頭的內(nèi)核起始位置,也就是zImage的起始位置。
內(nèi)核加載完成后,下面開始執(zhí)行內(nèi)核映像,這是通過調(diào)用函數(shù)do_bootm_linux來實(shí)現(xiàn)的,下面來看do_bootm_linux的執(zhí)行過程。
Do_bootm_linux首先驅(qū)動內(nèi)核的入口地址,代碼如下所示。
theKernel=(void (*)(int, int, uint))images- >ep;
Images.ep為內(nèi)核可執(zhí)行映像文件的入口地址及zImage的起始地址,它是從內(nèi)核映像文件頭獲取的,在前面的bootm_start函數(shù)中已經(jīng)為它賦值,代碼如下所示。
images.ep=image_get_ep (&images.legacy_hdr_os_copy);
如果需要,準(zhǔn)備給內(nèi)核傳遞的啟動參數(shù),然后獲取啟動內(nèi)核需要的兩個參數(shù):machid和傳遞給內(nèi)核參數(shù)的位置,這兩個參數(shù)都保存在全局?jǐn)?shù)據(jù)結(jié)構(gòu)體變量bd的成員變量中,如下所示。
bd- >bi_boot_params
machid=bd- >bi_arch_number;
最后調(diào)用內(nèi)核映像的第一個可執(zhí)行函數(shù),把控制權(quán)移交給內(nèi)核,代碼如下所示。
theKernel (0, machid, bd- >bi_boot_params);
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1416瀏覽量
41445 -
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213847 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64907 -
Uboot
+關(guān)注
關(guān)注
4文章
129瀏覽量
29102
發(fā)布評論請先 登錄
Linux內(nèi)核自解壓過程分析

Uboot的命令之間有什么區(qū)別?
CAD中如何快速重復(fù)執(zhí)行命令?
mfc程序執(zhí)行流程小結(jié),MFC程序的執(zhí)行順序

虛擬機(jī):Bash Shell腳本打印出執(zhí)行的命令
linux技術(shù):WAF運(yùn)行命令執(zhí)行方法
使用匿名管道技術(shù)獲取CMD命令的執(zhí)行結(jié)果
LabVIEW中執(zhí)行系統(tǒng)命令VI介紹

Linux命令執(zhí)行Bypass常見姿勢介紹

Linux命令執(zhí)行Bypass常見姿勢

通過語音控制執(zhí)行系統(tǒng)命令

Uboot命令實(shí)現(xiàn)大致流程圖

uboot命令的執(zhí)行過程是什么
cmd_tbl_t結(jié)構(gòu)體變量調(diào)用命令信息

評論