u boot和Linux核心之間的引數傳遞

2021-08-08 02:12:14 字數 2142 閱讀 9998

今天學了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...