uboot 是一個(gè)主要用于嵌入式系統(tǒng)的引導(dǎo)加載程序,可以支持多種不同的計(jì)算機(jī)系統(tǒng)結(jié)構(gòu),包括PPC、ARM、AVR32、MIPS、x86、68k、Nios與MicroBlaze。這也是一套在GNU通用公共許可證之下發(fā)布的自由軟件。
uboot 屬于bootloader的一種,是用來引導(dǎo)啟動(dòng)內(nèi)核的,它的最終目的就是,從flash中讀出內(nèi)核,放到內(nèi)存中,啟動(dòng)內(nèi)核,所以,由上面描述的,就知道,UBOOT需要具有讀寫flash的能力。
uboot剛開始被放到flash中,板子上電后,會(huì)自動(dòng)把其中的一部分代碼拷到內(nèi)存中執(zhí)行,這部分代碼負(fù)責(zé)把剩余的uboot代碼拷到內(nèi)存中,然后uboot代碼再把kernel部分代碼也拷到內(nèi)存中,并且啟動(dòng),內(nèi)核啟動(dòng)后,掛著根文件系統(tǒng),執(zhí)行應(yīng)用程序。
U-Boot的工作模式有啟動(dòng)加載模式和下載模式。啟動(dòng)加載模式是Bootloader的正常工作模式,嵌入式產(chǎn)品發(fā)布時(shí),Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統(tǒng)從FLASH中加載到SDRAM中運(yùn)行,整個(gè)過程是自動(dòng)的。下載模式就是Bootloader通過某些通信手段將內(nèi)核映像或根文件系統(tǒng)映像等從PC機(jī)中下載到目標(biāo)板的FLASH中。用戶可以利用Bootloader提供的一些命令接口來完成自己想要的操作。
uboot啟動(dòng)主要分為兩個(gè)階段,主要在start.s文件中,第一階段主要做的是硬件的初始化,包括,設(shè)置處理器模式為SVC模式,關(guān)閉看門狗,屏蔽中斷,初始化sdram,設(shè)置棧,設(shè)置時(shí)鐘,從flash拷貝代碼到內(nèi)存,清除bss段等,bss段是用來存儲(chǔ)靜態(tài)變量,全局變量的,然后程序跳轉(zhuǎn)到start_arm_boot函數(shù),宣告第一階段的結(jié)束。
第二階段比較復(fù)雜,做的工作主要是1.從flash中讀出內(nèi)核。2.啟動(dòng)內(nèi)核。start_arm_boot的主要流程為,設(shè)置機(jī)器id,初始化flash,然后進(jìn)入main_loop,等待uboot命令,uboot要啟動(dòng)內(nèi)核,主要經(jīng)過兩個(gè)函數(shù),第一個(gè)是s=getenv(“bootcmd”),第二個(gè)是run_command(s.。.),所以要啟動(dòng)內(nèi)核,需要根據(jù)bootcmd環(huán)境變量的內(nèi)容啟動(dòng),bootcmd環(huán)境變量一般指示了從某個(gè)flash地址讀取內(nèi)核到啟動(dòng)的內(nèi)存地址,然后啟動(dòng),bootm。uboot啟動(dòng)的內(nèi)核為uImage,這種格式的內(nèi)核是由兩部分組成:真正的內(nèi)核和內(nèi)核頭部組成,頭部中包括內(nèi)核中的一些信息,比如內(nèi)核的加載地址,入口地址。uboot在接受到啟動(dòng)命令后,要做的主要是,1,讀取內(nèi)核頭部,2,移動(dòng)內(nèi)核到合適的加載地址,3,啟動(dòng)內(nèi)核,執(zhí)行do_bootm_linux
do_bootm_linux主要做的為,1,設(shè)置啟動(dòng)參數(shù),在特定的地址,保存啟動(dòng)參數(shù),函數(shù)分別為setup_start_tag,setup_memory_tag,根據(jù)名字我們就知道具體的段內(nèi)存儲(chǔ)的信息,memory中為板子的內(nèi)存大小信息,commandline為命令行信息,啟動(dòng)內(nèi)核。
總結(jié)
總結(jié):uboot到底是干嘛的,對(duì)應(yīng)下面uboot必須要解決哪些問題!
1)uboot主要作用是用來啟動(dòng)操作系統(tǒng)內(nèi)核。體現(xiàn)在uboot最后一句代碼就是啟動(dòng)內(nèi)核。2)uboot還要負(fù)責(zé)部署整個(gè)計(jì)算機(jī)系統(tǒng)。體現(xiàn)在uboot最后的傳參。3)uboot中還有操作Flash等板子上硬件的驅(qū)動(dòng)。例如串口要打印,ping網(wǎng)絡(luò)成功,擦除、燒寫flash是否成功等。4)uboot還得提供一個(gè)命令行界面供人來操作。很簡(jiǎn)單,至少你能看到。
計(jì)算機(jī)系統(tǒng)的組成部件非常多,不同的計(jì)算機(jī)系統(tǒng)組成部件也不同。但是所有的計(jì)算機(jī)系統(tǒng)運(yùn)行時(shí)需要的主要核心部件都是3個(gè)東西:CPU + 外部存儲(chǔ)器(Flash/硬盤) + 內(nèi)部存儲(chǔ)器(DDR SDRAM/SDRAM/SRAM)。而一般的PC機(jī)啟動(dòng)過程為:PC上電后先執(zhí)行BIOS程序(實(shí)際上PC的BIOS就是NorFlash),BIOS程序負(fù)責(zé)初始化DDR內(nèi)存,負(fù)責(zé)初始化硬盤,然后從硬盤上將OS鏡像讀取到DDR中,然后跳轉(zhuǎn)到DDR中去執(zhí)行OS直到啟動(dòng)(OS啟動(dòng)后BIOS就無用了)。
嵌入式系統(tǒng)和PC機(jī)的啟動(dòng)過程幾乎沒有兩樣,只是BIOS成了uboot,硬盤成了Flash。
uboot啟動(dòng)流程
1.自身可開機(jī)直接啟動(dòng)
1)一般的SoC都支持多種啟動(dòng)方式,譬如SD卡啟動(dòng)、NorFlash啟動(dòng)、NandFlash啟動(dòng)等?????uboot要能夠開機(jī)啟動(dòng),必須根據(jù)具體的SoC的啟動(dòng)設(shè)計(jì)來設(shè)計(jì)uboot。2)uboot必須進(jìn)行和硬件相對(duì)應(yīng)的代碼級(jí)別的更改和移植,才能夠保證可以從相應(yīng)的啟動(dòng)介質(zhì)啟動(dòng)。uboot中第一階段的start.S文件中具體處理了這一塊。
2.能夠引導(dǎo)操作系統(tǒng)內(nèi)核啟動(dòng)并給內(nèi)核傳參
1)uboot的終極目標(biāo)就是啟動(dòng)內(nèi)核。2)linux內(nèi)核在設(shè)計(jì)的時(shí)候,設(shè)計(jì)為可以被傳參。也就是說我們可以在uboot中事先給linux內(nèi)核準(zhǔn)備一些啟動(dòng)參數(shù)放在內(nèi)存中特定位置然后傳給內(nèi)核,內(nèi)核啟動(dòng)后會(huì)到這個(gè)特定位置去取uboot傳給他的參數(shù),然后在內(nèi)核中解析這些參數(shù),這些參數(shù)將被用來指導(dǎo)linux內(nèi)核的啟動(dòng)過程。
3.能提供系統(tǒng)部署功能
uboot必須能夠被人借助而完成整個(gè)系統(tǒng)(包括uboot、kernel、rootfs等的鏡像)在Flash上的燒錄下載工作。
4. 能進(jìn)行soc級(jí)和板級(jí)硬件管理
1)uboot中實(shí)現(xiàn)了一部分硬件的控制能力(uboot中初始化了一部分硬件),因?yàn)閡boot為了完成一些任務(wù)必須讓這些硬件工作。譬如uboot要實(shí)現(xiàn)刷機(jī)必須能驅(qū)動(dòng)Nand,譬如uboot要在刷機(jī)時(shí)LCD上顯示進(jìn)度條就必須能驅(qū)動(dòng)LCD,譬如uboot能夠通過串口提供操作界面就必須驅(qū)動(dòng)串口。譬如uboot要實(shí)現(xiàn)網(wǎng)絡(luò)功能就必須驅(qū)動(dòng)網(wǎng)卡芯片。
2)SoC級(jí)(譬如串口)就是SoC內(nèi)部外設(shè),板級(jí)就是SoC外面開發(fā)板上面的硬件(譬如網(wǎng)卡、Nand)。
5. uboot的“生命周期”
1)uboot的生命周期就是指:uboot什么時(shí)候開始運(yùn)行,什么時(shí)候結(jié)束運(yùn)行。
2)uboot本質(zhì)上是一個(gè)裸機(jī)程序(不是操作系統(tǒng)),一旦uboot開始SoC就會(huì)單純運(yùn)行uboot,一旦uboot結(jié)束運(yùn)行則無法再回到uboot。
3)uboot的入口和出口。uboot的入口就是開機(jī)自動(dòng)啟動(dòng),uboot的唯一出口就是啟動(dòng)內(nèi)核。uboot還可以執(zhí)行很多別的任務(wù)(譬如燒錄系統(tǒng)),但是其他任務(wù)執(zhí)行完后都可以回到uboot的命令行繼續(xù)執(zhí)行uboot命令,而啟動(dòng)內(nèi)核命令一旦執(zhí)行就回不來了。
fqj
評(píng)論
查看更多