uboot在啟動時的作用:
主要是用來啟動操作系統(tǒng)的內核。
部署整個系統(tǒng)。
操作Flash等板子上硬件的驅動,初始化一部分硬件。
提供一個命令行界面供人進行交互操作。
PC機的啟動:上電后先執(zhí)行BIOS程序(實際上就是Norflish),BIOS程序負責初始化DDR內存,初始化硬盤,再從硬盤之中將OS鏡像文件讀取到DDR之中,然后跳轉至DDR中去執(zhí)行OS直到啟動。
嵌入式linux的啟動過程:部署和啟動效仿PC機的啟動。
uboot程序部署在Flash,操作系統(tǒng)(OS)部署在Flash之中,用Flash代替了硬盤。
內存掉電無作用,cpu掉電不工作。
上電之后先執(zhí)行uboot,uboot負責初始化DDR,初始化Flash,然后將OS鏡像文件讀取到DDR之中,然后跳轉至DDR中去執(zhí)行OS直到啟動。
對比:uboot————BIOS? Flash————硬盤
uboot解決的問題:
由于硬件的不同,所以uboot必須進相應的改變從而實現(xiàn)成功移植的目的。
uboot的終極目標是:引導操作系統(tǒng)內核啟動并且給內核進行傳參。
uboot的會在指定的位置為linux內核準備一些啟動參數(shù),內核啟動時在這個特定的位置去取uboot傳給他的參數(shù),然后再內核之中解析這些參數(shù),指導linux內核的啟動過程。
uboot的生命周期:uboot運行時別的程序不能同時運行,對CPU獨占。
uboot一旦結執(zhí)行束,不能再次回到uboot。
uboot的工作方式:
本身是一個裸機程序,由若干個.c和.h文件組成,最后編譯后生成一個uoboot.bin鏡像文件。 有些程序需要交互,這就使得uboot有著和linux相似的shell,只是命令集不同而已。
uboot的關鍵:命令和環(huán)境變量
命令:uboot的shell下可以被識別的各種命令。 uboot的環(huán)境變量和操作系統(tǒng)的環(huán)境變量工作原理和方式幾乎完全相同。 uboot的驅動管理幾乎完全和linux的驅動架構相同。 環(huán)境變量被認為是系統(tǒng)的全局變量。 環(huán)境變量在程序運行時誕生,結束時死亡,被儲存在Flash中的一塊特殊的區(qū)域,可以通過程序更改其變量值。
uboot的常見命令:
1.print/printenv:打印出系統(tǒng)所有的環(huán)境變量。
2.set name value :設置環(huán)境變量name為value? (僅僅只是更改了內存之中的環(huán)境變量)
3.保存環(huán)境變量的改變:? saveenv/save? ? ? ? (利用save映射至flash)
4.movi指令是一個命令集,
movi read用來讀取iNand的到DDR中,movie write 將DDR內容寫入iNand中。
bootm:啟動內核時同時給內核傳參,而GO命令啟動內核時不用傳參。
GO命令本來不是為了啟動內核設計的,其內部就是一個函數(shù)指針指向一個內存地址然后直接調用這個函數(shù),本質就是PC直接跳轉至那個內存地址進行運行。GO命令可以被用在uboot中執(zhí)行任何裸機程序。
DDR和FLASH:
uboot的FLASH分區(qū):對于FALSH進行分塊管理。
在uboot之中沒有操作系統(tǒng),所以對于FLASH的管理必須事先使用分區(qū)界定。
分區(qū)的方法在移植之前必須事先設定好
FLASH的分區(qū):(掉電存在)
uboot:從FLASH的起始地址開始存放,分區(qū)的大小一般設計為512kb,或者1MB。
環(huán)境變量:緊貼著uboot進行存放,一般是32kb,1MB。
kernel:緊跟著環(huán)境變量存放,大小為3~5MB。
rootfs(根文件系統(tǒng)):kernel啟動之后將自由分區(qū)內掛載到rootfs下使用。
注:uboot必須放在FLASH的開頭,其他分區(qū)可變。
DDR的分區(qū):(掉電消失)
DDR內存的分區(qū)是在linux內核啟動之前進行部署管理整個內存空間。