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