Bootm命令用來(lái)從memory啟動(dòng)內(nèi)核,bootm命令的執(zhí)行流程如下圖所示。
在串口終端輸入bootm命令后,執(zhí)行do_bootm函數(shù)來(lái)完成相應(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)類型,用來(lái)保存可執(zhí)行內(nèi)核映像的相關(guān)信息,主要包括內(nèi)核映像的加載地址、起始地址、可執(zhí)行入口地址等。
獲取內(nèi)核映像的相關(guān)信息是為后面的加載內(nèi)核做準(zhǔn)備;
內(nèi)核可執(zhí)行映像文件頭包含了這些信息,這是通過(guò)工具mkimage加上去的。接下來(lái)執(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)核映像,這是通過(guò)調(diào)用函數(shù)do_bootm_linux來(lái)實(shí)現(xiàn)的,下面來(lái)看do_bootm_linux的執(zhí)行過(guò)程。
Do_bootm_linux首先驅(qū)動(dòng)內(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)核傳遞的啟動(dòng)參數(shù),然后獲取啟動(dòng)內(nèi)核需要的兩個(gè)參數(shù):machid和傳遞給內(nèi)核參數(shù)的位置,這兩個(gè)參數(shù)都保存在全局?jǐn)?shù)據(jù)結(jié)構(gòu)體變量bd的成員變量中,如下所示。
bd- >bi_boot_params
machid=bd- >bi_arch_number;
最后調(diào)用內(nèi)核映像的第一個(gè)可執(zhí)行函數(shù),把控制權(quán)移交給內(nèi)核,代碼如下所示。
theKernel (0, machid, bd- >bi_boot_params);
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1372瀏覽量
40280 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209331 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62573 -
Uboot
+關(guān)注
關(guān)注
4文章
125瀏覽量
28214
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論