uboot引导kernel - 3 -uboot给内核传参详解
uboot中執(zhí)行theKernel函數(shù)后,kernel正式啟動(dòng)。如下函數(shù),我們發(fā)現(xiàn)有3個(gè)參數(shù)。
1. 參數(shù) 0;
2. 參數(shù)machid;
如下code 中獲取machid, gd是個(gè)全局變量.
2.1 bi_arch_number是board_info中的一個(gè)元素,含義是:開發(fā)板的機(jī)器碼。所謂機(jī)器碼就是uboot給這個(gè)開發(fā)板定義的一個(gè)唯一編號(hào)。
2.2 機(jī)器碼的主要作用就是在uboot和linux內(nèi)核之間進(jìn)行比對(duì)和適配. uboot中配置的這個(gè)機(jī)器碼,會(huì)作為uboot給linux內(nèi)核的傳參的一部分傳給linux內(nèi)核,內(nèi)核啟動(dòng)過程中會(huì)比對(duì)這個(gè)接收到的機(jī)器碼,和自己本身的機(jī)器碼相對(duì)比,如果相等就啟動(dòng),如果不相等就不啟動(dòng).
2.3 linux做了個(gè)設(shè)置:給每個(gè)開發(fā)板做個(gè)唯一編號(hào)(機(jī)器碼),然后在uboot、linux內(nèi)核中都有一個(gè)軟件維護(hù)的機(jī)器碼編號(hào)。然后開發(fā)板、uboot、linux三者去比對(duì)機(jī)器碼,如果機(jī)器碼對(duì)上了就啟動(dòng),否則就不啟動(dòng)(因?yàn)檐浖J(rèn)為我和這個(gè)硬件不適配)。
3. 參數(shù) bd->bi_boot_params;
3.1 即gd->bd->bi_boot_params
bd_info中另一個(gè)主要元素,bi_boot_params表示uboot給linux kernel啟動(dòng)時(shí)的傳參的參數(shù)所在DDR內(nèi)存地址。
根據(jù)以上code可以知道在下x210中g(shù)d->bd->bi_boot_params等于 0x3000 0100, 這個(gè)內(nèi)存地址就被分配用來(lái)做內(nèi)核傳參了.
uboot給linux內(nèi)核傳參的時(shí)候是這么傳的:uboot事先將準(zhǔn)備好的傳參(字符串,就是bootargs)放在內(nèi)存的一個(gè)地址處(就是bi_boot_params),然后uboot就啟動(dòng)了內(nèi)核(uboot在啟動(dòng)內(nèi)核時(shí)真正是通過寄存器r0 r1 r2來(lái)直接傳遞參數(shù)的,其中有一個(gè)寄存器中就是bi_boot_params)。內(nèi)核啟動(dòng)后從寄存器r2中讀取bi_boot_params就知道了uboot給我傳遞的參數(shù)到底在內(nèi)存的哪里。然后自己去內(nèi)存的那個(gè)地方去找bootargs。
3.2 傳遞參數(shù)詳解:a list of tagged entries
tag list方式傳參,
- struct tag,tag是一個(gè)數(shù)據(jù)結(jié)構(gòu),在uboot和linux kernel中都有定義tag數(shù)據(jù)機(jī)構(gòu),而且定義是一樣的。
- tag_header中有這個(gè)tag的size和類型編碼,kernel拿到一個(gè)tag后先分析tag_header得到tag的類型和大小,然后將tag中剩余部分當(dāng)作一個(gè)tag_xxx來(lái)處理。
- tag_start與tag_end。kernel接收到的傳參是若干個(gè)tag構(gòu)成的,這些tag由tag_start起始,到tag_end結(jié)束.
bootargs舉例:
bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
console=ttySAC2,115200 控制臺(tái)使用串口2,波特率115200.
root=/dev/mmcblk0p2 rw 根文件系統(tǒng)在SD卡端口0設(shè)備(iNand)第2分區(qū),根文件系統(tǒng)是可讀可寫的
init=/linuxrc linux的進(jìn)程1(init進(jìn)程)的路徑
rootfstype=ext3 根文件系統(tǒng)的類型是ext3
內(nèi)存配置舉例:
如何在uboot運(yùn)行中得知uboot的DDR配置信息?uboot中有一個(gè)命令叫bdinfo,這個(gè)命令可以打印出gd->bd中記錄的所有硬件相關(guān)的全局變量的值,因此可以得知DDR的配置信息。
DRAM bank = 0x00000000
-> start = 0x30000000
-> size = 0x10000000
DRAM bank = 0x00000001
-> start = 0x40000000
-> size = 0x10000000
4. 根文件系統(tǒng)(root=)和進(jìn)程1(init=)
4.1 根文件系統(tǒng)的作用:
? 根文件系統(tǒng)提供根目錄。
? 進(jìn)程1存放在根文件系統(tǒng)中
? 內(nèi)核啟動(dòng)最后會(huì)去裝載根文件系統(tǒng)。
總結(jié):根文件系統(tǒng)為操作系統(tǒng)啟動(dòng)提供了很多必備的資源:根目錄、進(jìn)程1. 根文件系統(tǒng)在bootargs 中用root= 來(lái)指定根文件系統(tǒng)在哪里的。一般格式是:root=/dev/xxx
(如果是nandflash,則root=/dev/mtdblock2,
如果是inand/sd, 則root=/dev/mmcblk0p2,表示mmc0的第2個(gè)分區(qū))
**遺留問題: 存儲(chǔ)介質(zhì)中的分區(qū)表uboot怎么告訴kernel呢 **?
如果是nfs的rootfs,則root=/dev/nfs (網(wǎng)絡(luò)文件系統(tǒng))
一套linux體系,只有內(nèi)核本身是不能工作的,必須要rootfs(上的etc目錄下的配置文件、/bin /sbin等目錄下的shell命令,還有/lib目錄下的庫(kù)文件等???)相配合才能工作. 幾乎可以認(rèn)為:發(fā)行版=內(nèi)核+rootfs
4.2 進(jìn)程1-liunxrc
? /linuxrc是一個(gè)可執(zhí)行的應(yīng)用程序
? /linuxrc執(zhí)行時(shí)引出用戶界面, 進(jìn)程1(init進(jìn)程,也就是/linuxrc)是其他所有應(yīng)用程序進(jìn)程的祖宗進(jìn)程
? /linuxrc負(fù)責(zé)系統(tǒng)啟動(dòng)后的配置(/etc)
? /linuxrc在嵌入式linux中一般就是busybox
busybox這個(gè)程序開發(fā)出來(lái)就是為了在嵌入式環(huán)境下構(gòu)建rootfs使用的,也就是說他就是專門開發(fā)的init進(jìn)程應(yīng)用程序. busybox為當(dāng)前系統(tǒng)提供了一整套的shell命令程序集。譬如vi、cd、mkdir、ls等.
總結(jié)
以上是生活随笔為你收集整理的uboot引导kernel - 3 -uboot给内核传参详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uboot引导kernel - 2- u
- 下一篇: 开头是万的成语有哪些啊?