符秋麗,黃金龍
基于S3C2440的Bootloader的分析與設(shè)計(jì)
符秋麗,黃金龍
通過修改U-boot-1.1.6版本的源碼,設(shè)計(jì)并實(shí)現(xiàn)了從NAND Flash和NOR Flash兩種啟動的嵌入式Bootloader,并將其移植到S3C2440微處理器的嵌入式系統(tǒng)上。對bootloader的設(shè)計(jì)決定了實(shí)現(xiàn)的bootloader不僅僅起到加載內(nèi)核鏡像這一基本功能,而是把bootloader看作是一個虛擬的小系統(tǒng),讓其對硬件板級系統(tǒng)有更多的支持以為系統(tǒng)開發(fā)者提供方便。
Bootloader; S3C2440;Uboot
Bootloader(引導(dǎo)加載程序)就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境[1]。
然而,Bootloader對硬件嚴(yán)重依賴。它與處理器體系結(jié)構(gòu)和具體嵌入式系統(tǒng)板級設(shè)備的配制密切相關(guān),至今仍沒有一個完全通用的Bootloader可以直接應(yīng)用于各種嵌入式系統(tǒng)中。本文介紹了在linux操作系統(tǒng)下,在基于S3C2440處理器和特定的嵌入式板級設(shè)備配置下,如何成功地移植U-boot,從而實(shí)現(xiàn)一個較完整的Bootloader。
1.1 硬件平臺介紹
如表1所示:
表1 目標(biāo)板硬件平臺【2】
1.2 軟件環(huán)境
我們采用交叉開發(fā)模式,本文采用的交叉編譯器版本為:crosstools_3.4.5_softfloat,Bootloader是U-boot-1.1.6版本。
2.1 階段設(shè)計(jì)[3]
由于Bootloader的啟動可以是分階段的。在設(shè)計(jì)時,我們將bootloader分為兩個階段:階段1和階段2。分為兩個階段的原因是因?yàn)椋海?)基于編程語言的考慮。階段1用主要用匯編語言,它主要進(jìn)行與CPU核以及存儲設(shè)備密切相關(guān)的處理工作,進(jìn)行一些必要的初始化工作,是一些依賴于CPU體系結(jié)構(gòu)的代碼,為了增加效率以及因?yàn)樯婕暗絽f(xié)處理器的設(shè)置,只能用匯編編寫,這部分直接在FLASH中執(zhí)行;階段2用一般的C語言,來實(shí)現(xiàn)一般的流程以及對板級的一些驅(qū)動支持,這部分會被拷貝到RAM中執(zhí)行。(2)代碼具有更好的可讀性與移植性:若對于相同的CPU以及存儲設(shè)備,要增加外設(shè)支持,階段1的代碼可以維護(hù)不變,只對階段2的代碼進(jìn)行修改;若要支持不同的CPU,則基礎(chǔ)代碼只需在階段1中修改。
2.2 地址規(guī)劃設(shè)計(jì)[4]
本文所使用的內(nèi)核鏡像以及根文件系統(tǒng)鏡像都被加載到SDRAM中運(yùn)行,這樣做是因?yàn)榛谶\(yùn)行速度的考慮,盡管在嵌入式系統(tǒng)中內(nèi)核鏡像與根文件系統(tǒng)鏡像也可以直接在ROM或FLASH這樣的固態(tài)存儲設(shè)備中直接運(yùn)行,但是為了更能清楚的解釋其實(shí)現(xiàn)流程,在此虛擬地將其與啟動階段相對應(yīng)起來,分成兩個鏡像:鏡像1和鏡像2。在本文中,將物理地址的0x00000000-0x00040000存放bootloader的鏡像,內(nèi)核鏡像放在物理地址開始0x000c0000之后的1M空間內(nèi)(內(nèi)核鏡像一般都小于1M大?。辉谇懊娴碾A段設(shè)計(jì)中已經(jīng)談到鏡像2在SDRAM中運(yùn)行,這樣bootloader的啟動速度會大大加快,因此本文中將鏡像2放在SDRAM的起始地址0xa0000000處運(yùn)行;而內(nèi)核鏡像則規(guī)劃至物理地址的0xa0300000處執(zhí)行。
2.3 模式設(shè)計(jì)
本文既支持啟動加載模式,也支持下載模式,具體思路為:在bootloader做完一些硬件初始化工作后,而在加載內(nèi)核鏡像之前,先在一定的時間內(nèi)等待有沒有用戶有鍵盤輸入,如果沒有,則為啟動加載模式,直接加載內(nèi)核鏡像進(jìn)行啟動;如果有,則進(jìn)入命令行格式,這時開發(fā)者就可以根據(jù)自己的需要以及bootloader的支持情況,做一些其他的工作。模式的轉(zhuǎn)換設(shè)計(jì)主要在階段2中實(shí)現(xiàn)。
3.1 階段1的代碼實(shí)現(xiàn)
U-boot 的stage1 一般通過start.S 來實(shí)現(xiàn),它是用匯編語言寫成的。由于一個可執(zhí)行的Image 必須有一個入口點(diǎn),并且只能有一個全局入口,通常這個入口放在ROM( Flash)的0x0 地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本文件u-boot.lds 來完成,u-boot.lds 文件用來設(shè)置U-boot 中各個目標(biāo)文件的連接地址,通過ENT RY( _start ) 指定匯編程序入口點(diǎn),從而進(jìn)入?yún)R編程序start.S。start.S 開始的一段代碼是處理器的異常處理向量表,接下來系統(tǒng)復(fù)位。
3.2 階段2的代碼實(shí)現(xiàn)
board.c 文件中的start _armboot 函數(shù)是C 代碼部分開始的函數(shù),該函數(shù)首先通過初始函數(shù)表完成一系列系統(tǒng)的初始化操作,包括以下內(nèi)容: CPU 的基本設(shè)置,開發(fā)板的基本初始化,初始化中斷,初始化環(huán)境變量,初始化波特率,串口通訊初始化,控制臺初始化第一階段,通知代碼已經(jīng)運(yùn)行到該處,配制可用的內(nèi)存區(qū)。
完成上述初始化后,進(jìn)入命令行循環(huán),通過一個for 循環(huán)實(shí)現(xiàn),for 循環(huán)中調(diào)用main.c 文件中的main_loop 函數(shù)。
4.3 移植過程及主要修改文件
在board下創(chuàng)建新目錄存放開發(fā)板相關(guān)代碼,并添加文件。
1)創(chuàng)建hjl2440目錄,在/board目錄下將smdk2410目錄復(fù)制為hjl2440目錄,建立自己的目標(biāo)板,將smdk2410.c改名為hjl2440.c。
2) 將hjl2440目錄下的Makefile中的COBJS改為:COBJS :=hjl2440.o flash.o
3)/include/configs目錄下,將smdk2410.h復(fù)制為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)清除上次編譯的結(jié)果:make mrproper 或者make clean
如果沒有錯誤,則會生成u-boot.bin二進(jìn)制文件,但是這時生成的u-boot.bin還不能在本開發(fā)板上運(yùn)行起來,必須針對我們自己的目標(biāo)板對源碼做些修改。
下面介紹針對目標(biāo)板對源碼所做的修改:
根據(jù)S3C2440特性修改/cpu/arm920t/start.S中的中斷屏蔽控制寄存器初值和對時鐘的設(shè)置。將重定向代碼段修改為NAND flash初始化并讀取U-boot到內(nèi)存。然后根據(jù)S3C2440手冊修改/cpu/arm920t/start.S/s3c24x0/nand.c中NAND Flash控制寄存器的地址。
對SDRAM配置,修改lowlevel_init.S文件。lowlevel_init.S主要完成對內(nèi)存的初始化,對于S3C2440只有BANK6和BANK7可以接內(nèi)存,且這兩個BANK必須設(shè)置為相同值。由于本開發(fā)板采用的是64MSDRAM,且2440的內(nèi)存控制器和2410有一些不同之處,因此需要參考2440和內(nèi)存芯片手冊對其中某些常量的值做適當(dāng)?shù)男薷摹?/p>
對于網(wǎng)絡(luò)相關(guān)代碼,現(xiàn)在只需做稍微的改動,對于DM9000,需要注釋掉幾行代碼;對于NFS,只需要添加一個延時常量。
配置文件的修改,修改include/configs/hjl2440.h,在這里放上全局的宏定義,很多參數(shù)都要在這里修改,包括CPU、系統(tǒng)時鐘、RAM、FLASH配置信息、內(nèi)存映射參數(shù)、U-boot環(huán)境變量、內(nèi)核啟動參數(shù)等。主要參考目標(biāo)資源的硬件手冊來修改。至此所有必須的修改就已完成。
當(dāng)對源代碼修改完畢后,進(jìn)入u-boot目錄下輸入如圖1所示:
圖1 u-boot目錄下輸入
#make hjl2440_config #make,之后就會生成u-boot.bin文件,通過JTAG將u- boot. bin 燒入Flash 中即可,拔掉JTAG接頭并復(fù)位目標(biāo)板,超級終端就會打印出u-boot版本號等一系列的信息,這說明uboot就基本移植好了,u-boot是否移植成功,還要看是否能引導(dǎo)內(nèi)核和掛載文件系統(tǒng),如果終端打印出如下信息,說明移植成功。
Bootloader是操作系統(tǒng)和硬件的樞紐,它為操作系統(tǒng)內(nèi)核的啟動提供了必要條件和參數(shù)。本文對bootloader的設(shè)計(jì)決定了實(shí)現(xiàn)的bootloader不僅僅起到加載內(nèi)核鏡像這一基本功能,而是把bootloader看作是一個虛擬的小系統(tǒng),讓其對硬件板級系統(tǒng)有更多的支持以為系統(tǒng)開發(fā)者提供方便。
[1] 孫瓊.嵌入式Linux應(yīng)用程序開發(fā)詳解.[M]北京:人民郵電出版社,2006
[2] TQ2440底板原理圖.pdf [R]廣州天嵌公司 2010
[3] 王冰瑤.基于mini2440平臺的U-boot移植方法. [J]計(jì)算機(jī)系統(tǒng)應(yīng)用.2013(8):155-158
[4] 詹榮開.嵌入式系統(tǒng)BootLoader技術(shù)內(nèi)幕[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-),女,河南省周口市人,廣東石油化工學(xué)院,講師,碩士,研究方向:嵌入式系統(tǒng),茂名,525000黃金龍,廣東石油化工學(xué)院教師,研究方向:嵌入式系統(tǒng),茂名,525000