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