基于S3C44B0X的Bootloader設(shè)計與實現(xiàn)
1.引言
Bootloader(引[1]導(dǎo)加載) 程序[1]是系統(tǒng)加電后首先運(yùn)行的一段程序代碼,用來初始化硬件環(huán)境、改變處理器運(yùn)行模式和重組中斷向量,建立內(nèi)存空間的映射圖(有的CPU沒有內(nèi)存映射功能如 S3C44B0X ),將系統(tǒng)的軟、硬件環(huán)境帶到一個由用戶定制的特定狀態(tài),然后加載操作系統(tǒng)內(nèi)核。對于不使用操作系統(tǒng)的嵌入式系統(tǒng)而言,應(yīng)用程序的運(yùn)行同樣也需要依賴一個準(zhǔn)備好的軟、硬件環(huán)境,因此從這個意義上來講,BootLoader對于嵌入式系統(tǒng)是必需的。
Bootloader是依賴于目標(biāo)硬件實現(xiàn)的,主要包括以下兩方面[2]:
(1)每種嵌入式微處理器體系結(jié)構(gòu)都有不同的Bootloader.應(yīng)用比較廣泛的Bootloader有VIVI、U-Boot、Blob、RedBoot 等。有些BootLoader也可以支持多種體系結(jié)構(gòu)的嵌入式微處理器。如U-Boot同時支持ARM和MIPS體系結(jié)構(gòu)。
(2)Bootloader依賴于具體的嵌入式板級硬件設(shè)備的配置。比如板卡的硬件地址配置、微處理器的類型和其他外設(shè)的類型等。也就是說,即使是基于相同嵌入式微處理器構(gòu)建的不同嵌入式目標(biāo)板,要想讓運(yùn)行在一個板子上的Bootloader程序同樣運(yùn)行在另一個板子上,仍需要修改Bootloader的源程序。
作者在參與中國民用航空總局科技基金項目“機(jī)場噪聲自動監(jiān)測與數(shù)據(jù)傳輸?shù)难芯颗c實
現(xiàn)”的研發(fā)中,設(shè)計了一款基于S3C44B0X的ARM7核心板,并實現(xiàn)了其引導(dǎo)加載程序Bootloader.
2.ARM7核心板介紹
2.1ARM7核心板的構(gòu)成
作者設(shè)計的ARM7 核心板主要由CPU、電源管理、存儲單元、JTAG接口和串口五部分組成。圖1是其結(jié)構(gòu)圖。CPU這里用的是Samsung的S3C44BOX微處理器[3], 它是由Samsung Electronics Co.,Ltd為手持設(shè)備設(shè)計的低功耗、高度集成的基于ARM7TDMI核的微處理器,采用精簡指令系統(tǒng)(RISC)和三級流水線結(jié)構(gòu),且具有豐富的內(nèi)置部件。電源管理部分采用開關(guān)電源將AC220V轉(zhuǎn)換成DC5V,然后采用線性穩(wěn)壓電源LM1085將DC5V分別轉(zhuǎn)換成3.3V 的I/O口電源電壓和2.5V 的S3C44B0X內(nèi)核邏輯電壓。存儲單元由Flash存儲器和SDRAM存儲器構(gòu)成。Flash存儲器用的是SST公司的 39VF3201 CMOS FLASH,容量為4MB,16位數(shù)據(jù)寬度,可以重復(fù)擦寫。Flash存儲器主要用來存放已經(jīng)調(diào)試好的應(yīng)用程序、嵌入式操作系統(tǒng)和需要保存的用戶數(shù)據(jù)。 SDRAM存儲器選用的是SAMSUNG公司的8MB K4S641632H,16位數(shù)據(jù)寬度,工作電壓3.3V。由于SDRAM執(zhí)行速度比較快,其通常作為系統(tǒng)運(yùn)行時的主要區(qū)域,用來存放系統(tǒng)及用戶數(shù)據(jù)、堆棧等。另外,除了可用于下載和通信的串口,還包括用于調(diào)試的JTAG接口。
2.2S3C44B0X的存儲器映射
系統(tǒng)復(fù)位后,S3C44B0X的存儲空間映射圖[3]如圖2所示。ARM處理器S3C44B0X的系統(tǒng)存儲空間分為8段(Bank0-Bank7),因此可以配置8個存儲體,其中每個存儲體的大小為32MB,總共可達(dá)256MB的存儲空間??梢宰杂膳渲迷L問存儲體的數(shù)據(jù)總線寬度(8位/16位/32位),在本核心板中,F(xiàn)LASH和SDRAM存儲器的總線寬度設(shè)置為16位,在8個可配置存儲體中,Bank0-Bank5可支持ROM、SRAM類型的存儲器;Bank6和Bank7可支持ROM、SRAM以及FP/EDO/SDRAM等其他類型的存儲器,此處Bank0接 FLASH存儲器39VF3201(采用片選信號nGCS0),地址范圍為:0x00000000-0x003fffff.Bank6接8MB的 SDRAM存儲芯片K4S641632H(采用片選信號nGCS6),地址范圍為0x00000000-0x007fffff。其他存儲空間(Bank2、Bank3、Bank4、Bank5、Bank7)暫時保留。
3.Bootloader 啟動流程設(shè)計
系統(tǒng)加電或復(fù)位后,CPU通常都從CPU制造商預(yù)先安排的地址上取指令。如基于ARM7TDMI
內(nèi)核的CPU在復(fù)位時都從地址0x00000000處取它的第一條指令。而嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設(shè)備(比如:ROM、EEPROM 或FLASH等)被安排在這個起始地址上。因此在系統(tǒng)加電或復(fù)位后,處理器將首先執(zhí)行存放在起始地址處的程序。通過集成開發(fā)環(huán)境IDE可以將 BootLoader定位在起始地址開始的存儲空間內(nèi)。所以,BootLoader是系統(tǒng)加電后,操作系統(tǒng)內(nèi)核或用戶應(yīng)用程序運(yùn)行之前,首先必須運(yùn)行的一段代碼。對于ARM S3C44B0X微處理器,BootLoader是從0x00000000地址開始存放的,此地址采用了可引導(dǎo)的固態(tài)存儲設(shè)備FLASH。
從操作系統(tǒng)的角度看,BootLoader的總目標(biāo)就是正確的調(diào)用內(nèi)核來執(zhí)行。另外由于BootLoader的實現(xiàn)依賴于CPU的體系結(jié)構(gòu),因此大多數(shù)BootLoader都分為stage1和stage2兩部分[4],依賴CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在stage1中,而且通常都用匯編語言來實現(xiàn),以達(dá)到短小精悍的目的。而stage2通常用C語言來實現(xiàn),這樣可以實現(xiàn)復(fù)雜的功能,而且代碼會具有更好的可讀性和可移植性。
BootLoader的stage1通常包括以下步驟(以執(zhí)行的先后順序):
1) 硬件設(shè)備初始化。
2) 為加載BootLoader的stage2準(zhǔn)備RAM空間。
3) 拷貝BootLoader的stage2到RAM空間
4) 設(shè)置堆棧
5) 跳轉(zhuǎn)到stage2的C程序入口點(diǎn)
BootLoader的stage2通常包括以下步驟(以執(zhí)行的先后順序):
1) 初始化本階段要使用到的硬件設(shè)備
2) 檢測系統(tǒng)內(nèi)存映射
3) 將內(nèi)核映像和根文件系統(tǒng)映像從Flash讀到RAM
4) 為內(nèi)核設(shè)置啟動參數(shù)
5) 調(diào)用內(nèi)核
4.Bootloader的代碼實現(xiàn)
Bootloader的Stage1初始化流程圖如圖3所示. Stage1部分主要內(nèi)容及其代碼實現(xiàn):
/*中斷向量表用于處理異常情況,當(dāng)發(fā)生異常情況時,首先要保存當(dāng)前程序的返回地址和CPSR寄存器的值,然后進(jìn)入到相應(yīng)的異常向量地址。一般來說,在異常向量地址處放置無條件跳轉(zhuǎn)指令,使程序進(jìn)入相應(yīng)的異常處理過程。*/
_ENTRY
B ResetHandler ;reset vector
B UndefinedHandler ;Undefined instruction
B SWIHandler ;SWI
B PrefetchHandler ;Prefetch abort
B AbortHandler ;Data abort
B. ;Address exception
B IRQHandler ;IRQ
B FIQHandler ;FIQ
……
/*復(fù)位入口,切換到超級模式并禁止中斷。在整個Boot Loader的初始化過程中我們都不必響應(yīng)中斷,因此首先禁止系統(tǒng)的中斷。*/
MRS a1,CPSR
BIC a1,a1,#MODE_MASK
ORR a1,a1,#SUP_MODE
ORR a1,a1,#LOCKOUT ;關(guān)閉IRQ、FIQ中斷
MSR CPSR_cxsf,a1
LDR r0,=INTCON ;設(shè)置中斷模式,非向量中斷模式
LDR r1,=0x07 ;IRQ、FIQ中斷禁止
STR r1,[r0]
LDR r0,=INTMSK ;關(guān)閉所有中斷
LDR r1,=0x07ffffff
STR r1,[r0]
LDR r0,=SYSCFG ;使能回寫buffer和Cache
LDR r1,=0xE
STR r1,[r0]
……
/*當(dāng)必要的硬件初始化設(shè)置完畢后,接下來為核心代碼貯備RAM空間,包括RO、RW、ZI這3個段設(shè)置相應(yīng)的內(nèi)存映射向量,Bootloader先將ZI段請零,然后將RO段復(fù)制到RW段中。由于在我們采用的S3C44B0X微處理器里對于FLASH和RAM地址空間是使用的統(tǒng)一編址的,因此我們可以直接使用一個簡單循環(huán)來完成拷貝。*/
move_data :
LDR a1,=Image_RW_Base ;RW段運(yùn)行時的起始地址
LDR a2,=Image_RO_Limit ;RO段運(yùn)行時的存儲區(qū)域界限
LDR a3,=Image_ZI_Base ;ZI段運(yùn)行時的起始地址
CMP a1,a3
BEQ goto_main ;跳轉(zhuǎn)到C入口函數(shù)
move_loop : ;將RO段復(fù)制到RW段
LDR a4,[a2],#4
STR a4,[a1],#4
CMP a1,a3
BNE move_loop
在Bootloader stage1部分的最后是堆棧的設(shè)置,由于ARM有5種異常模式,每一種模式的堆棧指針寄存器(SP)都是獨(dú)立的,因此,對程序中需要用到的每一種模式都要給SP定義一個堆棧地址。以中止模式SP堆棧地址的定義為例:
ORR r1,r0,#ABORTMODE|NOINT
MSR cpsr_cxsf,r1
LDR sp,=AbortStack
至此,匯編語言程序段的任務(wù)基本完成,執(zhí)行命令BL Main 轉(zhuǎn)到由C語言編寫的核心程序,操作系統(tǒng)的內(nèi)核就可通過該C程序加載到RAM,獲得對系統(tǒng)的控制權(quán)。
Bootloader的Stage2部分主要用于導(dǎo)入操作系統(tǒng)內(nèi)核,一般通過串口建立連接,以獲取命令、打印與用戶的交流信息等,這里限于篇幅不再加以詳述。
5.結(jié)束語
作為嵌入式系統(tǒng)軟件的最底層,Bootloader是系統(tǒng)上電后啟動運(yùn)行的第一個程序,類似于PC機(jī)上的BIOS,主要負(fù)責(zé)整個硬件系統(tǒng)的初始化和軟件系統(tǒng)啟動的準(zhǔn)備工作。Bootloader是嵌入式系統(tǒng)開發(fā)的重點(diǎn)和難點(diǎn),也是系統(tǒng)運(yùn)行的一個基本前提條件。設(shè)計和實現(xiàn)一個好的Bootloader,可以大大增強(qiáng)系統(tǒng)的穩(wěn)定性,提高系統(tǒng)的實時性。
本論文創(chuàng)新觀點(diǎn)是:設(shè)計了具有較高性價比的ARM7核心板,結(jié)合實際應(yīng)用詳細(xì)分析了S3C44B0X的存儲空間映射,設(shè)計實現(xiàn)的基于S3C44B0X的 Bootloader具有典型代表性、良好的健壯性和可移植性,只須有針對性的稍加修改,就可應(yīng)用到各種類似的嵌入式平臺中,對進(jìn)一步開發(fā)復(fù)雜系統(tǒng)的 Bootloader具有很好的借鑒和啟發(fā)作用。
本項目經(jīng)濟(jì)效益(30萬元),包括Internet接入設(shè)備研制、GPRS網(wǎng)絡(luò)接入設(shè)備研制和GPRS-Internet網(wǎng)關(guān)軟件研制三部分。 Internet接入設(shè)備由數(shù)據(jù)前端采集盒和嵌入式ARM系統(tǒng)構(gòu)成,嵌入式ARM系統(tǒng)通過串口接收單片機(jī)發(fā)來的數(shù)據(jù)并將這些數(shù)據(jù)利用TCP/IP協(xié)議通過網(wǎng)線發(fā)送到噪聲數(shù)據(jù)中心。
參考文獻(xiàn):
[1]白偉平等.基于ARM的嵌入式Bootloader淺析[J].微計算機(jī)信息,2006,4-2:99-100
[2]夏靖波等.嵌入式系統(tǒng)原理與開發(fā)[M].西安電子科技大學(xué)出版社.2006
[3]Samsung Limited. S3C44BOX RISC Microprocessor Datasheet[EB/OL]. 2001
[4]孫天澤等.嵌入式設(shè)計與Linux驅(qū)動開發(fā)指南-基于ARM9處理器[M].電子工業(yè)出版社.2006