一、Boot Loader的概念和功能

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,同樣支持多平臺。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章