徐磊
摘要:該文簡要介紹了嵌入式開發(fā)中引導(dǎo)程序的重要性。以及嵌入式開發(fā)過程中BootLoader的實(shí)現(xiàn)原理,并結(jié)合基于ARM體系架構(gòu)S3C2410芯片中BootLoader的具體開發(fā)過程與實(shí)例對系統(tǒng)引導(dǎo)程序作出深入剖析,測試結(jié)果表明該設(shè)計具有良好的穩(wěn)定性和高效性。
關(guān)鍵詞:嵌入式開發(fā);bootlooder;引導(dǎo)加載程序
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2014)04-0762-03
隨著移動互聯(lián)網(wǎng)的發(fā)展,嵌入式設(shè)備已經(jīng)普及到社會的每個角落。嵌入式處理器種類繁多,有ARM、MIPS/PPC等多種架構(gòu)。其中32位ARM嵌入式處理器具有高性能、低功耗以及價格低廉的特征,已被廣泛用于消費(fèi)電子品和無線網(wǎng)絡(luò)通信設(shè)備上。目前用于嵌入式開發(fā)的操作系統(tǒng)多種多樣,如嵌入式Linux、VxWorks、windowsCE等。其中,Linux是遵循GPL協(xié)議的開發(fā)源碼的操作系統(tǒng),內(nèi)核可以任意剪裁以及支持硬件種類繁多。
要把嵌入式LINUX操作系統(tǒng)移植到嵌入式設(shè)備的裸板上,我們必須開發(fā)出類似個人pc上的BIOS來把linux操作系統(tǒng)讀到內(nèi)存中運(yùn)行。這個類似于BIOS的啟動程序就叫Bootloader,其目的是用于初始化硬件并且進(jìn)一步加載、引導(dǎo)嵌入式操作系統(tǒng)體系運(yùn)行。Bootloader功能是初始化硬件設(shè)備,完成處理器以及各種設(shè)備的初始化工作;屏蔽底層硬件差異,使得上層應(yīng)用軟件編寫和移植更加方便;調(diào)用操作系統(tǒng)內(nèi)核,起到引導(dǎo)和加載內(nèi)核的作用;向內(nèi)核傳遞必要的與硬件相關(guān)的信息。當(dāng)內(nèi)核啟動后,Bootloader的使命也就完成,自此嵌入式設(shè)備便進(jìn)入操作系統(tǒng)和應(yīng)用程序運(yùn)行階段。
1 系統(tǒng)硬件結(jié)構(gòu)
本系統(tǒng)采用基于ARM架構(gòu)的S3C2410開發(fā)板為實(shí)例,具體討論Bootloader的設(shè)計。
S3C2410芯片是ARM公司的32位ARM920T處理器核。S3C2410處理器有:獨(dú)立的16KB指令Cache和16KB數(shù)據(jù)Cache,MMU,支持TFT的LCD控制器,64MB的NAND控制器,3路UART,4路DMA,I/O口,RTC,觸摸屏接口,2個USB主機(jī),1個USB設(shè)備,SD主機(jī)和MMC接口,2路SPI。S3C2410芯片可運(yùn)行在200MHz以上。
2 Bootloader設(shè)計與實(shí)現(xiàn)
通常Bootloader的加載有兩種方式:第一是通過NOR FLASH啟動,其特點(diǎn)是速度快。CPU可以像訪問內(nèi)存一樣直接訪問NOR FLASH,但是NOR FLASH價格昂貴。第二是通過NAND FLASH啟動,其特點(diǎn)是可讀可寫,NAND FLASH速度雖然慢,但是價格便宜。
一般來說Bootloader的設(shè)計編程分兩個部分:第一部分通常用匯編實(shí)現(xiàn),主要完成依賴于CPU體系結(jié)構(gòu)的初始化,復(fù)制啟動代碼到SDRAM后,調(diào)用第二部分代碼;第二部分通常使用C語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,比如提供FTP文件傳輸?shù)裙δ埽詈髥觾?nèi)核。
2.1 Bootloader的設(shè)計過程
Bootloader具體流程見圖2。
2.2 Bootloader的第一階段
Bootloader第一階段的功能:
相關(guān)硬件初始化;
把啟動代碼拷貝到內(nèi)存中;
設(shè)置棧指針;
設(shè)置程序計數(shù)器PC到第二階段代碼的C入口中。
Bootloader第一階段實(shí)現(xiàn)方法:
首先,通常在執(zhí)行程序以前,首先為系統(tǒng)設(shè)置異常向量表。ARM結(jié)構(gòu)的CPU從內(nèi)存為0X0000000的地址開始執(zhí)行,系統(tǒng)定義的異常,一上電程序跳轉(zhuǎn)到reset異常處執(zhí)行相應(yīng)的匯編指令,下面定義出的都是不同的異常,比如軟件發(fā)生軟中斷時,CPU就會去執(zhí)行軟中斷的指令,這些異常中斷在CUP中地址是從0開始,每個異常占4個字節(jié)。
然后,由于ARM體系CPU具有7種工作模式,上電以后開發(fā)板首先應(yīng)該工作于管理模式。
隨著Bootloader的功能不斷的完善,其代碼量也越來越大,所以以S3C2410為代表的裸板只有4K大小的片內(nèi)內(nèi)存,無法運(yùn)行大于4K的Bootloader。因此,我們需要初始化SDRAM,并且重新定位Bootloader。然后設(shè)置好棧sp寄存器,為第二階段的C函數(shù)調(diào)用做好準(zhǔn)備。
2.3 Bootloader第二階段
Bootloader第二階段的功能
相關(guān)硬件設(shè)備初始化
檢測系統(tǒng)內(nèi)存映射
將內(nèi)核映象和根系統(tǒng)映象從NANDFLASH讀到內(nèi)存中
設(shè)置內(nèi)核啟動參數(shù)
調(diào)用內(nèi)核
首先,在第二階段中首先完成一些硬件設(shè)備的初始化,如初始化串口和設(shè)置系統(tǒng)時鐘等
然后,檢測系統(tǒng)內(nèi)存映射和一系列的設(shè)置
第二階段也是Bootloader的最后一個階段,其最主要的目的是把加載到SDRAM的系統(tǒng)內(nèi)核啟動。使用C語言,可以像下列實(shí)例代碼來調(diào)用內(nèi)核。
最后,需要注意的是,bootloader加載了內(nèi)核,內(nèi)核啟動,加載文件系統(tǒng),進(jìn)入Linux系統(tǒng)。
3 結(jié)束語
在嵌入式系統(tǒng)設(shè)計中Bootloader的設(shè)計很關(guān)鍵。Bootloader是操作系統(tǒng)和硬件的樞紐相對于操作系統(tǒng)內(nèi)核來說他是一個硬件抽象層,他負(fù)責(zé)初始化硬件,引導(dǎo)操作系統(tǒng)內(nèi)核,監(jiān)測各種參數(shù)給操作系統(tǒng)內(nèi)核使用。設(shè)計和實(shí)現(xiàn)一個好的Bootloader將大大提高操作系統(tǒng)移植的穩(wěn)定性并大大加快操作系統(tǒng)移植的周期。
本文介紹的Bootloader代碼已經(jīng)在基于S3C2410芯片上運(yùn)行并測試通過。設(shè)計Bootloader的過程和程序不是一層不變的,它設(shè)計不僅依賴與不同的芯片結(jié)構(gòu),而且開發(fā)人員可以根據(jù)自己的需求增加一些功能的。
參考文獻(xiàn):
[1] 韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2013.
[2] 鄭凌翔.嵌入式系統(tǒng)設(shè)計與應(yīng)用開發(fā)[M].北京:北京航天航空大學(xué)出版社,2006.
[3] BRIAN W,DENNIS M.The C Programming Language[M].北京:機(jī)械工業(yè)出版社,2012.