uboot移植之前的工作

1.1計算機系統的主要部件:計算機系統是有cpu來做核心進行運行的系統。典型的計算機系統有:pc機,嵌入式設備(手機、平板電腦、遊戲機),單片機(家用電器)。
1.2計算機系統組件部件非常多,不同的計算機系統組成部件也不同。但是所有的計算機系統運行時需要的主要核心部件都是3個東西:cpu+外部存儲器(Flash/硬盤) + 內部存儲器(DDR SDRAM/SDRAM/SRAM)。
1.3pc機的啓動過程:(1)典型的pc部署:BIOS程序部署在pc機主板上(隨主板出廠時已經預製了),操作系統部署在硬盤上,內存在掉電時無作用,cpu在掉電時不工作。(2)啓動過程:pc上電後先執行BIOS程序(實際上pc的BIOS就是NorFlash),BIOS程序負責初始化DDR內存,負責初始化硬盤,然後從硬盤上將OS鏡像讀取到DDR中,然後跳轉到DDR中去執行OS直到啓動(OS啓動後BIOS就無用了)。

1.4典型嵌入式linux系統啓動過程:(1)嵌入式系統的部署和啓動都是參考PC機的。只是設備上有一些差別。(2)典型嵌入式系統的部署:uboot程序部署在Flash(能作爲啓動設備的flash)上、OS部署在Flash(嵌入式系統中用Flash代替了硬盤)上、內存在掉電時無作用、CPU掉電不工作。(3)啓動過程:嵌入式系統上電後先執行uboot、然後uboot複製初始化DDR,初始化Flash,然後將OS從Flash中讀取到DDR中,然後啓動OS(OS啓動後uboot就成了Flash)。

總結:嵌入式系統和pc機的啓動過程幾乎沒有兩樣,只是BIOS成了uboot,硬盤成了Flash。

1.4android系統啓動過程:(1)android系統的啓動和linux系統(前面講的典型的嵌入式系統啓動)幾乎一樣。只是在內核啓動後加載根文件系統後就不同了。
(1)可以認爲啓動分爲2個階段:第一個階段是uboot到OS啓動;第二個階段是OS啓動後到rootfs加載到命令行執行;現在主要研究第一階段,android的啓動和linux的差別在第二階段。

總結:uboot到底幹嘛?
Uboot主要作用是用來啓動操作系統內核
Uboot還要負責部署整個計算機系統
Uboot中還有操作Flash等板子上硬盤的驅動。
Uboot還痛一個命令行界面供人來操作。



爲什麼是uboot?

1. uboot從哪裏來?
Uboot是sourceforge上的開源項目。
http://www.denx.de/wiki
uboot項目的作者,一個德國人最早發起的項目。
Uboot就是由一個人發起,然後由整個網絡上所有感興趣的人共同維護髮展而來得一個bootloader。
2. uboot發展歷程:
自己使用的小開源項目;被更多人認可使用;被soc廠商默認支持。Uboot經過多年發展,已經成爲事實上的業內bootloader標準。現在大部分的嵌入式設備都會默認使用uboot來做爲bootloader。
3. uboot版本號問題
早期的uboot的版本號類似於這樣:uboot1.3.4。後來版本號便成了類似uboot-2010.6
Uboot的核心部分幾乎沒有什麼變化,越新的版本支持的開發板越多而應,對於一個老版本的芯片來說,新舊版本的uboot並沒有差異。
4.uboot移植:uboot就是universal bootloader(通用的啓動代碼),通用的意思就是在各種地方都可以用。所有說uboot具有可移植性。Uboot具有在源代碼級別的移植能力,可以針對多個開發板進行移植,移植後就可以在這個開發板上使用了。
總結:uboot的出現時一種必然,如果沒有uboot也會有另一個ubootloader。
ftp://ftp.denx.de/pub/u-boot/

uboot必須解決那些問題?
1. 自身可開機直接啓動:一般的soc都支持多種啓動方式,sd啓動,norflash啓動,nandflash啓動等。。。uboot要開機啓動,必須根據具體的soc的啓動設計來設計uboot 。uboot必須進行和硬件相對應的代碼級別的更改和移植,才能夠保證可以從相應的啓動介質啓動。Uboot中第一階段start.S文件中具體處理了這一塊。
2. 能夠引導操作系統內核啓動並給內核傳參:uboot終極目標就是啓動目標。Linux在設計爲可以被傳參。我們可以在uboot中事先給linux內核準備一些啓動參數放在內存中特定位置然後傳給內核,內核啓動後回到這個特定位置去取uboot傳給他的參數,然後在內核中解析這些參數,這些參數將被用來指導linux內核的啓動過程。
3. 能夠提供系統部署功能:uboot必須能夠被人藉助而完成整個系統在Flash上燒錄下載工作。裸機中刷機就是利用uboot中的fastboot功能將各種鏡像燒錄到inad中,然後從inad啓動。
4. 能進行soc級和版級硬件管理:uboot中實現了一部分硬件的控制能力(uboot中初始化了一部分硬件),因爲uboot爲了完成一些任務必須讓這些硬件工作。譬如uboot要實現刷機必須能驅動INand,譬如uboot要在刷機是LCD上顯示進度條就必須能驅動LCD,譬如uboot能夠通過串口提供操作界面就必須驅動串口。譬如uboot要實現網絡功能必須驅動網卡芯片。 SOC級(串口)就是soc內部外設,板級就是soc外面開發板上面的硬件(譬如網卡,inand)。
5. uboot的生命週期:uboot的生命週期就是指:uboot什麼時候開始運行,什麼時候結束運行。Uboot本質上是一個裸機程序,一旦uboot開始soc就會淡村運行uboot.(就是uboot運行的時候別的程序是不可能同時運行的),一旦uboot結束運行則無法再回到uboot.(所以uboot啓動了內核後uboot自身就死了,要想再次開到uboot界面只能重啓系統。重啓並不是復活了剛纔的uboot,重啓只是uboot的另一生 。)uboot的入口和出口。入口就是開機自動啓動,uboot的唯一出口就是啓動內核。Uboot還可以執行很多別的任務,但是其他任務執行完後都可以回到uboot的命令行繼續執行uboot命令,而啓動內核命令一旦執行就回不來了。
6. 總結:一切都是爲了啓動內核。

Uboot工作方式:
1. 從裸機長鬚鏡像uboot.bin說起
a) Uboot的本質就是一個裸機程序,和我們裸機全集中寫的那些裸機程序xx.bin並沒有本質區別。如果非要說要有區別,那就是:我們寫的大本分小於16kb,而uboot大於16kb(一般uboot在180kb-400kb之間)
b) Uboot本身是一個開源項目,由若干個.c文件和.h文件組成,配置編譯之後會生產一個uboot.bin,這就是uboot這個裸機程序的鏡像文件。然後這個鏡像文件被合理的燒錄到啓動介質中拿給soc去啓動。也就是說uboot在沒有運行時表現爲uboot.bin,一般趟在啓動介質中。
c) Uboot運行時會被加載到內存中然後一條指令一條指令的拿給cpu去運行。
2. uboot命令式shell界面
a) 普通的裸機程序運行起來就直接執行了。執行時效果和代碼有關。
b) 有些程序需要和人進行互動,於是程序中就實現了一個shell,uboot就實現了一個shell。
注意:shell不是操作系統,和操作系統一點關係都沒有,linux中打開一個終端後就得到了一個shell,可以輸入命令回車執行。Uboot中的shell工作方式和linux中終端shell非常像。

3. 掌握uboot使用的2個關鍵點:命令和環境變量
Uboot啓動後大部分時間和工作都是在shell下完成的(譬如uboot要不是系統要在shell下輸命令,要設置環境變量也得在命令行底下,要啓動內核也要在命令行底下敲命令)。
命令就是uboot中shell中可以識別的各種命令。Uboot中由幾十個命令,其中一些常用另一些不常用。Uboot環境變量和操作系統的環境變量工作原理和方式幾乎完全相同。Uboot在設計時藉助了操作系統的設計理念。(命令行工作方式借鑑了linux終端命令行哦,環境變量借鑑了操作系統的環境變量,uboot的驅動管理幾乎完全照抄了linux的驅動框架)。
環境變量可以被認爲是系統的全局變量,環境變量名都是系統內置的(認識就認識,不認識就不認識,這部分是系統自帶的默認的環境變量,譬如PATH:但是也有一部分環境變量時自己添加了,自己添加的系統就不認識但我們自己認識)。系統和哦我們自己的程序在運行時可以通過讀取環境變量來知道程序的運行。這樣設計的好處就是靈活,譬如我們要讓一個程序更改運行方法,不用去重新修改程序代碼再重新編譯運行,而只要修改想要的環境變量就可以了。
環境變量就是運行時的配置屬性。

結合arm裸機部分進行理解和印證:
及時複習arm裸機中和現在降到的相關知識點,在複習中鞏固arm裸機中學到的。這過程中原來記了筆記非常容易。以及對照原來arm裸機中講到的相關部分,可以幫助理解當前講到的知識點。結合arm裸機中和現在講的,好好總結,思考。
Uboot常用命令1:類似linux終端的行緩衝命令行
行緩衝的意思:我們向終端命令行輸入命令的時候,這些命令沒有立即被系統識別,而是被緩衝到一個緩存區,當我們按下回車鍵後系統就認爲我們輸入完了,然後將緩衝區中所有剛纔輸入的作爲命令拿去分析處理。
Linux終端設計有3種緩衝機制:無緩衝,行緩衝,全緩衝。

譬如:printenv 命令可以簡化print setenv 簡化爲set

Uboot的每個命令都有事先規定好的各種格式。有些命令不帶參數,譬如:printenv/print命令:有些命令帶可選的參數(可以帶,也可以不帶,)有些就必須帶參數。(setenv命令)。

命令中的特殊符號:(單引號)uboot的有些命令帶的參數非常長,爲了告訴uboot這個非常長而且中間有好多個空格的東西是給他的一整個參數,所以用單引號將這個很長且中間有空格隔開的參數引起來。別的符號也許也有,而且有特殊依稀,當碰到uboot的命令行有特殊符號是要注意不是弄錯了,而可能又特別的含義。
命令族:好多個命令開頭都是用同一個命令關鍵字的,但是後面的參數不一樣,這些命令的功能和作用也不同。這就叫一個命令族。
同一個命令族中所有的命令都有極大的管理,譬如movi 開頭的命令族都和moviNand(emmc,inand)操作有關。

movi init - Initialize moviNAND and show card info
movi read {u-boot | kernel} {addr} - Read data from sd/mmc
movi write {fwbl1 | u-boot | kernel} {addr} - Write data to sd/mmc
movi read rootfs {addr} [bytes(hex)] - Read rootfs data from sd/mmc by size
movi write rootfs {addr} [bytes(hex)] - Write rootfs data to sd/mmc by size
movi read {sector#} {bytes(hex)} {addr} - instead of this, you can use "mmc read"
movi write {sector#} {bytes(hex)} {addr} - instead of this, you can use "mmc write"
第一個命令:printenv print
作用是打印出系統中所有的環境變量。
環境變量就好像程序的全局變量一樣。程序中任何地方都可以根據需要去調用或者更改環境變量(一般都是調用),環境變量和全局變量不同之處在於:全局變量的生命週期是在程序的一次運行當中,開始運行時誕生程序結束時死亡,下次運行程序時從頭開始;但是環境變量被存儲在Flash的另一塊專門區域,一旦我們在程序中保存了該環境變量,那麼下次開機時該環境變量的值將維持上一次更改保存後的值。

printenv
- print values of all environment variables
printenv name ...
print value of environment variable 'name'
setenv name value ...
- set environment variable 'name' to 'value ...'
setenv name
- delete environment variable 'name'

網絡測試指令:ping
命令用法:ping ip地址
注意:ping是測試開發板和主機之間的網絡連接,注意以下步驟:
1. 首先要插上網線。
2. 先試圖ping通主機windows。注意windows中有線網卡的地址設置(設置本地連接)。設置主機windows的本地連接IPv4地址爲192.168.1.10
3. 第三步確認開發板中uboot裏幾個網絡相關的環境變量的值對不對。最重要的是ipaddr(這個環境變量是開發板的ip地址)。這個地址必須和主機window在同一個網段。

主機地址(由子網掩碼來區分那一部分是網段地址,那一部分是ip地址)。在子網掩碼是255.255.255.0的情況下,192.168.1.10這個ip地址的前三部分(192.168.1)屬於網段地址,第4部分(10)屬於主機地址。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章