1. 程式人生 > >uboot的基礎知識與linux啟動相關知識

uboot的基礎知識與linux啟動相關知識

uboot本質是一個裸機程式

***uboot在啟動時的作用:

主要是用來啟動作業系統的核心。
部署整個系統。
操作Flash等板子上硬體的驅動,初始化一部分硬體。
提供一個命令列介面供人進行互動操作。
PC機的啟動:上電後先執行BIOS程式(實際上就是Norflish),BIOS程式負責初始化DDR記憶體,初始化硬碟,再從硬碟之中將OS映象檔案讀取到DDR之中,然後跳轉至DDR中去執行OS直到啟動。

嵌入式linux的啟動過程:部署和啟動效仿PC機的啟動。
uboot程式部署在Flash,作業系統(OS)部署在Flash之中,用Flash代替了硬碟。
記憶體掉電無作用,cpu掉電不工作。
上電之後先執行uboot,uboot負責初始化DDR,初始化Flash,然後將OS映象檔案讀取到DDR之中,然後跳轉至DDR中去執行OS直到啟動。

對比:uboot————>BIOS  Flash————>硬碟

***uboot解決的問題:

由於硬體的不同,所以uboot必須進相應的改變從而實現成功移植的目的。
uboot的終極目標是:引導作業系統核心啟動並且給核心進行傳參。
uboot的會在指定的位置為linux核心準備一些啟動引數,核心啟動時在這個特定的位置去取uboot傳給他的引數,然後再核心之中解析這些引數,指導linux核心的啟動過程。

uboot的生命週期:uboot執行時別的程式不能同時執行,對CPU獨佔。
uboot一旦結執行束,不能再次回到uboot。

***uboot的工作方式:

本身是一個裸機程式,由若干個.c和.h檔案組成,最後編譯後生成一個uoboot.bin映象檔案。
有些程式需要互動,這就使得uboot有著和linux相似的shell,只是命令集不同而已。

***uboot的關鍵:命令和環境變數

命令:uboot的shell下可以被識別的各種命令。
uboot的環境變數和作業系統的環境變數工作原理和方式幾乎完全相同。
uboot的驅動管理幾乎完全和linux的驅動架構相同。
環境變數被認為是系統的全域性變數。
環境變數在程式執行時誕生,結束時死亡,被儲存在Flash中的一塊特殊的區域,可以通過程式更改其變數值。

***uboot的常見命令:

1.print/printenv:打印出系統所有的環境變數。
2.set name value :設定環境變數name為value  (僅僅只是更改了記憶體之中的環境變數)
3.儲存環境變數的改變:  saveenv/save        (利用save對映至flash)
4.movi指令是一個命令集,
movi read用來讀取iNand的到DDR中,movie write 將DDR內容寫入iNand中。

***bootm:啟動核心時同時給核心傳參,而GO命令啟動核心時不用傳參。
GO命令本來不是為了啟動核心設計的,其內部就是一個函式指標指向一個記憶體地址然後直接呼叫這個函式,本質就是PC直接跳轉至那個記憶體地址進行執行。GO命令可以被用在uboot中執行任何裸機程式。

***uboot的環境變數:

環境變數有兩份,一份在FLASH中,一份在記憶體之中。uboot啟動之後一次性從FLASH讀取所有的環境變數到DDR之中作為環境變數的初始值,每次使用時都是使用DDR之中的環境變數。

兩個重要的環境變數:
1.bootcmd:自動執行命令設定。    uboot的在啟動時會倒數bootdelay秒,uboot開機啟動時實際上就是執行了bootcmd這個環境變數的值對應的命令集。
可以通過set bootcmd改變bootcmd的值,saveenv進行儲存。

2.bootarge:uboot給kernel傳參。  

***DDR和FLASH:

uboot的FLASH分割槽:對於FALSH進行分塊管理。
在uboot之中沒有作業系統,所以對於FLASH的管理必須事先使用分割槽界定。
分割槽的方法在移植之前必須事先設定好

FLASH的分割槽:(掉電存在)
uboot:從FLASH的起始地址開始存放,分割槽的大小一般設計為512kb,或者1MB。
環境變數:緊貼著uboot進行存放,一般是32kb,1MB。
kernel:緊跟著環境變數存放,大小為3~5MB。
rootfs(根檔案系統):kernel啟動之後將自由分割槽內掛載到rootfs下使用。
注:uboot必須放在FLASH的開頭,其他分割槽可變。

DDR的分割槽:(掉電消失)
DDR記憶體的分割槽是在linux核心啟動之前進行部署管理整個記憶體空間。