摘 要: 介紹一種利用GNU工具鏈開發(fā)基于S3C44B0X硬件平臺" title="硬件平臺">硬件平臺的Bootloader的方法,,詳細分析了Bootloader的構架、內(nèi)存分布,、異常/中斷處理以及編譯鏈接過程,,說明了Bootloader需要完成的主要任務和實現(xiàn)方法。
關鍵詞: 引導裝載程序 S3C44B0X 嵌入式系統(tǒng) GNU工具
Bootloader是系統(tǒng)上電" title="上電">上電/復位后,,內(nèi)核啟動程序之前執(zhí)行的一段程序,,其功能是初始化硬件設備后,將操作系統(tǒng)內(nèi)核從固態(tài)存儲器中裝載到RAM中并引導其運行,,它是嵌入式系統(tǒng)開發(fā)的一個難點,,在整個開發(fā)中占有相當大分量。由于高度依賴CPU體系結構和目標板的硬件配置,,并沒有一個通用的Bootloader程序可供開發(fā)者使用,,因此需要自行開發(fā)或是移植,。GNU組織倡導了一整套著名的自由軟件,,包括Linux操作系統(tǒng),、編譯開發(fā)工具(gcc,g++,,as,,ld)、項目開發(fā)管理工具make以及基于不同硬件平臺的開發(fā)庫,,是目前嵌入式開發(fā)者常用的軟件開發(fā)平臺,。本文以三星公司的S3C44B0X為硬件平臺,利用GUN開發(fā)工具,,給出了Bootloader的一種設計和實現(xiàn)方案,。
1 基于ARM7TDMI內(nèi)核的S3C44B0X的特點
S3C44B0X是Samsung公司生產(chǎn)的一款16/32位RISC處理器,為手持設備和一般應用提供了高性價比和高性能的微控制器解決方案,,使用ARM7TDMI內(nèi)核,,最高工作頻率可達66MHz,擁有71個多功能I/O,,并提供了豐富的內(nèi)置部件,,包括8KB Cache和內(nèi)部SRAM,LCD控制器,,2通道UART,,帶PWM功能的5通道定時器,8通道10位ADC等,。S3C44B0X微處理器不具有MMU,,不支持虛擬內(nèi)存管理和內(nèi)存保護。
2 建立交叉編譯環(huán)境
交叉編譯就是在一個平臺上生成可以在另一個平臺上執(zhí)行的代碼,,由于嵌入式微處理器S3C44B0X上無法安裝人們所需要的編譯器,,只好借助于宿主機,生成可以在目標機S3C44B0X上運行的代碼格式,。在本課題設計中,,將使用嵌入式開發(fā)中最普遍的GNU編譯工具。
為了生成能在S3C44B0X上允許的代碼,,需要下載腳本文件arm-elf-tools-20030314.sh,,然后在宿主機上安裝該工具鏈。GNU軟件包括C編譯器,、C++編譯器G++,、匯編器AS、鏈接器LD等,,GNU開發(fā)工具都是使用命令行的方式,,更貼近編譯器和操作系統(tǒng)的底層,提供了更大的靈活性,,有助于開發(fā)者了解系統(tǒng)設計的基礎知識,。
3 Bootloader的設計與實現(xiàn)
嵌入式設備與環(huán)境中的Bootloader類似于PC系統(tǒng)的BIOS,,是系統(tǒng)最底層的引導軟件。Bootloader固化在CPU的上電/復位的啟動地址處(ARM7TDMI的CPU上電后默認從地址0x0處開始執(zhí)行),。每當硬件設備上電/復位時,,CPU總是先執(zhí)行Bootloader,初始化硬件設備,,改變處理器運行模式和重組中斷向量,,建立內(nèi)存空間的映射圖,將系統(tǒng)的軟硬件環(huán)境帶到一個由用戶定制的特定狀態(tài),,然后從遠程主機或者本地非易失存儲設備中裝載可執(zhí)行文件或操作系統(tǒng),,為整個嵌入式系統(tǒng)準備運行環(huán)境。
3.1 硬件平臺分析
硬件平臺是基于ARM7TDMI RISC內(nèi)核的samsung公司的S3C44B0X微處理器,,整個系統(tǒng)擁有2MB的Flash,,其地址從0x00000000-0x001FFFFF,有8MB的SDRAM,,其地址從0x0C000000-0x0C7FFFFF,,有一個USB1.1接口,及以太網(wǎng)口,,還有兩個串口" title="串口">串口和一個調(diào)試接口,。這里將JTAG接口轉換為并口連接方式,可直接與計算機的并口相連,,避免使用昂貴的JTAG仿真器,,串口主要用來輸出調(diào)試信息和輸入用戶控制字符。
3.2 Bootloader的具體設計
每種不同的CPU體系結構都有不同的Bootloader,,除了依賴于CPU的體系結構外,,Bootloader還依賴具體的嵌入式設備的配置。本文將Boot Loader的設計分為 Stage1和Stage2兩大部分,,依賴于CPU體系結構的代碼,,例如設備初始化代碼等,通常都放在Stage1中,,而且通常都用匯編語言來實現(xiàn),,以達到短小精悍的目的,而Stage2則通常用C語言來實現(xiàn),,這樣可以實現(xiàn)復雜的功能,,而且代碼會具有更好的可讀性和可移植性。
3.2.1 Bootloader的總體構架
針對硬件平臺特點和嵌入式開發(fā)中的功能需求,,設計了豐富的Bootloader管理功能:串口下載,、USB下載、網(wǎng)卡的Tftp服務器、Flash燒寫程序,、Linux啟動程序等,。Bootloader工程的目錄結構如圖1所示,共設置為兩級,。第一級目錄下的Makefile和Bootloader.ld是整個工程的編譯文件和鏈接文件;Stage1.s是Stage1的匯編代碼文件,。第二級目錄為Stage2,,其中包括編譯文件Makefile、鏈接文件Stage2.ld,、主管理程序Stage2.c,,以及各個功能模塊Xmodem.c、Usb.c,、Tftp.c,、Flash.c、Linux.c等,。
3.2.2 Bootloader的內(nèi)存分布
硬件平臺的Flash空間為2MB(0x00000000-0x001FFFFF),,SDRAM空間為8MB(0x0c000000-0x0C7FFFFF)。如圖2對Bootloader進行內(nèi)存布局,,從零地址處開始存放Bootloader的整體執(zhí)行映象" title="映象">映象,,Stage1部分存放在最開始處,以便系統(tǒng)一上電/復位就能執(zhí)行Stage1,。0x0C700000以上的部分用于放置Stage2的RAM拷貝,。0x0C7FFF00以上的255個字節(jié)存放中斷服務程序的地址,以下部分用作S3C44B0X的5個運行模式(Undef模式,、Abort模式,、IRQ模式、FIQ模式,、SVC模式)的堆棧,。
3.2.3 異常/中斷處理
S3C44B0X總共有8種異常/中斷,CPU發(fā)生異常/中斷時,,會自動跳轉到從0x00000000地址開始的中斷向量表" title="向量表">向量表中的某個表項處讀取指令運行,,由于Bootloader最終要引導μCLinux運行,而μCLinux要求中斷向量表設置在可隨機讀寫的RAM中,,為了能夠與μCLinux兼容,,這里設置了兩級中斷向量表:第一級為零地址處的中斷向量表,第二級向量表放在RAM的開始地址0x0C000000處,,第一級僅是簡單地向第二級跳轉,。從0x0C7FFF00地址處開始存放各個異常/中斷服務程序的地址。
在異常服務和中斷服務處理中,將與中斷相關的例行固定不變的任務形成一個“系統(tǒng)函數(shù)”,,而相應的中斷處理任務用C代碼編寫形成“用戶函數(shù)”,,這樣可以提高編程和開發(fā)的靈活性,實現(xiàn)了Bootloader良好的接口和封裝性能,。在其他功能程序中只需要編寫“用戶函數(shù)”,,并可以將“用戶函數(shù)”的地址任意重構到0x0C7FFF00開始的RAM中。異常/中斷的整個處理過程如圖3所示,。
3.2.4 Stage1與Stage2的設計分析
Bootloader的Stage1部分是硬件上電/復位開始執(zhí)行的操作,,一般用匯編代碼來編寫,其目的是為Stage2的執(zhí)行以及隨后kernel的執(zhí)行初始化硬件環(huán)境,,主要包括以下步驟:屏蔽所有的中斷->設置CPU的速度和時鐘頻率->關閉CPU的指令/數(shù)據(jù)Cache->設置CPU的8個bank配置->設置RAM控制器(包括刷新時序)->拷貝Stage2到地址0x0C700000->設置堆棧指針SP,。在上述一切都就緒后,就可以跳轉到Stage2去執(zhí)行了,,在ARM系統(tǒng)中,,可以通過修改PC寄存器為相應的地址來實現(xiàn)。
Stage2繼續(xù)初始化本階段用到的硬件設備,,包括I/O,、Cache、中斷控制器和串口等,,當所有硬件初始化完畢之后,,開中斷,打印出提示信息,。在Stage2階段,,還有一個重要功能就是建立操作界面,提供各種調(diào)試功能,,以方便用戶的開發(fā),。可以利用Windows的超級終端建立與S3C44B0X串口的連接,,完成Bootloader的管理和引導功能,,包括串口下載、USB下載,、網(wǎng)口下載,、Flash燒寫以及操作系統(tǒng)的引導等。在調(diào)試階段,,將整個管理過程設置成一個無限循環(huán),,不停地從串口接收和執(zhí)行用戶命令。若執(zhí)行的是μClinux引導命令,,則系統(tǒng)從此進入μClinux,,而不再返回Bootloader,。
3.3 Bootloader的編譯和鏈接
采用針對ARM的GNU工具鏈來對整個Bootloader工程文件進行編譯和鏈接,具體流程如圖4所示,。先編譯生成Stage2的二進制可執(zhí)行映象Stage2.bin,;然后用二進制文件轉換工具bin2c將其轉化為只包含一個一維數(shù)組的c文件Stage2_bin.c,GNU工具在對工程進行第二次鏈接的時候可以在其他程序定位到數(shù)組首地址,,從而得到數(shù)組的內(nèi)容,,達到直接調(diào)用Stage2.bin的目的;最后將文件Stage2_bin.c和Stage1.s一起編譯生成總的Bootloader映象,,Stage2_bin.c中的Stage2映象數(shù)組最終被編譯進Bootloader中的數(shù)據(jù)段,。把Stage1的可執(zhí)行映象作為代碼段,把Stage2的可執(zhí)行映象作為數(shù)據(jù)段,。Bootloader在Stage1的執(zhí)行過程中,就可以把自己的數(shù)據(jù)段(即Stage2)拷貝到RAM中,,然后跳轉執(zhí)行,。用arm-elf-ld鏈接各目標文件時需要編寫鏈接腳本文件,指定正確的加載時域和運行時域,,對于Stage1,,加載時域和運行時域都為0x00000000開始的Flash地址空間,Stage2運行時域被安排到0x0C700000RAM空間,。
4 μCLinux操作系統(tǒng)的引導
μCLinux的引導共有兩種形式:自舉模式和加載模式,,分別適應于嵌入式系統(tǒng)的開發(fā)階段和產(chǎn)品發(fā)布階段。Bootloader的引導工作主要是為μCLinux操作系統(tǒng)準備啟動參數(shù),,包括RAM板塊的組織,、內(nèi)核啟動命令行、ramdisk在RAM中的位置,、硬件的版本,、圖形卡參數(shù)等信息。在μCLinux操作系統(tǒng)中,,通常需要由Bootloader來設置ATAG_CORE,、ATAG_MEM、ATAG_CMDLINE,、ATAG_
RAMDISK,、ATAG_INITRD等。Bootloader調(diào)用μCLinux內(nèi)核的方法同調(diào)用一般應用程序一樣,,直接跳轉到內(nèi)核的第一條指令處,。根據(jù)內(nèi)核啟動協(xié)議,在跳轉時要滿足下列幾個條件:
(1)CPU寄存器的設置:R0=0,、R1=機器類型ID,、R2=啟動參數(shù)標記列表在RAM中起始基地址。
(2)CPU模式:必須關閉所有中斷、CPU必須為SVC工作模式,。
(3)Cache和MMU的設置:MMU必須關閉,、數(shù)據(jù)Cache必須關閉。
設計和實現(xiàn)一個性能良好的Bootloader,,可以大大增強系統(tǒng)的穩(wěn)定性,,提高系統(tǒng)的實時性。目前開發(fā)的Bootloader已成功應用于一款心電監(jiān)護設備中,。本文給出的一種利用GNU工具鏈開發(fā)基于S3C44B0X的Bootloader方法,,體現(xiàn)了Bootloader的結構和功能,可以舉一反三,,設計并定制出各種硬件平臺的Bootloader,,實現(xiàn)系統(tǒng)的有效、實時開發(fā),。
參考文獻
1 馮進文,,楊榮松.用GNU工具鏈開發(fā)嵌入式linux系統(tǒng)引導程序.中國測試技術,2006,;32(1)
2 童大鵬,,冉蜀陽.基于AT91RM9200微控器的BootLoader的分析與開發(fā).微計算機應用,2005,;26(3)
3 詹榮開.嵌入式BootLoader技術內(nèi)幕.http://www.edw.com.cn/bbs
4 李駒光,,聶雪媛.ARM應用系統(tǒng)開發(fā)詳解-基于S3C4510B的系統(tǒng)設計.北京:清華大學出版社,2003
5 S3C44B0X User′s Manual.SUMSUNG Inc,,1997