uboot簡介

1、嵌入式Linux軟件結構與分佈
在一般情況下嵌入式Linux系統中的軟件主要分爲以下及部分:
(1)引導加載程序:其中包括內部ROM中的固化啓動代碼和Boot Loader兩部分。
而這個內部固化ROM是廠家在芯片生產時候固化的,作用基本上是引導Boot Loader。有的芯片比較複雜,比如Omap3,他在flash中沒有代碼的時候有許多啓動方式:USB、UART或以太網等等。而S3C24x0則很簡單,只有Norboot和Nandboot。
(2)Linux kernel 和drivers。
(3)文件系統。
包括根文件系統和建立於Flash內存設備之上的文件系統(EXT4、UBI、CRAMFS等等)。它是提供管理系統的各種配置文件以及系統執行用戶應用程序的良好運行環境的載體。
(4)應用程序。用戶自定義的應用程序,存放於文件系統之中。
在Flash 存儲器中,他們的 一般分佈如下:
 
但是以上只是大部分情況下的分佈,也有一些可能根文件系統是initramfs,被一起壓縮到了內核映像裏,或者沒有Bootloader參數區,等等。

2、在嵌入式Linux中爲什麼要有BootLoader
在linux內核的啓動運行除了內核映像必須在主存的適當位置,CPU還必須具備一定的條件:
 1. CPU 寄存器的設置: R0=0;
R1=Machine ID(即Machine Type Number,定義在linux/arch/arm/tools/mach-types);
R2=內核啓動參數在 RAM 中起始基地址;
 2. CPU 模式: 必須禁止中斷(IRQs和FIQs);
CPU 必須 SVC 模式;
 3. Cache 和 MMU 的設置: MMU 必須關閉;
指令 Cache 可以打開也可以關閉;
數據 Cache 必須關閉;
 
 
但是在CPU剛上電啓動的時候,一般連內存控制器都沒有配置過,根本無法在內存中運行程序,更不可能處在Linux內核的啓動環境中。爲了初始化CPU及其他外設,使得Linux內核可以在系統主存中跑起來,並讓系統符合Linux內核啓動的必備條件,必須要有一個先於內核運行的程序,他就是所謂的引導加載程序(Boot Loader)。
而Boot Loader並不是Linux才需要,是幾乎所有的運行操作系統的設備都具備的。我們的PC的BOIS就是Boot Loader的一部分(只是前期引導,後面一般還有外存中的各種Boot Loader),對於Linux PC來說,Boot Loader = BIOS + GRUB/LILO。

3、Boot Loader的功能和選擇
    通過上面的講述,我們可以知道:Boot Loader是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備,從而將系統的軟硬件環境帶到一個合適的狀態,以便爲最終調用操作系統內核準備好正確的環境,最後從別處(Flash、以太網、UART)載入內核映像並跳到入口地址。
由於BootLoader直接操作硬件,所以她嚴重依賴於硬件,而且依據所引導的操作系統的不同,也有不同的選擇對於嵌入式世界中更是如此。就S3C24x0而言,如果是引導Linux,一般選用韓國的mizi公司設計的vivi或者DENX軟件工程中心的U-boot,如果是引導Win CE,就選用Eboot。如果是開發StrongARM 構架下的LART,就可選用由Jan-Derk Bakker 和 Erik Mouw發佈的Blob(Boot Loader Object)。如果是要引導eCos系統,就可以選用同是Redhat公司開發的Redboot。
     所以在嵌入式世界中建立一個通用的 BootLoader 幾乎是不可能的,而有可能的是讓一個 Boot Loader代碼支持多種不同的構架和操作系統,並讓她方便移植。U-boot就是支持多平臺多操作系統的一個傑出代表。這也是爲什麼我喜歡用U-boot的原因,因爲如果在開發S3C2440時熟悉了U-boot,再轉到別的平臺的時候就可以很快地完成這個平臺下的U-boot移植,而且U-boot的代碼結構越來越合理,對於新功能的添加也十分容易。
     值得一提的是國內的一個開源項目maxwit中的g-bios也是一個不錯的開源BootLoader,同樣支持多平臺。




U-boot的起源

U-BootDas U-Boot的簡稱,其含義是Universal Boot Loader,是遵循GPL條款的開放源碼項目。一開始德國DENX軟件工程中心的Wolfgang Denk基於8xxROMFADSROM的源碼創建了PPCBoot工程項目,此後不斷添加處理器的支持。後來,Sysgo GmbhPPCBoot移植到ARM平臺上,創建了ARMBoot工程項目。然後以PPCBoot工程和ARMBoot工程爲基礎,創建了U-Boot工程,20021217日第一個版本U-Boot-0.2.0發佈,同時PPCBootARMboot停止維護。而今,U-Boot作爲一個主流、通用的Bootloader,成功地被移植到包括主流的PowerPCARMX86 MIPSNIOSXScale等體系結構的上百種開發板,成爲功能最多、靈活性最強,並且開發最積極的開源BootLoader。目前。U-Boot仍然由DENXWolfgang Denk維護。


U-boot的開發情況和資源

一開始U-boot的版本號是由X.Y.Z來表示的,從0.2.0一直到1.3.4,之後便開始使用年份加月份的表示方法,2008.11到現在的2010.3平均每3個多月出一個新版本,每次代碼的結構和定義都會有一些修正和改進。我從1.2.0開始移植U-bootS3C24x0,到現在的2010.03,發現U-boot的代碼越來越規整,功能越來越強,但是移植的難度反而越來越小,需要修改的地方越來越少。

而對於U-boot,不僅僅有主線版本,在U-bootGit代碼倉庫中還有各個CPU構架的分支版本,這些分支會在一定的時候將修改匯入主線。值得注意的是U-boot-V2,這是下一代的U-boot,代碼的構架比較新,現在正處在開發的階段,但針對S3C2440的支持似乎可以了,還沒有時間嘗試。

下面總結一下關於U-boot源代碼的網絡資源:

官方鏈接

德國DENX軟件工程中心主頁

http://www.denx.de/

 U-boot官方主頁(注意其中的郵件列表鏈接)

http://www.denx.de/wiki/U-Boot/WebHome

 U-boot官方源碼FTP下載

ftp://ftp.denx.de/pub/u-boot/

 U-boot官方Git代碼倉庫

http://git.denx.de/?p=u-boot.git

 針對S3C2440的修改

Openmoko手機的U-boot源碼Git

http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=refs/heads/stable

buserrorU-boot源碼Git(針對mini2440

http://repo.or.cz/w/u-boot-openmoko/mini2440.git

我的U-boot源碼Git(針對mini2440

http://github.com/tekkamanninja

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章