入口:開機(jī)自動啟動
出口:啟動內(nèi)核
Uboot的本質(zhì)就是一個(gè)裸機(jī)程序,和在裸機(jī)下開發(fā)出來得到的xxx.bin并沒有本質(zhì)區(qū)別。唯一的區(qū)別就是uboot比較大,一般在180k-400k之間。并且功能比較復(fù)雜。
Uboot本身是一個(gè)開源項(xiàng)目,由若干個(gè).c文件和.h文件組成,配置編譯之后會生產(chǎn)一個(gè)uboot.bin,這就是uboot這個(gè)裸機(jī)程序的鏡像文件。然后這個(gè)鏡像文件被合理的燒錄到啟動介質(zhì)中去拿給soc啟動。也就是說uboot在沒有運(yùn)行時(shí)表現(xiàn)為uboot.bin,一般放在啟動介質(zhì)中。
Uboot運(yùn)行時(shí)會被加載到內(nèi)存中然后一條一條指令的拿給CPU執(zhí)行。
Uboot啟動后,會提供一個(gè)shell界面,可以進(jìn)行人機(jī)交互
該shell和操作系統(tǒng)下的shell是很像的,只是命令集不一樣
Uboot啟動后大部分時(shí)間和工作都是在shell下完成的(例如uboot要部署系統(tǒng)要在shell下輸命令、要設(shè)置環(huán)境變量也得在命令行下,要啟動內(nèi)核也是在命令行下)
命令就是uboot的shell中可以識別的各種命令。Uboot中有幾十個(gè)命令,其中有一些是常用另一些不常用(還可以自己給uboot添加命令)
Uboot的環(huán)境變量和操作系統(tǒng)的環(huán)境變量工作原理和方式幾乎完全相同。Uboot在設(shè)計(jì)時(shí)借用了操作系統(tǒng)的環(huán)境變量。
環(huán)境變量就是運(yùn)行時(shí)的配置屬性。系統(tǒng)的全部環(huán)境變量是系統(tǒng)內(nèi)置的。系統(tǒng)可以通過讀取環(huán)境來指導(dǎo)程序的運(yùn)行,這樣的設(shè)計(jì)的好處是靈活,使程序更改運(yùn)行方式,可以不用去修改程序代碼進(jìn)行編譯運(yùn)行,只要修改相應(yīng)的環(huán)境變量就可以了。
有些命令可以簡化,如print和printenv,set和setenv
有些命令要帶參數(shù),如setenv后面要帶參數(shù)
命令中的雙引號,uboot的有些命令非常長,為了告訴uboot這個(gè)較長的而且中間是有空格的字符串是命令的一個(gè)參數(shù)
如 set name “weiqi 7777 lujun”,設(shè)置一個(gè)變量name,變量值是weiqi 7777 lujun
有一些命令是一個(gè)命令族(譬如movi)
命令族就是好多個(gè)命令的開頭都是同一個(gè)命令關(guān)鍵字的,但是后面的參數(shù)不一樣,這個(gè)命令的功能和作用也不同。
同一個(gè)命令族中的所有的命令都有極大的關(guān)聯(lián),譬如movi開頭的命令族都和moviNand(EMMC,iNand)操作有關(guān)。
Print命令不帶參數(shù),作用是打出系統(tǒng)中所有的環(huán)境變量
設(shè)置(添加/更改)環(huán)境變量
后面帶一個(gè)參數(shù),表示刪除這個(gè)環(huán)境變量
后面帶兩個(gè)參數(shù),表示添加/修改這個(gè)環(huán)境變量的值為第二個(gè)參數(shù)
保存環(huán)境變量,將內(nèi)存中的環(huán)境變量的值同步保存到FLASH中環(huán)境變量的分區(qū)。
環(huán)境變量的保存是整體的覆蓋保存,也就是說內(nèi)存中所有的環(huán)境變量都會整體的將FLASH中環(huán)境變量分區(qū)中原來的內(nèi)容整體覆蓋。
開發(fā)板網(wǎng)絡(luò)測試命令,和PC機(jī)的命令使用一樣
注意,開發(fā)板和電腦對插上網(wǎng)線,先ping通主機(jī)windows,不過windows的ip地址是本地連接的ip地址,可以將該地址更改為192.168.1.10。確定開發(fā)板中uboot的環(huán)境變量,ethaddr(隨便設(shè)置),netmask(255.255.255.0),ipaddr(表示當(dāng)前開發(fā)板的ip地址,要設(shè)置為同PC一個(gè)網(wǎng)段,可以設(shè)置為192.168.1.77)
如果是使用路由器,開發(fā)板和PC都連上路由器,只需要將開發(fā)板的ipaddr設(shè)置和PC同一個(gè)網(wǎng)段即可
下載指令,從網(wǎng)絡(luò)下載文件到內(nèi)存中
使用格式 tftf 內(nèi)存地址 文件名字
如 tftp 0x30000000 zImage-qt 將服務(wù)器上zImage-qt文件下載到開發(fā)板的內(nèi)存0x30000000上
要使uboot的serverip為tftp服務(wù)器的ip地址
SD卡/iNand/EMMC操作指令
movi是一個(gè)命令集,有很多子命令
movi指令都是movi read和movi write一組,movi read從iNand中讀取內(nèi)容到內(nèi)存中,movi write將內(nèi)存數(shù)據(jù)寫入到iNand中
movi read u-boot 0x30000000,把iNand中的u-boot分區(qū)讀出到內(nèi)存的0x30000000起始的位置處。(uboot代碼將iNand分成了很多分區(qū),每個(gè)分區(qū)有地址范圍和分區(qū)名,uboot程序操作中可以直接使用地址來操作iNand分區(qū),也可以使用分區(qū)名來操作分區(qū))
操作nandflash,和movi操作基本一樣,不過九鼎的uboot中去掉了這個(gè)指令
內(nèi)存不像FLASH有分區(qū),只有地址,操作時(shí)注意不能越界。
Uboot是一個(gè)裸機(jī)程序,不像操作系統(tǒng)會由系統(tǒng)整體管理所有內(nèi)存,系統(tǒng)負(fù)責(zé)分配和管理,系統(tǒng)會保證內(nèi)存不會越界。但是裸機(jī)程序uboot并不管理內(nèi)存,內(nèi)存是隨便可以使用,所以使用uboot時(shí),內(nèi)存地址要使用正確。
md,顯示內(nèi)存區(qū)域數(shù)據(jù), .b 以字節(jié)顯示, .w 以半字顯示, .l 以字顯示
mw,memory write將數(shù)據(jù)寫入到內(nèi)存
mm,memory modify,修改內(nèi)存中的某一塊,地址會自動增加。修改結(jié)束,輸入y結(jié)束。
Uboot的終極目標(biāo)就是啟動內(nèi)核,啟動內(nèi)核在uboot中表現(xiàn)為一個(gè)指令,uboot命令行中調(diào)用這個(gè)指令就會啟動內(nèi)核
差別,bootm啟動內(nèi)核同時(shí)給內(nèi)核傳參,而go命令啟動內(nèi)核不傳參。
go命令內(nèi)部其實(shí)就是一個(gè)函數(shù)指針指向一個(gè)內(nèi)存地址然后直接調(diào)用那個(gè)函數(shù)。所以go命令的實(shí)質(zhì)就是PC直接跳轉(zhuǎn)到一個(gè)內(nèi)存地址去運(yùn)行。go命令可以在uboot中執(zhí)行裸機(jī)程序。
環(huán)境變量有2份,一份在FLASH中,另一份在內(nèi)存中。uboot開機(jī)時(shí)一次性從FLASH中讀取全部環(huán)境變量到內(nèi)存中作為環(huán)境變量的初始值,然后使用過程中是用內(nèi)存中這一份,用戶可以用saveenv命令將內(nèi)存中的環(huán)境變量保存到FLASH的環(huán)境變量,實(shí)現(xiàn)更新。
環(huán)境變量在uboot中是用字符串表示的。uboot按照字符匹配的方式來區(qū)分各個(gè)環(huán)境變量。
變量
自動運(yùn)行倒數(shù)時(shí)間:bootdelay
ipaddr,開發(fā)板的本地IP地址
serverip是開發(fā)板通過tftp指令去tftp服務(wù)器下載文件時(shí)的tftp服務(wù)器的IP地址
gatewayip是開發(fā)板的本地網(wǎng)關(guān)地址
netmask是子網(wǎng)掩碼
ethaddr是開發(fā)板的本地網(wǎng)卡的MAC地址
bootcmd,啟動運(yùn)行命令
uboot啟動后,會進(jìn)行倒數(shù)bootdelay時(shí)間,如果中間沒有被打斷,uboot會自動執(zhí)行啟動命令。
uboot開機(jī)自動啟動時(shí)機(jī)就是在內(nèi)部執(zhí)行了bootcmd這個(gè)環(huán)境變量的值所對應(yīng)的命令集。
bootargs,uboot給kernel傳遞的參數(shù)
linux內(nèi)核啟動時(shí)可以接收uboot給他傳遞的啟動參數(shù),這些啟動參數(shù)是uboot和內(nèi)核約定好的形式、內(nèi)容,linux內(nèi)核在這些啟動參數(shù)的指導(dǎo)下完成啟動過程。這樣的設(shè)計(jì)是為了靈活,為了內(nèi)核在不重新編譯的情況下可以用不同的方式啟動
在uboot的環(huán)境變量中設(shè)置bootargs,然后bootm命令啟動內(nèi)核是會自動將bootargs傳給內(nèi)核
bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
console=ttySAC2,115200,控制臺使用串口2,波特率115200。
root=/dev/mmcblk0p2 rw 根文件系統(tǒng)在SD卡端口0設(shè)置(iNand)第二分區(qū),可讀可寫
init=/linuxrc linux的進(jìn)程1(init進(jìn)程)的路徑
rootfstype=ext3 指根文件系統(tǒng)的類型為ext3
d) 內(nèi)核傳參非常重要,內(nèi)核移植,如果傳值不正確,會造成內(nèi)核啟動不起來
a) 所謂分區(qū),也就是對FLASH進(jìn)行分塊管理
b) Uboot中沒有操作系統(tǒng),因此需要自己對FLASH進(jìn)行管理,所以需要實(shí)現(xiàn)對FLASH進(jìn)行分區(qū)界定,有了這個(gè)界定,在部署系統(tǒng)是按照分區(qū)界定方法來部署,uboot和kernel的軟件也是按照這個(gè)分區(qū)界定來工作。
c) 分區(qū)方法不是固定的,是可以變動的,但是在一個(gè)移植中必須先設(shè)計(jì)好,然后使用統(tǒng)一的分區(qū)。標(biāo)準(zhǔn):
l Uboot:必須從FLASH起始地址開始存放(也許是扇區(qū)0,也許是扇區(qū)1,也許是其他,取決于Soc啟動設(shè)計(jì),如210從扇區(qū)1開始),uboot的分區(qū)大小必須保證uboot能夠放下,一般設(shè)置為512KB或1MB。
l 環(huán)境變量: 環(huán)境變量分區(qū)一般緊貼著uboot存放,大小為32KB或者更多
l Kernel: 可以緊貼環(huán)境變量,大小一般為3MB或5MB或其他。
l 根文件系統(tǒng): 緊貼著kernel,大小得看情況
l 自由分區(qū): kernel啟動后,將自由分區(qū)掛在到rootfs下使用
DDR的分區(qū)和FLASH的分區(qū)不同,因?yàn)?/span>FLASH是掉電存在的,而DDR是掉電丟失的,所以DDR是每次系統(tǒng)運(yùn)行時(shí)開開始部署的。
內(nèi)存的分區(qū),主要是在linux啟動之前進(jìn)行分區(qū),linux內(nèi)核啟動后內(nèi)核的內(nèi)存管理模塊會接管整個(gè)內(nèi)存空間,這個(gè)時(shí)候我們就不需要管理了。
內(nèi)存分區(qū)關(guān)鍵就在于內(nèi)存中那一塊用來干什么必須分配好,以避免各個(gè)不同功能使用了同一塊內(nèi)存造成的數(shù)據(jù)影響。
聯(lián)系客服