今天學了u_boot和linux核心之間的引數傳遞,分享一下,寫得不好勿怪......
u_boot完成的硬體的相關初始化,是知道linux核心的相關資訊的,但是linux是直接被載入到記憶體中去的,剛開始對u_boot是一臉懵逼的,那怎麼辦呢?當然是u_boot告訴linux核心一些資訊,這就是所謂的引數傳遞。
u_boot主要傳遞給linux核心3個引數:
r0:0x0
r1 : 開發板的id ------------------ r1的引數,是讓linux核心自己去判斷,它是否支援當前的開發板
r2 : 其他引數在記憶體中開始的位址
r2傳遞的開始位址中含有的資訊
(1)記憶體的資訊 -------- 記憶體的開始位址和記憶體的大小
(2)命令列引數:bootargs的內容--------------- 告訴linux核心啟動後,掛載檔案系統的方式(例如:nfs方式)
(3)其他資訊
r2只傳遞了開始的位址,並沒有告訴linux核心傳遞的引數記憶體的大小,那linux核心是怎麼知道什麼時候結束的呢?
u_boot和linux核心早就談好了的,我們規定格式,雙方按照規矩來辦事。
目前linux核心支援哪些格式的傳遞呢?
(1):通過struct parm_struct結構體來傳遞 (linux 2.6之前使用的方式,已經過時,不便於擴充套件)
(2):通過tag列表來傳遞 (linux 2.6開始使用的方式) -------- 乙個tag節點包含了tag頭 + 大小 + 內容
(3):通過裝置樹來傳遞(linux 3.0開始使用的方式) ----- u_boot 修改了裝置樹的節點,把需要傳遞的資訊放在了裝置樹中
我的環境是:linux核心版本----3.2.0-29-generic-pae
ubuntu版本是12.04-1
下面是部分原始碼,大家想看原始碼的可以去u_boot下的arch/arm/lib/bootm.c檢視(這是我的u_boot的路徑,不同的核心或者bootloader都可能不同)
/* main entry point for arm bootm implementation
* * modeled after the powerpc implementation
* difference: instead of calling prep and go at the end
* they are called if subcommand is equal 0.
*/int do_bootm_linux(int flag, int argc, char *argv, bootm_headers_t *images)
if (flag & bootm_state_os_go)
boot_prep_linux(images);
boot_jump_linux(images);
return 0;
}/* subcommand: prep */
static void boot_prep_linux(bootm_headers_t *images)
} else
#endif
/* subcommand: go */
static void boot_jump_linux(bootm_headers_t *images)
debug("## transferring control to linux (at address %08lx)" \
"...\n", (ulong) kernel_entry);
bootstage_mark(bootstage_id_run_os);
announce_and_cleanup();
#ifdef config_of_libfdt
if (images->ft_len)
r2 = (unsigned long)images->ft_addr;
else
#endif
r2 = gd->bd->bi_boot_params;
kernel_entry(0, machid, r2);
}
編譯U boot和Linux核心的步驟和詳解
linux核心和uboot的原始碼包 6818gec.tar.gz 環境 vmware12.0 ubuntu16.04 64位 1 先將 6818gec.tar.gz 放在ubuntu的共享目錄下,然後將 6818gec.tar.gz 拷貝到家目錄下進行解壓。解壓命令 gec ubuntu tar ...
uboot分析 uboot啟動核心
u boot啟動核心概述 u boot啟動完成後,最終進入到main loop 迴圈中。若在bootdelay倒計時為0之前,u boot控制台有輸入,則進入命令解析 執行的迴圈 若控制台無輸入,u boot將啟動核心。u boot啟動核心可歸結為以下四個步驟 1 將核心搬移至ddr中 2 校驗核心...
uboot啟動核心
假設bootcmd nand read.jffs2 0x30007fc0 kernel bootm 0x30007fc0 1 nand read.jffs2 0x30007fc0 kernel nand read.jffs2 0x30007fc0 kernel 從nand讀出核心 從 讀?從kern...