0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

搞嵌入式,為啥要有uboot?

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-02-05 12:00 ? 次閱讀

一、為什么要有uboot

1.1、計(jì)算機(jī)系統(tǒng)的主要部件(1)計(jì)算機(jī)系統(tǒng)就是以CPU為核心來運(yùn)行的系統(tǒng)。典型的計(jì)算機(jī)系統(tǒng)有:PC機(jī)(臺(tái)式機(jī)+筆記本)、嵌入式設(shè)備(手機(jī)、平板電腦、游戲機(jī))、單片機(jī)(家用電器像電飯鍋、空調(diào)) (2)計(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)

1.2、PC機(jī)的啟動(dòng)過程(1)部署:典型的PC機(jī)的BIOS程序部署在PC機(jī)主板上(隨主板出廠時(shí)已經(jīng)預(yù)制了),操作系統(tǒng)部署在硬盤上,內(nèi)存在掉電時(shí)無作用,CPU在掉電時(shí)不工作。 (2)啟動(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就無用了) 1.3、典型嵌入式linux系統(tǒng)啟動(dòng)過程(1)典型嵌入式系統(tǒng)的部署:uboot程序部署在Flash(能作為啟動(dòng)設(shè)備的Flash)上、OS部署在FLash(嵌入式系統(tǒng)中用Flash代替了硬盤)上、內(nèi)存在掉電時(shí)無作用,CPU在掉電時(shí)不工作。 (2)啟動(dòng)過程:嵌入式系統(tǒng)上電后先執(zhí)行uboot、然后uboot負(fù)責(zé)初始化DDR,初始化Flash,然后將OS從Flash中讀取到DDR中,然后啟動(dòng)OS(OS啟動(dòng)后uboot就無用了) 總結(jié):嵌入式系統(tǒng)和PC機(jī)的啟動(dòng)過程幾乎沒有兩樣,只是BIOS成了uboot,硬盤成了Flash。 1.4、android系統(tǒng)啟動(dòng)過程(1)Android系統(tǒng)的啟動(dòng)和Linux系統(tǒng)(前面講的典型的嵌入式系統(tǒng)啟動(dòng))幾乎一樣。幾乎一樣意思就是前面完全一樣,只是在內(nèi)核啟動(dòng)后加載根文件系統(tǒng)后不同了。 (2)可以認(rèn)為啟動(dòng)分為2個(gè)階段:第一個(gè)階段是uboot到OS啟動(dòng);第二個(gè)階段是OS啟動(dòng)后到rootfs加載到命令行執(zhí)行;現(xiàn)在我們主要研究第一個(gè)階段,android的啟動(dòng)和linux的差別在第二階段。 1.5、總結(jié):uboot到底是干嘛的(1)uboot主要作用是用來啟動(dòng)操作系統(tǒng)內(nèi)核。 (2)uboot還要負(fù)責(zé)部署整個(gè)計(jì)算機(jī)系統(tǒng)。 (3)uboot中還有操作Flash等板子上硬盤的驅(qū)動(dòng)。 (4)uboot還得提供一個(gè)命令行界面供人來操作。

二、為什么是uboot2.1、uboot從哪里來的?(1)uboot是SourceForge上的開源項(xiàng)目 (2)uboot項(xiàng)目的作者:一個(gè)德國人最早發(fā)起的項(xiàng)目 (3)uboot就是由一個(gè)人發(fā)起,然后由整個(gè)網(wǎng)絡(luò)上所有感興趣的人共同維護(hù)發(fā)展而來的一個(gè)bootloader。

2.2、uboot的發(fā)展歷程(1)自己使用的小開源項(xiàng)目。 (2)被更多人認(rèn)可使用 (3)被SoC廠商默認(rèn)支持。 總結(jié):uboot經(jīng)過多年發(fā)展,已經(jīng)成為事實(shí)上的業(yè)內(nèi)bootloader標(biāo)準(zhǔn)?,F(xiàn)在大部分的嵌入式設(shè)備都會(huì)默認(rèn)使用uboot來做為bootloader。 2.3、uboot的版本號(hào)問題(1)早期的uboot的版本號(hào)類似于這樣:uboot1.3.4。后來版本號(hào)便成了類似于uboot-2010.06。 (2)uboot的核心部分幾乎沒怎么變化,越新的版本支持的開發(fā)板越多而已,對(duì)于一個(gè)老版本的芯片來說,新舊版本的uboot并沒有差異。

2.4、uboot的可移植性的正確理解(1)uboot就是universal bootloader(通用的啟動(dòng)代碼),通用的意思就是在各種地方都可以用。所以說uboot具有可移植性。 (2)uboot具有可移植性并不是說uboot在哪個(gè)開發(fā)板都可以隨便用,而是說uboot具有在源代碼級(jí)別的移植能力,可以針對(duì)多個(gè)開發(fā)板進(jìn)行移植,移植后就可以在這個(gè)開發(fā)板上使用了。 三、uboot必須解決哪些問題3.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文件中具體處理了這一塊。 3.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.3、能提供系統(tǒng)部署功能(1)uboot必須能夠被人借助而完成整個(gè)系統(tǒng)(包括uboot、kernel、rootfs等的鏡像)在Flash上的燒錄下載工作。 (2)裸機(jī)教程中刷機(jī)(ARM裸機(jī)第三部分)就是利用uboot中的fastboot功能將各種鏡像燒錄到iNand中,然后從iNand啟動(dòng)。 3.4能進(jìn)行soc級(jí)和板級(jí)硬件管理(1)uboot中實(shí)現(xiàn)了一部分硬件的控制能力(uboot中初始化了一部分硬件),因?yàn)閡boot為了完成一些任務(wù)必須讓這些硬件工作。譬如uboot要實(shí)現(xiàn)刷機(jī)必須能驅(qū)動(dòng)iNand,譬如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)卡、iNand) 3.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運(yùn)行的時(shí)候別的程序是不可能同時(shí)運(yùn)行的),一旦uboot結(jié)束運(yùn)行則無法再回到uboot(所以u(píng)boot啟動(dòng)了內(nèi)核后uboot自己本身就死了,要想再次看到uboot界面只能重啟系統(tǒng)。重啟并不是復(fù)活了剛才的uboot,重啟只是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í)行就回不來了。 總結(jié):一切都是為了啟動(dòng)內(nèi)核

四、uboot的工作方式4.1、從裸機(jī)程序鏡像uboot.bin說起(1)uboot的本質(zhì)就是一個(gè)裸機(jī)程序,和我們裸機(jī)全集中寫的那些裸機(jī)程序xx.bin并沒有本質(zhì)區(qū)別。如果非說要有區(qū)別,那就是:我們寫的大部分小于16KB,而uboot大于16KB(一般uboot在180k-400k之間) (2)uboot本身是一個(gè)開源項(xiàng)目,由若干個(gè).c文件和.h文件組成,配置編譯之后會(huì)生成一個(gè)uboot.bin,這就是uboot這個(gè)裸機(jī)程序的鏡像文件。然后這個(gè)鏡像文件被合理的燒錄到啟動(dòng)介質(zhì)中拿給SoC去啟動(dòng)。也就是說uboot在沒有運(yùn)行時(shí)表現(xiàn)為uboot.bin,一般躺在啟動(dòng)介質(zhì)中。 (3)uboot運(yùn)行時(shí)會(huì)被加載到內(nèi)存中然后一條指令一條指令的拿給CPU去運(yùn)行。 4.2、uboot的命令式shell界面(1)普通的裸機(jī)程序運(yùn)行起來就直接執(zhí)行了,執(zhí)行時(shí)效果和代碼有關(guān)。 (2)有些程序需要和人進(jìn)行交互,于是乎程序中就實(shí)現(xiàn)了一個(gè)shell(shell就是提供人機(jī)交互的一個(gè)界面,回想ARM裸機(jī)全集第十六部分),uboot就實(shí)現(xiàn)了一個(gè)shell。 注意:shell并不是操作系統(tǒng),和操作系統(tǒng)一點(diǎn)關(guān)系都沒有。linux中打開一個(gè)終端后就得到了一個(gè)shell,可以輸入命令回車執(zhí)行。uboot中的shell工作方式和linux中的終端shell非常像(其實(shí)幾乎是一樣的,只是命令集不一樣。譬如linux中可以ls,uboot中l(wèi)s就不識(shí)別) 4.3、掌握uboot使用的2個(gè)關(guān)鍵點(diǎn):命令和環(huán)境變量(1)uboot啟動(dòng)后大部分時(shí)間和工作都是在shell下完成的(譬如uboot要部署系統(tǒng)要在shell下輸命令、要設(shè)置環(huán)境變量也得在命令行地下,要啟動(dòng)內(nèi)核也要在命令行底下敲命令) (2)命令就是uboot的shell中可以識(shí)別的各種命令。uboot中有幾十個(gè)命令,其中有一些常用另一些不常用(我們還可以自己給uboot添加命令),后面會(huì)用幾節(jié)課時(shí)間來依次學(xué)習(xí)uboot中常用命令。 (3)uboot的環(huán)境變量和操作系統(tǒng)的環(huán)境變量工作原理和方式幾乎完全相同。uboot在設(shè)計(jì)時(shí)借助了操作系統(tǒng)的設(shè)計(jì)理念(命令行工作方式借鑒了linux終端命令行,環(huán)境變量借鑒了操作系統(tǒng)的環(huán)境變量,uboot的驅(qū)動(dòng)管理幾乎完全照抄了linux的驅(qū)動(dòng)框架)。 (4)環(huán)境變量可以被認(rèn)為是系統(tǒng)的全局變量,環(huán)境變量名都是系統(tǒng)內(nèi)置的(認(rèn)識(shí)就認(rèn)識(shí),不認(rèn)識(shí)就不認(rèn)識(shí),這部分是系統(tǒng)自帶的默認(rèn)的環(huán)境變量,譬如PATH;但是也有一部分環(huán)境變量是自己添加的,自己添加的系統(tǒng)就不認(rèn)識(shí)但是我們自己認(rèn)識(shí))。系統(tǒng)或者我們自己的程序在運(yùn)行時(shí)可以通過讀取環(huán)境變量來指導(dǎo)程序的運(yùn)行。這樣設(shè)計(jì)的好處就是靈活,譬如我們要讓一個(gè)程序更改運(yùn)行方法,不用去重新修改程序代碼再重新編譯運(yùn)行,而只要修改相應(yīng)的環(huán)境變量就可以了。 (5)環(huán)境變量就是運(yùn)行時(shí)的配置屬性。

五、uboot的常用命令15.1、類似linux終端的行緩沖命令行(1)行緩沖的意思就是:當(dāng)我們向終端命令行輸入命令的時(shí)候,這些命令沒有立即被系統(tǒng)識(shí)別,而是被緩沖到一個(gè)緩存區(qū)(也就是系統(tǒng)認(rèn)為我們還沒有輸入完),當(dāng)我們按下回車鍵(換行)后系統(tǒng)就認(rèn)為我們輸入完了,然后將緩沖區(qū)中所有剛才輸入的作為命令拿去分析處理。 (2)linux終端設(shè)計(jì)有3種緩沖機(jī)制:無緩沖、行緩沖、全緩沖 (3)有些命令有簡化的別名,譬如printenv命令可以簡化為print,譬如setenv可以簡化為set (4)有些命令會(huì)帶參數(shù)(注意格式是固定的),uboot的每個(gè)命令都有事先規(guī)定好的各種格式。有些命令就是不帶參數(shù)的,譬如printenv/print命令;有些命令帶可選的參數(shù)(可以帶也可以不帶,當(dāng)然帶不帶參數(shù)的執(zhí)行結(jié)果是不同的);有些命令帶必須的參數(shù)(譬如setenv/set命令) (5)采用“help+命令名”來查詢命令的詳細(xì)信息,只輸入help時(shí),則打印出命令列表。

5.2、命令中的特殊符號(hào)(譬如單引號(hào))(1)uboot的有些命令帶的參數(shù)非常長,為了告訴uboot這個(gè)非常長而且中間有好多個(gè)空格的東西是給他的一整個(gè)參數(shù),所以用單引號(hào)將這個(gè)很長且中間有空格隔開的參數(shù)引起來。 (2)別的符號(hào)也許也有,而且有特定的意義。當(dāng)碰到uboot的命令行有特殊符號(hào)時(shí)要注意不是弄錯(cuò)了,而是可能有特別的含義。

5.3、有些命令是一個(gè)命令族(譬如movi)(1)命令族意思就是好多個(gè)命令開頭都是用同一個(gè)命令關(guān)鍵字的,但是后面的參數(shù)不一樣,這些命令的功能和作用也不同。這就叫一個(gè)命令族。 (2)同一個(gè)命令族中所有的命令都有極大的關(guān)聯(lián),譬如movi開頭的命令族都和moviNand(EMMC、iNand)操作有關(guān)。 5.4、第一個(gè)命令:printenv/print(1)print命令不用帶參數(shù),作用是打印出系統(tǒng)中所有的環(huán)境變量。 (2)環(huán)境變量就好像程序的全局變量一樣。程序中任何地方都可以根據(jù)需要去調(diào)用或者更改環(huán)境變量(一般都是調(diào)用),環(huán)境變量和全局變量不同之處在于:全局變量的生命周期是在程序的一次運(yùn)行當(dāng)中,開始運(yùn)行時(shí)誕生程序結(jié)束時(shí)死亡,下次運(yùn)行程序時(shí)從頭開始;但是環(huán)境變量被存儲(chǔ)在Flash的另一塊專門區(qū)域(Flash上有一個(gè)環(huán)境變量分區(qū)),一旦我們?cè)诔绦蛑斜4媪嗽摥h(huán)境變量,那么下次開機(jī)時(shí)該環(huán)境變量的值將維持上一次更改保存后的值。 六、uboot的常用命令2

5.1、設(shè)置(添加/更改)環(huán)境變量:setenv/set

用法:set name value 5.2、保存環(huán)境變量的更改:saveenv/savesaveenv/save命令不帶參數(shù),直接執(zhí)行,作用是將內(nèi)存中的環(huán)境變量的值同步保存到Flash中環(huán)境變量的分區(qū)。注意:環(huán)境變量的保存是整體的覆蓋保存,也就是說內(nèi)存中所有的環(huán)境變量都會(huì)整體的將Flash中環(huán)境變量分區(qū)中原來的內(nèi)容整體覆蓋。 總結(jié):徹底更改一個(gè)環(huán)境變量的值,需要2步: 第一步:set命令來更改內(nèi)存中的環(huán)境變量 第二步:用save命令將其同步到Flash中環(huán)境變量的分區(qū)。 有時(shí)候我們只是想測試下這個(gè)環(huán)境變量,不希望影響到下一次開機(jī),那就只set不save,這樣set后當(dāng)前本次運(yùn)行的uboot已經(jīng)起效果了,只不過沒save下一次開機(jī)還是會(huì)恢復(fù)到原來的狀況。 5.3、網(wǎng)絡(luò)測試指令:ping (1)命令用法: ping ip地址 注意:ping是測試開發(fā)板和主機(jī)之間的網(wǎng)絡(luò)鏈接,注意以下步驟: 1)首先要插上網(wǎng)線。 2)先試圖ping通主機(jī)windows。注意Windows中有線網(wǎng)卡的地址設(shè)置(設(shè)置本地連接)。設(shè)置主機(jī)windows的本地連接IPv4地址為192.168.1.10 3)第三步確認(rèn)開發(fā)板中uboot里幾個(gè)網(wǎng)絡(luò)相關(guān)的環(huán)境變量的值對(duì)不對(duì)。最重要的是ipaddr(這個(gè)環(huán)境變量表示當(dāng)前開發(fā)板的IP地址),這個(gè)地址必須和主機(jī)windows的IP地址在同一個(gè)網(wǎng)段。 網(wǎng)段的概念:一個(gè)IP地址分為2部分,一部分是網(wǎng)段地址,另一部分是網(wǎng)段內(nèi)的主機(jī)地址(由子網(wǎng)掩碼來區(qū)分哪一部分是網(wǎng)段地址,哪一部分是IP地址)。在子網(wǎng)掩碼是255.255.255.0的情況下,192.168.1.10這個(gè)IP地址的前三部分(192.168.1.)屬于網(wǎng)段地址,第4部分(10)屬于主機(jī)地址。

七、開發(fā)板和主機(jī)的ping通

上節(jié)課最后的結(jié)果是:uboot中的ipaddr和主機(jī)windows本地連接地址已經(jīng)設(shè)置到一個(gè)網(wǎng)段,但是實(shí)際還ping不通。 還發(fā)現(xiàn)了這樣的現(xiàn)象:1、我把2個(gè)的網(wǎng)段都從192.168.1.x改到192.168.0.x時(shí)會(huì)ping通一次,第二次開始就ping不通了;2、有同學(xué)說ping不通可能是因?yàn)閡boot中g(shù)atewayip沒設(shè)置,我就實(shí)際測試設(shè)置網(wǎng)管為同網(wǎng)段.1,再次測試結(jié)論是第一次ping通了,第二次開始又不通了。 7.1、開發(fā)板運(yùn)行l(wèi)inux下和主機(jī)Windows的ping通(1)先將開發(fā)板刷機(jī)成linux+QT鏡像(刷機(jī)見裸機(jī)教程第三部分),然后啟動(dòng)進(jìn)入linux命令行終端下。 (2)在linux下使用ifconfig命令將開發(fā)板中l(wèi)inux系統(tǒng)的IP地址設(shè)置為和主機(jī)windows同一網(wǎng)段(為了上課方便,以后就固定:主機(jī)windows地址192.168.1.10,開發(fā)板uboot或linux的地址為192.168.1.20,虛擬機(jī)ubuntu地址為192.168.1.141) (3)此時(shí)開發(fā)板端ping windows通的。 (4)windows中ping開發(fā)板也是通的。 說明:首先開發(fā)板和主機(jī)的網(wǎng)絡(luò)部分硬件都是好的,網(wǎng)絡(luò)連接也是好的,主機(jī)windows中的網(wǎng)絡(luò)軟件設(shè)置是好的。 7.2、開發(fā)板運(yùn)行l(wèi)inux下和虛擬機(jī)ubuntu的ping通(1)在linux基礎(chǔ)課中講過:虛擬機(jī)的網(wǎng)卡設(shè)置可以選擇好幾種方式,常用的就是NAT和橋接(bridged)。 (2)虛擬機(jī)要和開發(fā)板進(jìn)行網(wǎng)絡(luò)通信,只能通過橋接方式連接。 (3)虛擬機(jī)要想被開發(fā)板ping通,設(shè)置步驟如下: 第一步:虛擬機(jī)設(shè)置成橋接方式。 第二步:虛擬機(jī)的菜單中有個(gè)“虛擬網(wǎng)絡(luò)編輯器”,這里面要設(shè)置為橋接到有線網(wǎng)卡。(默認(rèn)是自動(dòng)的,自動(dòng)的一般會(huì)影響ping通。因?yàn)殡娔X現(xiàn)在一般都有2個(gè)網(wǎng)卡:一個(gè)有線的一個(gè)無線的。如果選了自動(dòng),那么虛擬機(jī)會(huì)自動(dòng)橋接到無線網(wǎng)卡上,但是我們卻是通過有線網(wǎng)卡來連接開發(fā)板的,自然ping不通) 第三步:在虛擬機(jī)ubuntu中設(shè)置IP地址為192.168.1.141(可以通過/etc/network/interfaces文件來設(shè)置靜態(tài)的然后重啟;也可以直接命令行ifconfig去設(shè)置) (4)此時(shí)開發(fā)板ping虛擬機(jī)ubuntu應(yīng)該就通了。 (5)此時(shí)虛擬機(jī)ubuntu中ping開發(fā)板也是通的。 7.3、開發(fā)板運(yùn)行uboot下和主機(jī)Windows的ping通(1)剛才開發(fā)板運(yùn)行l(wèi)inux時(shí)和主機(jī)windows、虛擬機(jī)ubuntu都ping通了,說明硬件和連接和主機(jī)設(shè)置沒錯(cuò)。 (2)此時(shí)開發(fā)板重啟進(jìn)入uboot,設(shè)置好ipaddr、gatewayip,然后去ping windows發(fā)現(xiàn)還是不通。 懷疑uboot本身網(wǎng)絡(luò)驅(qū)動(dòng)有問題。 (3)然后同樣情況下嘗試去ping通虛擬機(jī)ubuntu,理論分析應(yīng)該也不通,但是實(shí)際發(fā)現(xiàn)是通的。 7.4、開發(fā)板運(yùn)行uboot下和虛擬機(jī)ubuntu的ping通uboot和虛擬機(jī)ubuntu互相ping通(前提是虛擬機(jī)ubuntu設(shè)置為橋接,且橋接到有線網(wǎng)卡,且ip地址設(shè)置正確的情況下) 結(jié)論:開發(fā)板中運(yùn)行的uboot有點(diǎn)小bug,ping windows就不通,ping虛擬機(jī)ubuntu就通。 八、uboot常用命令38.1、tftp下載指令:tftp(1)uboot本身主要目標(biāo)是啟動(dòng)內(nèi)核,為了完成啟動(dòng)內(nèi)核必須要能夠部署內(nèi)核,uboot為了部署內(nèi)核就需要將內(nèi)核鏡像從主機(jī)中下載過來然后燒錄到本地flash中。uboot如何從主機(jī)(windows或者虛擬機(jī)ubuntu)下載鏡像到開發(fā)板上?有很多種方式,主流方式是:fastboot和tftp。 fastboot的方式是通過USB線進(jìn)行數(shù)據(jù)傳輸。 tftp的方式是通過有線網(wǎng)絡(luò)的。典型的方式就是通過網(wǎng)絡(luò),fastboot是近些年才新發(fā)展的。 (2)tftp方式下載時(shí)實(shí)際上uboot扮演的是tftp客戶端程序角色,主機(jī)windows或虛擬機(jī)ubuntu中必須有一個(gè)tftp服務(wù)器,然后將要下載的鏡像文件放在服務(wù)器的下載目錄中,然后開發(fā)板中使用uboot的tftp命令去下載即可。 (3)有些人習(xí)慣在windows中搭建tftp服務(wù)器,一般是用一些軟件來搭建(譬如tftpd32,使用起來比較簡單);有些人習(xí)慣在linux下搭建tftp服務(wù)器,可以參考網(wǎng)盤中的虛擬機(jī)下載目錄下的一個(gè)教程《嵌入式開發(fā)環(huán)境搭建-基于14.04.pdf》,這里面有ubuntu中搭建tftp服務(wù)器的教程,也可以自己上網(wǎng)搜索教程嘗試。(如果你直接就用我的虛擬機(jī),那就已經(jīng)搭建好了,不用再搭建了;如果是自己新裝的那就參考文檔搭建;如果你的版本和我的不一樣那搭建過程可能不一樣) (4)我的虛擬機(jī)搭建的時(shí)候設(shè)置的tftp下載目錄是/tftpboot,將要被下載的鏡像復(fù)制到這個(gè)目錄下。 (5)檢查開發(fā)板uboot的環(huán)境變量,注意serverip必須設(shè)置為虛擬機(jī)ubuntu的ip地址。(serverip這個(gè)環(huán)境變量的意義就是主機(jī)tftp服務(wù)器的ip地址) (6)然后在開發(fā)板的uboot下先ping通虛擬機(jī)ubuntu,然后再嘗試下載:tftp 0x30000000 zImage-qt(意思是將服務(wù)器上名為zImage-qt的文件下載到開發(fā)板內(nèi)存的0x30000000地址處。) (7)鏡像下載到開發(fā)板的DDR中后,uboot就可以用movi指令進(jìn)行鏡像的燒寫了。 注意: 如果你是用的windows下的tftp服務(wù)器,那uboot的serverip就要設(shè)置為和windwos下tftp服務(wù)器的ip地址一樣(windows下的tftp服務(wù)器軟件設(shè)置的時(shí)候就有個(gè)步驟是讓你設(shè)置服務(wù)器的ip地址,這個(gè)ip地址和主機(jī)windows必須在一個(gè)網(wǎng)段)。 九、uboot的常用命令49.1、SD卡/iNand操作指令movi(1)開發(fā)板如果用SD卡/EMMC/iNand等作為Flash,則在uboot中操作flash的指令為movi(或mmc) (2)movi指令是一個(gè)命令集,有很多子命令,具體用法可以help movi查看。 (3)movi的指令都是movi read和movi write一組的,movi read用來讀取iNand到DDR上,movi write用來將DDR中的內(nèi)容寫入iNand中。理解這些指令時(shí)一定要注意涉及到的2個(gè)硬件:iNand和DDR內(nèi)存。 (4)movi read {u-boot | kernel} {addr} 這個(gè)命令使用了一種通用型的描述方法來描述:movi 和read外面沒有任何標(biāo)記說明每一次使用這個(gè)指令都是必選的;一對(duì)大括號(hào){}括起來的部分必選1個(gè);大括號(hào)中的豎線表是多選一;中括號(hào)[]表示可選參數(shù) (5)指令有多種用法,譬如 movi read u-boot 0x30000000,意思就是把iNand中的u-boot分區(qū)讀出到DDR的0x30000000起始的位置處。(uboot代碼中將iNand分成了很多個(gè)分區(qū),每個(gè)分區(qū)有地址范圍和分區(qū)名,uboot程序操作中可以使用直接地址來操作iNand分區(qū),也可以使用分區(qū)名來操作分區(qū)。);注意這里的0x30000000也可以直接寫作30000000,意思是一樣的(uboot的命令行中所有數(shù)字都被默認(rèn)當(dāng)作十六進(jìn)制處理,不管你加不加0x都一樣)。 9.2、NandFlash操作指令nand理解方法和操作方法完全類似于movi指令 9.3、內(nèi)存操作指令:mm、mw、md(1)DDR中是沒有分區(qū)的(只聽說過對(duì)硬盤、Flash進(jìn)行分區(qū),沒聽說過對(duì)內(nèi)存進(jìn)行分區(qū)····),但是內(nèi)存使用時(shí)要注意,千萬不能越界踩到別人了。因?yàn)閡boot是一個(gè)裸機(jī)程序,不像操作系統(tǒng)會(huì)由系統(tǒng)整體管理所有內(nèi)存,系統(tǒng)負(fù)責(zé)分配和管理,系統(tǒng)會(huì)保證內(nèi)存不會(huì)隨便越界。然后裸機(jī)程序中uboot并不管理所有內(nèi)存,內(nèi)存是散的隨便用的,所以如果程序員(使用uboot的人)自己不注意就可能出現(xiàn)自己把自己的數(shù)據(jù)給覆蓋了。(所以你思考下我們?yōu)槭裁窗製boot放在23E00000地址處) (2)md就是memory display,用來顯示內(nèi)存中的內(nèi)容。 (3)mw就是memory write,將內(nèi)容寫到內(nèi)存中 (4)mm就是memory modify,修改內(nèi)存中的某一塊,說白了還是寫內(nèi)存(如果需要批量的逐個(gè)單元的修改內(nèi)存,用mm最合適) 9.4、啟動(dòng)內(nèi)核指令:bootm、go(1)uboot的終極目標(biāo)就是啟動(dòng)內(nèi)核,啟動(dòng)內(nèi)核在uboot中表現(xiàn)為一個(gè)指令,uboot命令行中調(diào)用這個(gè)指令就會(huì)啟動(dòng)內(nèi)核(不管成功與否,所以這個(gè)指令是一條死路)。 (2)差別:bootm啟動(dòng)內(nèi)核同時(shí)給內(nèi)核傳參,而Go命令啟動(dòng)內(nèi)核不傳參。bootm其實(shí)才是正宗的啟動(dòng)內(nèi)核的命令,一般情況下都用這個(gè);go命令本來不是專為啟動(dòng)內(nèi)核設(shè)計(jì)的,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ī)程序(有一種調(diào)試裸機(jī)程序的方法就是事先啟動(dòng)uboot,然后在uboot中去下載裸機(jī)程序,用go命令去執(zhí)行裸機(jī)程序) 十、uboot的常用環(huán)境變量110.1、環(huán)境變量如何參與程序運(yùn)行(1)環(huán)境變量有2份,一份在Flash中,另一份在DDR中。uboot開機(jī)時(shí)一次性從Flash中讀取全部環(huán)境變量到DDR中作為環(huán)境變量的初始化值,然后使用過程中都是用DDR中這一份,用戶可以用saveenv指令將DDR中的環(huán)境變量重新寫入Flash中去更新Flash中環(huán)境變量。下次開機(jī)時(shí)又會(huì)從Flash中再讀一次。 (2)環(huán)境變量在uboot中是用字符串表示的,也就是說uboot是按照字符匹配的方式來區(qū)分各個(gè)環(huán)境變量的。因此用的時(shí)候一定要注意不要打錯(cuò)字了。 1、自動(dòng)運(yùn)行倒數(shù)時(shí)間:bootdelay 2、網(wǎng)絡(luò)設(shè)置:ipaddr serverip (1)ipaddr是開發(fā)板的本地IP地址 (2)serverip是開發(fā)板通過tftp指令去tftp服務(wù)器下載東西時(shí),tftp服務(wù)器的IP地址。 (3)gatewayip是開發(fā)板的本地網(wǎng)關(guān)地址 (4)netmask是子網(wǎng)掩碼 (5)ethaddr是開發(fā)板的本地網(wǎng)卡的MAC地址。 十一、uboot的常用環(huán)境變量211.1、自動(dòng)運(yùn)行命令設(shè)置:bootcmd(1)uboot啟動(dòng)后會(huì)開機(jī)自動(dòng)倒數(shù)bootdelay秒,如果沒有人按下回車打斷啟動(dòng),則uboot會(huì)自動(dòng)執(zhí)行啟動(dòng)命令來啟動(dòng)內(nèi)核。 (2)uboot開機(jī)自動(dòng)啟動(dòng)時(shí)實(shí)際就是在內(nèi)部執(zhí)行了bootcmd這個(gè)環(huán)境變量的值所對(duì)應(yīng)的命令集:bootcmd=movi read kernel 30008000; bootm 30008000 意思是:將iNand的kernel分區(qū)讀取到DDR內(nèi)存的0x30008000地址處,然后使用bootm啟動(dòng)命令從內(nèi)存0x30008000處去啟動(dòng)內(nèi)核。 (3)set bootcmd printenv,然后saveenv;然后重啟則會(huì)看到啟動(dòng)倒數(shù)后自動(dòng)執(zhí)行printenv命令打印出環(huán)境變量。這個(gè)小實(shí)驗(yàn)說明開機(jī)自動(dòng)執(zhí)行了bootcmd。 (4)設(shè)置bootcmd環(huán)境變量:set bootcmd 'movi read kernel 30008000; bootm 30008000' 11.2、uboot給kernel傳參:bootargs(1)linux內(nèi)核啟動(dòng)時(shí)可以接收uboot給他傳遞的啟動(dòng)參數(shù),這些啟動(dòng)參數(shù)是uboot和內(nèi)核約定好的形式、內(nèi)容,linux內(nèi)核在這些啟動(dòng)參數(shù)的指導(dǎo)下完成啟動(dòng)過程。這樣的設(shè)計(jì)是為了靈活,為了內(nèi)核在不重新編譯的情況下可以用不同的方式啟動(dòng)。 (2)我們要做的事情就是:在uboot的環(huán)境變量中設(shè)置bootargs,然后bootm命令啟動(dòng)內(nèi)核時(shí)會(huì)自動(dòng)將bootargs傳給內(nèi)核。 (3)環(huán)境變量bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3 意義解釋: console=ttySAC2,115200控制臺(tái)使用串口2,波特率115200. root=/dev/mmcblk0p2rw根文件系統(tǒng)在SD卡端口0設(shè)備(iNand)第2分區(qū),根文件系統(tǒng)是可讀可寫的 init=/linuxrclinux的進(jìn)程1(init進(jìn)程)的路徑 rootfstype=ext3根文件系統(tǒng)的類型是ext3 (4)內(nèi)核傳參非常重要。在內(nèi)核移植的時(shí)候,新手經(jīng)常因?yàn)橥浗o內(nèi)核傳參,或者給內(nèi)核傳遞的參數(shù)不對(duì),造成內(nèi)核啟動(dòng)不起來。 11.3、新建、更改、刪除一個(gè)環(huán)境變量的方法(1)新建一個(gè)環(huán)境變量,使用set var value (2)更改一個(gè)環(huán)境變量,使用set var value (3)刪除一個(gè)環(huán)境變量,使用set var 注意:修改完成環(huán)境變量后一定要保存,否則下次開機(jī)更改就又沒了。 十二、uboot中對(duì)Flash和DDR的管理12.1、uboot階段Flash的分區(qū)(1)所謂分區(qū),就是說對(duì)Flash進(jìn)行分塊管理。 (2)PC機(jī)等產(chǎn)品中,因?yàn)榇蠹叶际窃诓僮飨到y(tǒng)下使用硬盤的,整個(gè)硬盤由操作系統(tǒng)統(tǒng)一管理,操作系統(tǒng)會(huì)使用文件系統(tǒng)幫我們管理硬盤空間。(管理保證了文件之間不會(huì)互相堆疊),于是乎使用者不用自己太過在意分區(qū)問題。 (3)在uboot中是沒有操作系統(tǒng)的,因此我們對(duì)Flash(相當(dāng)于硬盤)的管理必須事先使用分區(qū)界定(實(shí)際上在uboot中和kernel中都有個(gè)分區(qū)表,分區(qū)表就是我們?cè)谧鱿到y(tǒng)移植時(shí)對(duì)Flash的整體管理分配方法)。有了這個(gè)界定后,我們?cè)诓渴鹣到y(tǒng)時(shí)按照分區(qū)界定方法來部署,uboot和kernel的軟件中也是按照這個(gè)分區(qū)界定來工作,就不會(huì)錯(cuò)。 (4)分區(qū)方法不是一定的,不是固定的,是可以變動(dòng)的。但是在一個(gè)移植中必須事先設(shè)計(jì)好定死,一般在設(shè)計(jì)系統(tǒng)移植時(shí)就會(huì)定好,定的標(biāo)準(zhǔn)是: uboot:uboot必須從Flash起始地址開始存放(也許是扇區(qū)0,也許是扇區(qū)1,也許是其他,取決于SoC的啟動(dòng)設(shè)計(jì)),uboot分區(qū)的大小必須保證uboot肯定能放下,一般設(shè)計(jì)為512KB或者1MB(因?yàn)橐话鉼boot肯定不足512KB,給再大其實(shí)也可以工作,但是浪費(fèi)); 環(huán)境變量:環(huán)境變量分區(qū)一般緊貼著uboot來存放,大小為32KB或者更多一點(diǎn)。 kernel:kernel可以緊貼環(huán)境變量存放,大小一般為3MB或5MB或其他。 rootfs:······ 剩下的就是自由分區(qū),一般kernel啟動(dòng)后將自由分區(qū)掛載到rootfs下使用 總結(jié):一般規(guī)律如下:(1)各分區(qū)彼此相連,前面一個(gè)分區(qū)的結(jié)尾就是后一個(gè)分區(qū)的開頭。 (2)整個(gè)flash充分利用,從開頭到結(jié)尾。 (3)uboot必須在Flash開頭,其他分區(qū)相對(duì)位置是可變的。 (4)各分區(qū)的大小由系統(tǒng)移植工程師自己來定,一般定為合適大小(不能太小,太小了容易溢出;不能太大,太大了浪費(fèi)空間) (5)分區(qū)在系統(tǒng)移植前確定好,在uboot中和kernel中使用同一個(gè)分區(qū)表。將來在系統(tǒng)部署時(shí)和系統(tǒng)代碼中的分區(qū)方法也必須一樣。 12.2、uboot階段DDR的分區(qū)(1)DDR的分區(qū)和Flash的分區(qū)不同,主要是因?yàn)镕lash是掉電存在的,而DDR是掉電消失,因此可以說DDR是每次系統(tǒng)運(yùn)行時(shí)才開始部署使用的。 (2)內(nèi)存的分區(qū)主要是在linux內(nèi)核啟動(dòng)起來之前,linux內(nèi)核啟動(dòng)后內(nèi)核的內(nèi)存管理模塊會(huì)接管整個(gè)內(nèi)存空間,那時(shí)候就不用我們來管了。 (3)注意內(nèi)存分區(qū)關(guān)鍵就在于內(nèi)存中哪一塊用來干什么必須分配好,以避免各個(gè)不同功能使用了同一塊內(nèi)存造成的互相踩踏。譬如說我們tftp 0x23E00000 zImage去下載zImage到內(nèi)存的0x23E00000處就會(huì)出錯(cuò),因?yàn)檫@個(gè)內(nèi)存處實(shí)際是uboot的鏡像所在。這樣下載會(huì)導(dǎo)致下載的zImage把內(nèi)存中的uboot給沖掉。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18973

    瀏覽量

    302038
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4896

    瀏覽量

    97059
  • Uboot
    +關(guān)注

    關(guān)注

    4

    文章

    125

    瀏覽量

    28125
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【北京迅為】i.mx8mm嵌入式linux開發(fā)指南第四篇 嵌入式Linux系統(tǒng)移植篇第六十九章uboot移植

    【北京迅為】i.mx8mm嵌入式linux開發(fā)指南第四篇 嵌入式Linux系統(tǒng)移植篇第六十九章uboot移植
    的頭像 發(fā)表于 10-22 14:46 ?448次閱讀
    【北京迅為】i.mx8mm<b class='flag-5'>嵌入式</b>linux開發(fā)指南第四篇 <b class='flag-5'>嵌入式</b>Linux系統(tǒng)移植篇第六十九章<b class='flag-5'>uboot</b>移植

    什么是嵌入式?一文讀懂嵌入式主板

    在現(xiàn)代科技浪潮中,嵌入式技術(shù)已成為支撐各種智能設(shè)備和系統(tǒng)運(yùn)行的核心力量。那么,究竟什么是嵌入式嵌入式系統(tǒng),顧名思義,是將計(jì)算機(jī)的硬件和軟件嵌入到某種設(shè)備或系統(tǒng)中,以實(shí)現(xiàn)特定功能的計(jì)算
    的頭像 發(fā)表于 10-16 10:14 ?383次閱讀

    AMD 面向嵌入式系統(tǒng)推出高能效 EPYC 嵌入式 8004 系列

    AMD 憑借其 EPYC? 嵌入式處理器不斷樹立行業(yè)標(biāo)準(zhǔn),為網(wǎng)絡(luò)、存儲(chǔ)和工業(yè)應(yīng)用提供卓越的性能、效率、連接與創(chuàng)新。今天,我們正以第四代 AMD EPYC 嵌入式 8004 系列處理器擴(kuò)展這一
    發(fā)表于 10-11 13:58 ?661次閱讀

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被稱為嵌入式系統(tǒng)的核心組件,是一種用于控制和數(shù)據(jù)處理的計(jì)算機(jī)硬件,其設(shè)計(jì)旨在嵌入特定設(shè)備中執(zhí)行專門任務(wù)。嵌入式主板如同是設(shè)備的“大腦”,主要功能是根據(jù)需要管理和控制設(shè)備
    的頭像 發(fā)表于 09-30 10:05 ?314次閱讀

    嵌入式linux開發(fā)的基本步驟有哪些?

    嵌入式Linux開發(fā)是一個(gè)復(fù)雜的過程,涉及到硬件選擇、操作系統(tǒng)移植、驅(qū)動(dòng)開發(fā)、應(yīng)用程序開發(fā)等多個(gè)方面。以下是嵌入式Linux開發(fā)的基本步驟,以及每個(gè)步驟的說明。 硬件選擇 在開始嵌入式Linux開發(fā)
    的頭像 發(fā)表于 09-02 09:11 ?345次閱讀

    嵌入式主板,你了解多少?

    嵌入式主板,也稱為嵌入式計(jì)算機(jī)主板,是一種專門設(shè)計(jì)用于嵌入式系統(tǒng)的計(jì)算機(jī)主板。與臺(tái)式機(jī)和筆記本電腦中使用的常規(guī)主板不同,嵌入式主板設(shè)計(jì)用于集成到更大的電子設(shè)備中,例如汽車、醫(yī)療設(shè)備或自
    的頭像 發(fā)表于 04-17 15:11 ?1388次閱讀

    嵌入式fpga是什么意思

    嵌入式FPGA是指將FPGA技術(shù)集成到嵌入式系統(tǒng)中的一種解決方案。嵌入式系統(tǒng)是一種為特定應(yīng)用而設(shè)計(jì)的計(jì)算機(jī)系統(tǒng),它通常包括處理器、內(nèi)存、外設(shè)接口等組件,并且被嵌入到更大的設(shè)備或系統(tǒng)中,
    的頭像 發(fā)表于 03-15 14:29 ?1168次閱讀

    fpga是嵌入式

    FPGA(現(xiàn)場可編程門陣列)不是嵌入式系統(tǒng),但FPGA在嵌入式系統(tǒng)中有著重要的應(yīng)用。
    的頭像 發(fā)表于 03-14 17:19 ?2088次閱讀

    嵌入式學(xué)習(xí)-ElfBoard ELF 1板卡- Uboot目錄結(jié)構(gòu)介紹

    :磁盤分區(qū)相關(guān)代碼 doc:里面存放了很多uboot相關(guān)文檔,這些文檔可以幫助我們理解和使用uboot drivers : 驅(qū)動(dòng)代碼 examples:示例程序 fs:文件系統(tǒng),支持嵌入式開發(fā)板常見
    發(fā)表于 01-26 15:24

    嵌入式Linux開發(fā)的三種方式

    嵌入式Linux開發(fā)主要有三種方式:裸機(jī)開發(fā)、SDK開發(fā)和驅(qū)動(dòng)開發(fā)。
    的頭像 發(fā)表于 01-22 14:22 ?899次閱讀

    嵌入式系統(tǒng)的應(yīng)用實(shí)例

    嵌入式系統(tǒng)的三個(gè)基本要素是嵌入性、專用性與計(jì)算機(jī)系統(tǒng)。
    的頭像 發(fā)表于 01-22 09:57 ?988次閱讀

    啥是嵌入式?嵌入式都有啥?薪資如何?前景如何

    嵌入式系統(tǒng)(Embedded Systems)是一種特殊類型的計(jì)算機(jī)系統(tǒng),被嵌入到其他設(shè)備或系統(tǒng)中,用于執(zhí)行特定的任務(wù)或控制特定的功能。這些系統(tǒng)通常設(shè)計(jì)用于特定的應(yīng)用領(lǐng)域,具有特定的硬件和軟件要求
    的頭像 發(fā)表于 01-17 16:39 ?755次閱讀
    啥是<b class='flag-5'>嵌入式</b>?<b class='flag-5'>嵌入式</b>都有啥?薪資如何?前景如何

    什么是嵌入式系統(tǒng)?嵌入式系統(tǒng)的具體應(yīng)用

    嵌入式,一般是指嵌入式系統(tǒng)。用于控制、監(jiān)視或者輔助操作機(jī)器和設(shè)備的裝置。
    的頭像 發(fā)表于 12-20 13:33 ?2342次閱讀

    定制嵌入式主板:滿足客戶的實(shí)際需求

    隨著物聯(lián)網(wǎng)、智能家居、智能工廠等應(yīng)用的不斷發(fā)展,嵌入式系統(tǒng)的應(yīng)用場景也越來越廣泛。嵌入式系統(tǒng)的核心部分是嵌入式主板,而定制化的嵌入式主板已經(jīng)成為了很多企業(yè)和項(xiàng)目的首選。本文將從以下幾個(gè)
    的頭像 發(fā)表于 11-24 11:51 ?840次閱讀
    定制<b class='flag-5'>嵌入式</b>主板:滿足客戶的實(shí)際需求

    嵌入式系統(tǒng)原理與設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《嵌入式系統(tǒng)原理與設(shè)計(jì).zip》資料免費(fèi)下載
    發(fā)表于 11-17 14:10 ?0次下載
    <b class='flag-5'>嵌入式</b>系統(tǒng)原理與設(shè)計(jì)