摘 要:在嵌入式開發中,由于Bootloader和硬件緊密相關,造成了移植Bootloader到一個新的硬件平臺要修改大量的代碼。針對這個問題,在Bootloader中引入硬件抽象層。硬件抽象層為各種硬件抽象出一個公共接口;Bootloader的硬件抽象層屏蔽了具體的底層硬件,增加了系統的可移植性,減少了移植的工作量。最后針對硬件抽象層實現方法上的不足,給出可行的解決辦法。
關鍵詞:Bootloader; 硬件抽象層; 嵌入式系統; 可移植性
中圖分類號:TP311文獻標識碼:A
文章編號:1004-373X(2010)08-0038-03
Design and Realization of Bootloader Based on Hardware Abstract Layer
ZHANG Jian, ZHOU Shu-lin, ZHU Wen-jing
(School of Computer Science and Engineering, Jiangsu University of Science and Technology, Jiangsu 212003, China)
Abstract:During development of embedded systems, lots of codes will be changed when Bootloader is moved to a new hardware because Bootloader is in close relationship with hardwares. The hardware abstract layer (HAL) is introduced into Bootloader, which can shield a certain bottom hardware, advance the portability and reduce the workload of Bootloader. In combination with the practical work, the viable solutions against the lack of implementation methed of the hardware abstract layer are given.
Key words:Bootloader; hardware abstract layer; embedded system; portability
0 引 言
近幾年來,嵌入式操作系統廣泛地用于各種移動設備,極大地促進了嵌入式設備的智能化[1]。由于設計原因,操作系統一般不能由自身完成加載啟動。早期,Bootloader就是為加載操作系統而設計開發的,功能比較單一,因而設計比較簡單。但是,隨著技術的發展,人們對Bootloader提出了新的要求,比如支持硬件Debug的,多重下載手段;支持多種操作系統、多種形式操作系統鏡像文件(壓縮的、非壓縮的)的引導;固化文件等,這些都造成了Bootloader越來越復雜。由于軟件模塊與硬件之間的接口形式復雜,直接導致了在嵌入式設備的開發中要花費大量的時間在移植Bootloader上。為了解決該問題,引入了一種對Bootloader屏蔽硬件細節的層次進來,這就是通常所說的硬件抽象層[2-3](Hardware Abstract Layer,HAL)。
1 嵌入式系統硬件抽象層原理
1.1 硬件抽象層的引入
Bootloader是一類比較特殊的計算機系統,自底向上包含了兩個部分[4],如圖1所示。
圖1 Bootloader的基本結構
(1) 硬件環境。它是Bootloader運行的硬件平臺,通常不同的應用有不同的硬件環境,硬件平臺的多樣性是嵌入式系統的一個特點。
(2) Bootloader啟動加載程序。主要用來完成操作系統的引導,同時提供多種命令接口,為操作系統固化、調試提供方便。
由于嵌入式系統的差異比較大,移植圖1結構的Bootloader要全面地修改代碼,增加了開發的時間和成本。如何簡潔有效地使Bootloader作用于各種不同的硬件環境,是必須解決的問題。這樣就將硬件抽象層引入到Bootloader,層次清晰,使得其移植變得相對容易。下面是使用了硬件抽象層后的Bootloader結構,如圖2所示。
圖2 帶有硬件的抽象層的Bootloader結構圖
硬件抽象層位于Bootloader和硬件平臺之間,包含與硬件相關的大部分功能。通過特定的上層接口與Bootloader進行交互,向上提供底層的硬件信息,并根據上層模塊的要求完成對硬件的直接操作。由于引入了硬件抽象層,Bootloader屏蔽了硬件的多樣性,不再直接面對具體的硬件環境,而是面向有這個中間層次所代表的邏輯上的硬件環境。所以將這個中間層次叫作硬件抽象層(Hardware Abstract Layer,HAL)。硬件抽象的引入極大地增強了Bootloader的通用化和可移植性。
1.2 硬件抽象層的特點
硬件抽象層的引入使得Bootloader可以有效地運行于多種平臺之上,從而Bootloader的各種功能模塊可以有效地使用各種硬件平臺。
由于硬件抽象層所處的特殊位置,因而其有以下兩個特點[5]:
(1) 硬件相關性。由于嵌入式系統所用的硬件具有多樣性,所以作為高層次軟件和硬件之間的接口,硬件抽象層必須為高層軟件提供控制硬件的方法。
(2) Bootloader相關性。不同的Bootloader具有自己的軟件層次結構,因此不同的Bootloader有不同的硬件接口形式。
實際上,硬件抽象層的功能包括硬件初始化和與硬件相關的設備驅動。
2 硬件抽象層的設計與實現
為了實現上述兩部分功能,設計一個完整的硬件抽象層需要完成兩部分工作:
(1) 設計初始化過程。用于完成Bootloader的初始化;
(2) 設計硬件相關的設備驅動。用于完成Bootloader上層模塊對具體硬件的操作。
2.1 Bootloader的初始化及硬件抽象層的功能
Bootloader的初始化包括了硬件初始化和軟件初始化的一個過程。初始化過程抽象為三個主要環節,按照自底向上、從硬件到軟件的次序依次是:片級初始化、板級初始化和系統級初始化[6]。
(1) 片級初始化。主要完成CPU的初始化,包括設置CPU的核心寄存器和控制寄存器,CPU的核心工作模式等。片級初始化把CPU上電時的缺省狀態逐步設置成為系統要求的工作狀態。這是一個純硬件的初始化過程。
(2) 板級初始化。完成CPU以外外圍設備的初始化。除此之外,還要設置某些軟件的數據結構參數,為隨后的系統級初始化和應用程序的運行建立硬件和軟件環境。它包含軟硬件兩部分在內的初始化過程。
(3) 系統級初始化。這是一個以軟件初始化為主的過程,主要進行Bootloader各種軟件功能模塊的初始化。比如簡單網絡協議模塊、MTD層等。
經過上面三個層次的操作,Bootloader運行所需的硬件軟件環境已經進行了正確設置,啟動完成。Bootloader能否成功啟動取決于前兩個初始化過程所設置的硬件和軟件環境,而且系統級初始化也是由硬件抽象層發起的。圖3為Bootloader的初始化過程。
2.2 硬件相關的設備驅動
硬件抽象層的另一個主要功能是硬件相關設備的驅動。與系統初始化過程相反,通常硬件相關設備的驅動程序初始化和使用是一個從高層到底層的過程[7]。
通常設備驅動程序不是直接由硬件抽象層使用,而是在Bootloader初始化過程中由系統通用驅動設備驅動程序將其關聯起來,隨后由高層模塊使用,實現對硬件設備的操作。圖4為調用設備驅動程序時系統各個層次之間的關系。
圖3 Bootloader初始化過程和硬件抽象層的功能
圖4 Bootloader 通用設備驅動程序與硬件抽象層的關系
3 設計實現硬件抽象層的方法
由于硬件抽象層具有硬件相關性和軟件相關性,是介于硬件和軟件之間的一個相關層次。因而設計時要考慮到硬件的相關問題,例如CPU模式設置、屏蔽中斷控制器、內存控制器初始化等,同時還要定義硬件抽象層和上層軟件的接口。系統初始化一開始使用匯編語言完成,因此還要求設計針對相應CPU的匯編啟動代碼。另外,由于各種Bootloader開發環境的不一樣,還要了解交叉工具鏈的特性,比如GCC,ADS等。
總之,開發設備抽象層要求具備比較為全面的軟、硬件知識和必要的編程經驗。由于設計實現的復雜性,實現特定Bootloader硬件抽象層是很少從零開始的,而是采用以下兩種較為快捷的方式。
(1) 方法一:以經典的實現為參考
在實現硬件抽象層時,首先選擇與硬件平臺最相似的參考設計,例如U-boot[8],它本身支持很多CPU和開發板,這些都是開發的最佳參考。針對特定硬件環境對參考的現實進行修改和增加,即可完成簡單硬件抽象層的實現。
下面以U-boot針對SMDK2410的硬件抽象層初始化過程為例,SMDK2410使用以ARM920T為核心的S3C2410芯片。U-boot的初始化層次結構非常清晰,與初始化過程相對應的目錄有:cpu,board,libxxx(xxx代表體系結構,arm、mips等)。
① cpu:該目錄包含各個體系結構的子目錄,例如S3C2410使用了ARM920T的ARM核。那么有arm920t的目錄與之對應。該目錄主要完成片級初始化。
② board:包含以所支持的開發板名稱命名的子目錄。改目錄主要完成板級初始化。
③ libxxx:包含控制系統初始化流程的主控文件,主要控制Bootloader啟動,最后啟動功能服務。
以參考已有的實現為切入點,針對初始化流程的具體環節,在對應的文件中進行某些參數的修改和功能的增加,以實現所要硬件抽象層的系統初始化功能。
(2) 方法二:使用Bootloader提供的實現模版
除了參考這個開發板的實現外,很多Bootloader還提供相應的實現模版,主要是指明了要編寫的文件,根據模版的提示完成特定應用的實現。
比較而言,第一種方法比較簡單快捷。因而在具體項目中,通常以第一種為主,同時使用第二種方法為輔。
在實現硬件抽象層時,可以采用以下兩種方法:
① “由下而上”地實現所要求的初始化操作:從片級初始化到系統初始化。
② “由頂而下”地設計硬件相關的驅動程序:從功能模塊開始,到通用驅動抽象層,再到相關的具體驅動,最后到底層具體的硬件設備。
4 結 語
由上述開發方法可以看出,目前硬件抽象層的設計與實現主要針對特定的文件進行修改。這種方法比較原始,它要求開發人員了解包含硬件抽象層在內的Bootloader各個功能模塊,以及對應的文件和相關參數的具體含義,還要求具備比較全面的軟硬件知識。直接修改相關文件容易造成代碼不一致和破壞其他代碼,而增加代碼維護的難度。隨著硬件平臺的日益復雜,開發難度越來越大,改進硬件抽象層開發方法和工具的創新已成為一個突出的問題。
解決這個問題的一個可行方法是:設計實現向導開發工具,一步一步指示完成相應的設計,并最終生成相應的實現代碼。該方法將極大地提高開發效率,同時減少維護代碼的成本。這種方法是目前的一個趨勢和研究方向。文中提出的實現方法,在U-boot移植項目中得到了實踐和應用,取得了很好的效果。
參考文獻
[1]柴東巖, 侯紫峰, 肖政. 移動終端Bootloader的設計與實現[J]. 計算機應用研究, 2008, 25(6): 1917-1920.
[2]俞甲子. 程序員的自我修養[M]. 北京: 電子工業出版社, 2009.
[3]王濤. 嵌入式系統硬件抽象層的實現[J]. 電子技術應用, 2001(10): 26-28.
[4]袁磊, 朱怡安, 蘭睛. 嵌入式系統Bootloader的設計與實現[J]. 計算機測量與控制, 2009, 17(2): 389-391.
[5]裴科, 張剛, 靳榮浩. 具有多重下載接口的Bootloader設計[J]. 計算機應用研究, 2007, 24(12): 210-213.
[6]張起貴, 裴科, 張剛, 等. 基于不同類型FLASH-ROM的Bootloader設計[J]. 計算機工程與應用, 2007, 43(33): 112-114.
[7]楊潔, 趙剛. 嵌入式系統中Bootloader的編譯與移植[J]. 四川大學學報:自然科學版, 2007(4): 836-839.
[8]The DENX U-boot and Linux Guide (DULG) for canyonlands[EB/OL]. \\. http:// www. denx. de/wiki/DULG/Manual.
[9]劉磊, 張鳳荔, 秦志光. 基于U-boot構建嵌入式Linux的Bootloader[J]. 計算機應用研究, 2007, 24(2): 238-240.
[10]王恒, 王颋, 王泉, 等. 基于Bootloader的可靠嵌入式軟件遠程更新機制[J]. 微計算機信息, 2007, 22(32): 57-59.