uboot(bootloader)相關(guān)的知識(shí)點(diǎn)匯總

掃描二維碼
獲取更多精彩
嵌入式雜牌軍

編輯|追夢(mèng)星空
公眾號(hào)|嵌入式雜牌軍
習(xí)慣可以讓人重復(fù)對(duì)自己有利的東西從而讓自身得以提升,也可以讓人不斷重復(fù)錯(cuò)誤的事情從而給自身帶來(lái)諸多的困擾(習(xí)慣久了就成了類似無(wú)意識(shí)的東西,無(wú)意識(shí)的對(duì),也無(wú)意識(shí)的錯(cuò))。
文 章 導(dǎo) 讀
今天給小伙伴們匯總下uboot相關(guān)的內(nèi)容,主要涉及它的定義、啟動(dòng)方式、操作方式、目錄結(jié)構(gòu)、編譯調(diào)試等內(nèi)容!
閱讀過(guò)程中有什么問(wèn)題可以后臺(tái)交流哈,
!
1 嵌入式存儲(chǔ)設(shè)備的分區(qū)情況
在引出uboot之前先看下uboot在存儲(chǔ)設(shè)備中的位置。
① 第一分區(qū):存放uboot。
② 第二分區(qū):存放uboot要傳給系統(tǒng)內(nèi)核的參數(shù)。
③ 第三分區(qū):系統(tǒng)內(nèi)核。
④ 第四分區(qū):根文件系統(tǒng)。
2 uboot 相關(guān)的知識(shí)點(diǎn)
1)定義
Bootloader是操作系統(tǒng)運(yùn)行之前執(zhí)行的一小段程序,通過(guò)這一小段程序,可以初始化硬件設(shè)備/建立內(nèi)存空間映射表,從而建立適當(dāng)?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做好準(zhǔn)備。
uboot是bootloader的一種,下面內(nèi)容可能出現(xiàn)混用的情況。
2)uboot啟動(dòng)方式
① 網(wǎng)絡(luò)啟動(dòng)。
主要用于調(diào)試,通常需要安裝nfs和tftp服務(wù),用于掛載根文件系統(tǒng),內(nèi)核鏡像
u-boot.bin等內(nèi)容,因?yàn)槭菕燧d,硬件重新上電,一般并不會(huì)保存掛載的內(nèi)容。
② 磁盤(pán)啟動(dòng)。
這種方式主要是用在臺(tái)式機(jī)和服務(wù)器上的,這些計(jì)算機(jī)都使用BIOS引導(dǎo),并且使用磁盤(pán)作為存儲(chǔ)介質(zhì),這里面兩個(gè)重要的用來(lái)啟動(dòng)linux的有LILO和GRUB。
③ Flash啟動(dòng)。
將uboot、內(nèi)核鏡像及應(yīng)用程序等組成的程序文件下載到Flash中,上電自動(dòng)引導(dǎo)。
3)Bootloader的兩種操作模式
① 啟動(dòng)加載模式,也稱為自主模式。
Bootloader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過(guò)程沒(méi)有用戶介入。
② 下載模式。
目標(biāo)機(jī)上的Bootloader通過(guò)串口/網(wǎng)絡(luò)等方式從主機(jī)下載/掛載到目標(biāo)機(jī)(如uImage/u-boot.bin/根文件系統(tǒng))。
從目標(biāo)機(jī)下載的文件,Bootloader會(huì)將其先放在目標(biāo)機(jī)的RAM中,然后在放在目標(biāo)機(jī)的Flash等固態(tài)存儲(chǔ)設(shè)備中。
4)uboot的目錄結(jié)構(gòu)

① board文件夾。
board文件夾中存放開(kāi)發(fā)板相關(guān)的配置文件,每一個(gè)開(kāi)發(fā)板都以子文件夾的形式出現(xiàn)。

此文件夾下的每個(gè)文件里面都找到一個(gè)腳本文件u-boot.lds,此文件中內(nèi)容描述了對(duì)應(yīng)型號(hào)uboot代碼的入口點(diǎn)、各段代碼存放位置(數(shù)據(jù)段、代碼段、bss段)以及對(duì)齊方式等內(nèi)容,感興趣的小伙伴可以看看。
② commom文件夾。
它存放的是u-boot行下支持的命令,每一個(gè)命令對(duì)應(yīng)一個(gè)文件。
③ cpu文件夾。
此文件夾中存放特定cpu架構(gòu)相關(guān)的目錄,每一款cpu架構(gòu)都對(duì)應(yīng)了一個(gè)子目錄。
④ doc文件夾。
doc是文檔目錄,有u-boot非常完善的文檔。
⑤ drivers文件夾。
此文件夾下存放的是u-boot支持的各種設(shè)備的驅(qū)動(dòng)程序。
⑥ fs文件夾。

它用于存放支持的文件系統(tǒng)的源碼,其中最常用的是JFFS2文件系統(tǒng)。
⑦ include文件夾。
它存放u-boot使用的頭文件,還有各種硬件平臺(tái)支持的匯編文件,系統(tǒng)配置文件和文件系統(tǒng)支持的文件。
⑧ net文件夾。
它存放的是與網(wǎng)絡(luò)協(xié)議相關(guān)的代碼,bootp協(xié)議、TFTP協(xié)議、NFS文件系統(tǒng)得實(shí)現(xiàn)。
⑨ tooles文件夾。
它存放的是生成u-boot相關(guān)的工具。
⑩ u-boot.bin與u-boot.spec及u-boot.map。

前兩個(gè)是生產(chǎn)的uboot的程序文件,常用的是u-boot.bin文件。
u-boot.map可以查看uboot編譯存儲(chǔ)的信息,遇到問(wèn)題時(shí)可以去這里看看。
3 uboot 的編譯與調(diào)試
1)uboot的編譯
uboot的編譯不管什么方式一般都是落實(shí)到Makefile上。
① 用現(xiàn)有的IDE編譯。
Linux開(kāi)發(fā)的編譯一般都支持局部編譯,比如你可以單獨(dú)編譯內(nèi)核,你可以單獨(dú)編譯uboot,你也可以將程序進(jìn)行全部編譯。
為了節(jié)省時(shí)間,在調(diào)試時(shí),局部編譯,并將代碼下載到硬件中去測(cè)試是比較不錯(cuò)的選擇。
② 直接編譯uboot。
即用make命令對(duì)uboot進(jìn)行編譯,此時(shí)涉及到一個(gè)問(wèn)題,編譯環(huán)境變量存在交叉編譯等條件的限制。此時(shí)有兩種編譯方式:
要么編寫(xiě)腳本利用現(xiàn)有IDE的環(huán)境變量,將變量路徑填入腳本,進(jìn)入uboot去編譯。
要么自己搭建編譯環(huán)境,設(shè)置好環(huán)境變量。
2)uboot的調(diào)試
① 利用printf打印調(diào)試信息。
標(biāo)準(zhǔn)的uboot中printf已經(jīng)用puts等函數(shù)重寫(xiě)了可以直接用于調(diào)試。
② 開(kāi)啟DEBUG宏。
uboot啟動(dòng)時(shí)的打印可以開(kāi)啟DEBUG宏,DEBUG位于include/common.h中。
③ 利用help命令。

進(jìn)入uboot后,輸入help命令即可列出uboot支持的命令,可以嘗試下如何使用。
④ 添加自己的uboot命令。

可以通過(guò)help命令查出uboot已有的命令,然后進(jìn)入到uboot源碼下用grep命令查看一下此命令的功能實(shí)現(xiàn),仿照此實(shí)現(xiàn)實(shí)現(xiàn)自己的功能函數(shù),添加打印提示,命令觸發(fā)等內(nèi)容即可。
今天就到這吧,希望對(duì)小伙伴有所幫助哈,喜歡的話歡迎轉(zhuǎn)發(fā)、點(diǎn)贊、分享、在看、轉(zhuǎn)載哈,
。
推薦一款Linux下好用的截圖工具shutter——shutter的安裝、配置與使用
