符秋麗,黃金龍
基于S3C2440的Bootloader的分析與設計
符秋麗,黃金龍
通過修改U-boot-1.1.6版本的源碼,設計并實現了從NAND Flash和NOR Flash兩種啟動的嵌入式Bootloader,并將其移植到S3C2440微處理器的嵌入式系統上。對bootloader的設計決定了實現的bootloader不僅僅起到加載內核鏡像這一基本功能,而是把bootloader看作是一個虛擬的小系統,讓其對硬件板級系統有更多的支持以為系統開發者提供方便。
Bootloader; S3C2440;Uboot
Bootloader(引導加載程序)就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境[1]。
然而,Bootloader對硬件嚴重依賴。它與處理器體系結構和具體嵌入式系統板級設備的配制密切相關,至今仍沒有一個完全通用的Bootloader可以直接應用于各種嵌入式系統中。本文介紹了在linux操作系統下,在基于S3C2440處理器和特定的嵌入式板級設備配置下,如何成功地移植U-boot,從而實現一個較完整的Bootloader。
1.1 硬件平臺介紹
如表1所示:

表1 目標板硬件平臺【2】
1.2 軟件環境
我們采用交叉開發模式,本文采用的交叉編譯器版本為:crosstools_3.4.5_softfloat,Bootloader是U-boot-1.1.6版本。
2.1 階段設計[3]
由于Bootloader的啟動可以是分階段的。在設計時,我們將bootloader分為兩個階段:階段1和階段2。分為兩個階段的原因是因為:(1)基于編程語言的考慮。階段1用主要用匯編語言,它主要進行與CPU核以及存儲設備密切相關的處理工作,進行一些必要的初始化工作,是一些依賴于CPU體系結構的代碼,為了增加效率以及因為涉及到協處理器的設置,只能用匯編編寫,這部分直接在FLASH中執行;階段2用一般的C語言,來實現一般的流程以及對板級的一些驅動支持,這部分會被拷貝到RAM中執行。(2)代碼具有更好的可讀性與移植性:若對于相同的CPU以及存儲設備,要增加外設支持,階段1的代碼可以維護不變,只對階段2的代碼進行修改;若要支持不同的CPU,則基礎代碼只需在階段1中修改。
2.2 地址規劃設計[4]
本文所使用的內核鏡像以及根文件系統鏡像都被加載到SDRAM中運行,這樣做是因為基于運行速度的考慮,盡管在嵌入式系統中內核鏡像與根文件系統鏡像也可以直接在ROM或FLASH這樣的固態存儲設備中直接運行,但是為了更能清楚的解釋其實現流程,在此虛擬地將其與啟動階段相對應起來,分成兩個鏡像:鏡像1和鏡像2。在本文中,將物理地址的0x00000000-0x00040000存放bootloader的鏡像,內核鏡像放在物理地址開始0x000c0000之后的1M空間內(內核鏡像一般都小于1M大小);在前面的階段設計中已經談到鏡像2在SDRAM中運行,這樣bootloader的啟動速度會大大加快,因此本文中將鏡像2放在SDRAM的起始地址0xa0000000處運行;而內核鏡像則規劃至物理地址的0xa0300000處執行。
2.3 模式設計
本文既支持啟動加載模式,也支持下載模式,具體思路為:在bootloader做完一些硬件初始化工作后,而在加載內核鏡像之前,先在一定的時間內等待有沒有用戶有鍵盤輸入,如果沒有,則為啟動加載模式,直接加載內核鏡像進行啟動;如果有,則進入命令行格式,這時開發者就可以根據自己的需要以及bootloader的支持情況,做一些其他的工作。模式的轉換設計主要在階段2中實現。
3.1 階段1的代碼實現
U-boot 的stage1 一般通過start.S 來實現,它是用匯編語言寫成的。由于一個可執行的Image 必須有一個入口點,并且只能有一個全局入口,通常這個入口放在ROM( Flash)的0x0 地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本文件u-boot.lds 來完成,u-boot.lds 文件用來設置U-boot 中各個目標文件的連接地址,通過ENT RY( _start ) 指定匯編程序入口點,從而進入匯編程序start.S。start.S 開始的一段代碼是處理器的異常處理向量表,接下來系統復位。
3.2 階段2的代碼實現
board.c 文件中的start _armboot 函數是C 代碼部分開始的函數,該函數首先通過初始函數表完成一系列系統的初始化操作,包括以下內容: CPU 的基本設置,開發板的基本初始化,初始化中斷,初始化環境變量,初始化波特率,串口通訊初始化,控制臺初始化第一階段,通知代碼已經運行到該處,配制可用的內存區。
完成上述初始化后,進入命令行循環,通過一個for 循環實現,for 循環中調用main.c 文件中的main_loop 函數。
4.3 移植過程及主要修改文件
在board下創建新目錄存放開發板相關代碼,并添加文件。
1)創建hjl2440目錄,在/board目錄下將smdk2410目錄復制為hjl2440目錄,建立自己的目標板,將smdk2410.c改名為hjl2440.c。
2) 將hjl2440目錄下的Makefile中的COBJS改為:COBJS :=hjl2440.o flash.o
3)/include/configs目錄下,將smdk2410.h復制為hjl2440.h。
4)修改頂層Makefile,增加:
hjl2440_config: unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t hjl2440 NULL s3c24X0
5)使用支持softfloat的交叉編譯器:(crosstools_3.4.1_soft)
修改頂層(u-boot-1.1.6目錄)Makefile 文件128行,修改:
ifeq ($(ARCH),arm)
CROSS_COMPILE=/opt/EmbedSky/crosstools_3.4.5_sof tfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux
endif
6)編譯測試
make hjl2440_config
make
7)清除上次編譯的結果:make mrproper 或者make clean
如果沒有錯誤,則會生成u-boot.bin二進制文件,但是這時生成的u-boot.bin還不能在本開發板上運行起來,必須針對我們自己的目標板對源碼做些修改。
下面介紹針對目標板對源碼所做的修改:
根據S3C2440特性修改/cpu/arm920t/start.S中的中斷屏蔽控制寄存器初值和對時鐘的設置。將重定向代碼段修改為NAND flash初始化并讀取U-boot到內存。然后根據S3C2440手冊修改/cpu/arm920t/start.S/s3c24x0/nand.c中NAND Flash控制寄存器的地址。
對SDRAM配置,修改lowlevel_init.S文件。lowlevel_init.S主要完成對內存的初始化,對于S3C2440只有BANK6和BANK7可以接內存,且這兩個BANK必須設置為相同值。由于本開發板采用的是64MSDRAM,且2440的內存控制器和2410有一些不同之處,因此需要參考2440和內存芯片手冊對其中某些常量的值做適當的修改。
對于網絡相關代碼,現在只需做稍微的改動,對于DM9000,需要注釋掉幾行代碼;對于NFS,只需要添加一個延時常量。
配置文件的修改,修改include/configs/hjl2440.h,在這里放上全局的宏定義,很多參數都要在這里修改,包括CPU、系統時鐘、RAM、FLASH配置信息、內存映射參數、U-boot環境變量、內核啟動參數等。主要參考目標資源的硬件手冊來修改。至此所有必須的修改就已完成。
當對源代碼修改完畢后,進入u-boot目錄下輸入如圖1所示:

圖1 u-boot目錄下輸入
#make hjl2440_config #make,之后就會生成u-boot.bin文件,通過JTAG將u- boot. bin 燒入Flash 中即可,拔掉JTAG接頭并復位目標板,超級終端就會打印出u-boot版本號等一系列的信息,這說明uboot就基本移植好了,u-boot是否移植成功,還要看是否能引導內核和掛載文件系統,如果終端打印出如下信息,說明移植成功。
Bootloader是操作系統和硬件的樞紐,它為操作系統內核的啟動提供了必要條件和參數。本文對bootloader的設計決定了實現的bootloader不僅僅起到加載內核鏡像這一基本功能,而是把bootloader看作是一個虛擬的小系統,讓其對硬件板級系統有更多的支持以為系統開發者提供方便。
[1] 孫瓊.嵌入式Linux應用程序開發詳解.[M]北京:人民郵電出版社,2006
[2] TQ2440底板原理圖.pdf [R]廣州天嵌公司 2010
[3] 王冰瑤.基于mini2440平臺的U-boot移植方法. [J]計算機系統應用.2013(8):155-158
[4] 詹榮開.嵌入式系統BootLoader技術內幕[R]
Design and Transplantation of Bootloader Based on S3C2440
Fu Qiuli,Huang Jinlong
(College of Computer and Electronic Information,Guang dong University of Petrochemical Technology,Maoming 525000,China)
By modifying the U-boot-1.1.6 version of the source code, the design and implementation of NAND Flash and NOR Flash from two to start the embedded Bootloader, and ported to the embedded system on S3C2440 microprocessor.in this paper,the design of bootloader to achieve the bootloader only played the basic function to load the kernel image,but the bootloader as a virtual system, make its have more support for system developers to provide convenient for hardware board level system.
Bootloader; S3C2440; Uboot
TP368
A
1007-757X(2014)01-0049-02
2013.12.25)
符秋麗(1981-),女,河南省周口市人,廣東石油化工學院,講師,碩士,研究方向:嵌入式系統,茂名,525000黃金龍,廣東石油化工學院教師,研究方向:嵌入式系統,茂名,525000