U-BOOT之一:BootLoader 的概念與功能

U-BOOT之一:BootLoader 的概念與功能

                             ——轉自《U-BOOT移植S3C2440完全手冊》

1.1嵌入式Linux 軟件結構與分佈

一般情況下嵌入式Linux 系統中的軟件主要分爲以下幾部分:

1) 引導加載程序:其中包括內部ROM 中的固化啓動代碼和BootLoader 兩部分。內部固化ROM 是廠家在芯片生產時候固化的,作用基本上是引導BootLoader。有的芯片比較複雜,比如Omap3 在flash 中沒有代碼的時候有許多啓動方式:USB、UART 或以太網等等。而S3C24x0 則很簡單,只有Norboot 和Nandboot。

2) Linux kernel drivers

3) 文件系統。包括根文件系統和建立於Flash 內存設備之上的文件系統(EXT4、UBI、CRAMFS 等等)。它是提供管理系統的各種配置文件以及系統執行用戶應用程序的良好運行環境及載體。

4) 應用程序。用戶自定義的應用程序,存放於文件系統之中。

在Flash 存儲器中,他們的分佈一般如下:

但是以上只是大部分情況下的分佈,也有一些可能根文件系統是initramfs,被一起壓縮到了內核映像裏,或者沒有Bootloader 參數區,等等。

1.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)。

而BootLoader 並不是Linux 才需要,而是幾乎所有運行操作系統的設備都需要。我們的PC 的BOIS 就是Boot Loader 的一部分(只是前期引導,後面一般還有外存中的各種BootLoader),對於Linux PC 來說,Boot Loader = BIOS + GRUB/LILO。

1.3 Boot Loader 的功能和選擇

綜上所述:BootLoader 是在操作系統內核啓動之前運行的一段小程序。通過這段程序,我們可以初始化硬件設備,從而將系統的軟硬件環境帶到一個合適的狀態,以便爲最終調用操作系統內核準備好正確的環境,最後從別處(Flash、以太網、UART)載入內核映像到主存並跳到入口地址。

由於BootLoader 需要直接操作硬件,所以它嚴重依賴於硬件,而且依據所引導的操作系統的不同,也有不同的選擇。對於嵌入式世界中更是如此。就S3C24x0 而言,如果是引導Linux,一般選用韓國的mizi 公司設計的vivi 或者DENX 軟件工程中心的Das 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 的代碼結構越來越合理,對於新功能的添加也十分容易。

*推薦閱讀:嵌入式系統 Boot Loader 技術內幕

 

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