解析S3C44B0X上應用的一款Boot Loader
一個完整的嵌入式系統(tǒng)包括嵌入式微處理器和外圍支撐硬件,以及嵌入式操作系統(tǒng)、系統(tǒng)軟件和應用軟件構成。在嵌入式系統(tǒng)中,移植一款合適的操作系統(tǒng)非常重要,而系統(tǒng)的引導程序就顯得尤為重要。這段運行于操作系統(tǒng)內(nèi)核運行之前,初始化硬件設備,將系統(tǒng)的軟硬件環(huán)境帶到一個合適狀態(tài)的小程序就是Boot Loader。
本文引用地址:http://www.ex-cimer.com/article/80626.htmBoot Loader的概念及功能
在以ARM為代表的嵌入式系統(tǒng)中,操作系統(tǒng)內(nèi)核運行前的硬件初始化、建立內(nèi)核鏡像等都是由Boot Loader來完成的。在PC機上,最先啟動的是主板上的BIOS,BIOS負責對硬件初始化,給操作系統(tǒng)提供硬件的接口函數(shù)等等,但在嵌入式操作系統(tǒng)中并沒有BIOS,因此整個嵌入式操作系統(tǒng)的加載啟動任務就完全由Boot Loader來完成。
Boot Loader通常存放于目標平臺的非易失存儲介質中,主要用于完成由硬件啟動到操作系統(tǒng)啟動的過渡,能夠在上電后對SDRAM、CACHE、FLASH等硬件部分進行檢測,建立內(nèi)存空間的映射圖和內(nèi)核鏡像,建立通訊通道和調(diào)試通道等,還能夠提供Shell Menu檢測設置菜單和相應的檢測程序,引導操作系統(tǒng)及應用程序,從而為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。
目前,嵌入式系統(tǒng)中廣泛應用的UBoot、vivi、blob、armboot等Boot Loader在原有功能的基礎上,增加了更多的功能并大大增強了移植性。嵌入式系統(tǒng)中硬件的種類繁多,差距較大,而Boot Loader是嚴重依賴于硬件而實現(xiàn)的。不同的CPU體系需要不同的Boot Loader,即便是同一種體系結構,由于其它硬件設備配置的不同,如板卡硬件地址的分配、RAM芯片的型號等,也需要對Boot Loader作一定的修改才能使用。因此,開發(fā)人員需針對不同的處理器和開發(fā)板,對Boot Loader進行定制,來實現(xiàn)不同的功能。
Boot Loader的操作模式
Boot Loader通常包括“啟動加載(Boot loading)”和“下載(Downloading)”兩種模式。這兩種操作模式僅對開發(fā)人員具有一定的意義。
?啟動加載模式:Boot Loader從目標機上的固態(tài)存儲設備上將操作系統(tǒng)加載到RAM中運行,無需用戶介入。此模式是Boot Loader正常的工作模式。
?下載模式:在這種模式下,目標機上的Boot Loader通過串口連接或網(wǎng)絡連接等手段從主機上下載文件到目標機的RAM中,然后再燒寫到目標機上的固態(tài)存儲設備中。通常在第一次安裝內(nèi)核與根文件系統(tǒng)以及系統(tǒng)的更新時使用此模式。
Boot Loader的具體實現(xiàn)
硬件配置
本文以UP-NetARM3000為例來介紹Boot Loader的工作機理和運行流程。UP-NetARM3000使用的是三星公司生產(chǎn)的S3C44B0X芯片,這是三星公司推出的一款高性價比和高性能的微控制器。它具有32位的ARM7TDMI內(nèi)核,外部時鐘為8MHz,內(nèi)部倍頻最高可達72MHz,工作頻率為64MHz。S3C44B0X通過提供全面的、通用的片上外設,大大減少了系統(tǒng)中處理器以外的元器件配置,從而使系統(tǒng)的成本大大降低,它集成的各種片上功能包括:8KB Cache、擴展內(nèi)存控制器、2通道UART帶有握手協(xié)議、1通道SIO、2個通用DMA、2個外設用DMA、外部存儲控制器、LCD控制器、IIC/IIS總線接口、5個通道PWM定時器和一個內(nèi)部定時器、看門狗定時器、71個通用I/O口、8個外部中斷源、8通道10位ADC、片上PLL時鐘產(chǎn)生器等。
Boot Loader的啟動流程
大多數(shù)Boot Loader通常都分為Stage1和Stage2兩大部分。Stage1通常由匯編語言編寫,即Boot Loader的啟動代碼,旨在對部分硬件設備進行初始化。Stage2即Boot Loader的主代碼,為了實現(xiàn)更加復雜的功能,使代碼具有更好的可讀性和可移植性,通常由C語言來實現(xiàn),主要用來加載操作系統(tǒng)內(nèi)核。 具體啟動流程如圖1所示。
· Stage1部分
設置CPU的速度、時鐘頻率及中斷控制寄存器
Boot Loader的啟動代碼首先定義了一個全局入口,然后對異常向量進行設置。由于Boot Loader嚴重的依賴于硬件而實現(xiàn),因此根據(jù)CPU體系結構和具體的硬件配置來設置CPU的速度、時鐘頻率及中斷控制寄存器。除完成上述功能,啟動代碼還需要實現(xiàn)禁止看門狗定時器、設置時鐘控制寄存器、設置鎖相環(huán)控制寄存器、使能所有功能單元塊時鐘等功能。另外,系統(tǒng)中斷的設置也是在這部分實現(xiàn)的,主要是中斷向量表和IRQ中斷入口地址的設置。
//設置處理器時鐘PLL的LOCKTIME
ldr r0,=LOCKTIME
ldr r1,=0xfff
str r1,[r0]
//設置時鐘頻率
ldr r0,=PLLCON ldr
r1,= ((M_DIV<<12)+(P_DIV<<4)+ S_DIV)
str r1,[r0]
存儲器的分配
S3C44B0X的存儲系統(tǒng)具有一些主要特征,如:支持數(shù)據(jù)存儲的大、小端選擇;地址空間具有8個存儲體,每個存儲體可達32MB;對所有存儲體的訪問大小均可以進行改變;7個存儲器的起始地址固定,1個存儲器的起始地址可變。在本文介紹的這款Boot Loader中,啟動代碼通過對BUSWIDTH的賦值來使能各個存儲器。其具體對應情況如右面所示:
啟動代碼還有一個重要的任務—初始化內(nèi)存控制寄存器,它主要通過設置13 個從0x01c80000開始的寄存器來實現(xiàn),包括BWSCON總線寬度與等待狀態(tài)控制寄存器、BANKCONn塊控制寄存器。標號SMRDATA處為將要賦予內(nèi)存控制寄存器的具體值。以ResetHandler標號地址為參照,根據(jù)其偏移地址推算出SMRDATA標號地址的實際位置,然后讀取該處的數(shù)據(jù)對內(nèi)存控制寄存器進行賦值。
adr r0, ResetHandler //將ResetHandler在代碼中的實際地址加載到r0
ldr r1,=Resethandler //將ResetHandler鏈接時決定的值放入r1
sub r0, r1, r0,
ldr r0,=SMRDATA //設定存儲器控制寄存器
ldmia r0,{r1-r13}
ldr r0,=0x01c80000 //內(nèi)存寄存器組第一個寄存器基地址
stmia r0,{r1-r13}
形成可執(zhí)行文件
在嵌入式系統(tǒng)應用程序中,可執(zhí)行文件通常包括RO(Read_Only)段、RW(Read_Write)段和BSS段。當需要燒寫內(nèi)存中的映像文件到FLASH中時,通常都會把Boot Loader代碼先移到FLASH的高地址空間中,因為通常RO的地址都是0x0,防止在燒寫時覆蓋本來在FLASH中已有的Boot Loader代碼。程序編譯、鏈接時要求編譯器設置的Read_Only地址要和最終代碼下載的地址相同,如圖2所示。
Boot Loader映像文件最終運行的地址空間是0Bank,因此將RO Base設置為0x0,RW Base設置為0x0c60000,經(jīng)編譯后生成bin格式的可執(zhí)行文件燒寫到FLASH0地址處。在程序運行之前,RO段和RW段全部放在FLASH中,RO段可以直接在FLASH中運行,而RW必須調(diào)入SDRAM中才可以運行,因此,程序運行過程中RO段保持已設置完畢的0x0地址不變,而必須將RW段拷貝到RW Base即0x0c60000地址處,并將ZI段進行零初始化。
LDR r0, =|Image$$RO$$Limit|
LDR r1, =|Image$$RW$$Base|
LDR r3, =|Image$$ZI$$Base|
CMP r0, r1 //對R0和R1進行比較
BEQ %F1
0 CMP r1, r3 //拷貝RW段的數(shù)據(jù)到RW Base
LDRCC r2, [r0], #4 //LDRCC r2, [r0] + ADD r0, r0, #4
STRCC r2, [r1], #4 //STRCC r2, [r1] + ADD r1, r1, #4
BCC %B0
1 LDR r1, =|Image$$ZI$$Limit| //ZI段的存儲區(qū)域界限
MOV r2, #0
2 CMP r3, r1 //ZI段0初始化
STRCC r2, [r3], #4
BCC %B2
·Stage2部分
初始化硬件
Boot Loader主程序對串口進行調(diào)試并對本階段所涉及的硬件進行檢測后,通過串口下載鏡像到目標機中。主代碼中定義了LCD_Test()、LED_Test()、ADTest()、KeyTest()、BootSystem()等函數(shù)測試部分硬件的功能。以AD的檢測函數(shù)為例簡要介紹檢測函數(shù)功能具體的實現(xiàn)。ADTest_Loop()是針對AD硬件的操作函數(shù),而Set_UartLoopFunc()函數(shù)是把ADTest_Loop()設置到串口輪詢函數(shù)數(shù)組中(串口輪詢函數(shù)數(shù)組中還包括其他的檢測函數(shù)),AD檢測函數(shù)在對目標進行操作的同時查詢是否有停止命令,如果Uart_Getch()函數(shù)沒有查詢到串口有輸入的停止命令,調(diào)用串口輪詢數(shù)組中的其他函數(shù),否則立刻返回。
void ADTest()
{int index;
Uart_Printf("nTest AD from channel 0 to 3. Press any key returnn");
init_ADdevice();
index=Set_UartLoopFunc(ADTest_Loop);
Uart_Getch(0);
Clear_UartLoopFunc(index);
void ADTest_Loop()
{static int count=0; int i; count++;
if(count<50000)
return;
count=0;
for(i=0;i<4;i++){
Uart_Printf("%8AD%d=%4.4d",i,GetADresult(i));}}
檢測內(nèi)存及引導系統(tǒng)
在Boot Loader的主程序中需要檢測重要的硬件——內(nèi)存,檢測完畢后會分別通過串口和LCD輸出提示信息。接下來會等待查詢是否有鍵按下,當沒有鍵按下時,正常引導操作系統(tǒng),否則顯示Shell Menu。
Boot Loader程序在獲得系統(tǒng)的控制權之后,對關鍵硬件檢測并且沒有發(fā)現(xiàn)故障,控制臺也沒有發(fā)出啟用Shell Menu檢測菜單的情況下,根據(jù)文件系統(tǒng)的管理和支持,從NAND FLASH中讀取操作系統(tǒng)或應用程序的代碼到SDRAM的指定位置,然后把程序指針轉移到該位置,從而使操作系統(tǒng)獲得控制權,完成引導過程。
static void(*run)(void)=(void(*)(void))DOWNLOAD _ADDRESS,在程序中定義得此函數(shù)指針能夠把指定位置的地址強制轉換為函數(shù)指針類型,然后使用run()函數(shù)即可運行該地址處的指令。在實現(xiàn)引導功能的代碼中,打開并讀取指定的系統(tǒng)文件到指定的位置DOWNLOAD_ADDRESS(0xc080000)處即完成了裝載,將程序指針指向已指定的這個位置,使用run()函數(shù)運行該地址處的指令,即可實現(xiàn)控制的轉移。當看到屏幕上顯示操作系統(tǒng)的啟動信息后,Boot Loader完成任務,成功的引導了操作系統(tǒng)。
int LoadFile(char *filename, unsigned char *pbuffer)
{ __FILE *file;
int i;
file=OpenOSFile(filename,FILEMODE_READ);
if(file==NULL)
return FALSE;
ReadOSFile(file, pbuffer, file->filesize);
CloseOSFile(file);
return TRUE;}
void Boot(char *pbootfile)
{ if(pbootfile==NULL)
pbootfile=SYSTEM_CODE;
rINTMSK=0xffffffff;
initOSFile();
if(!LoadFile(pbootfile,(unsigned char *)(DOWNLOAD_ADDRESS))){
Uart_Printf("nCan't find file %s",pbootfile);
return; }
run();}
結語
本文介紹了在基于S3C44B0X的UP-NETARM3000的實驗板上移植uCOS系統(tǒng)的Boot Loader。不同的開發(fā)板具有不同的CPU體系結構和外圍硬件設備,但Boot Loader的工作機理都是類似的,明確開發(fā)板的硬件資源和具體即將移植的操作系統(tǒng)后,對Boot Loader進行具體裁減和修改?!?/p>
參考文獻:
1. 張侖編著.32位嵌入式系統(tǒng)硬件設計與調(diào)試.北京:機械工業(yè)出版社,2005.5
2. 金鑫. S3C44B0X下的Boot Loader開發(fā).工業(yè)控制計算機,2005(8)
3. 嚴國清. S3C44B0X中Boot Loader的實現(xiàn).數(shù)據(jù)采集與嵌入式系統(tǒng),2004(6)
評論