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