1 引言
由于嵌入式系統內存的易揮發性,在斷電后不可能保存內存中運行的操作系統鏡像,必須將這些文件保存在不揮發的存儲介質中。對PC機而言, 開機后處理器配置的初始化、硬件初始化等操作是由BIOS完成的, 但對于嵌入式系統來說, 出于經濟性和硬件設計的靈活性方面的考慮一般不配置BIOS, 因此必須自行編寫完成這些工作的程序, 這就是所說的Boot loader。其作用與PC機上的BIOS類似,它主要擔負著初始化硬件和引導操作系統的作用,正像它的名字中的含義Boot和Loader一樣。因此,一個合適的Boot loader程序將是嵌入式系統硬件與軟件流暢運行的關鍵技術環節。
2 Boot loader簡介
在任何嵌入式系統中,要想脫離PC機獨立工作,Boot loader程序是必不可少的。它是系統運行的起始點, 包含著系統運行的第一行代碼。在特定的硬件平臺上脫機運行Linux操作系統最先解決的工作之一就是讓Boot loader正常啟動這個硬件平臺,并且為這個平臺定制相應內核的配置和載入功能。Boot loader是一段單獨的程序代碼, 它存放于硬件平臺的非易失存儲介質中,如ROM或Flash。
S3C24100芯片內部沒有程序存儲器, 所有程序都被存儲在片外擴展的ROM和Flash中。開始啟動時, 系統會檢測OM管腳,判斷系統是否選擇NAND Flash啟動,如圖1所示。
圖1 起動程序
當OM等于00時候,系統認為是NAND Flash啟動,然后把存有Boot loader和操作系統程序的NAND Flash前4KB程序拷貝到內部SRAM中,而這內部4KB的SRAM會被映射到BANK0區中,起始地址為0x00, 系統從此開始運行,因此系統一開始就可以把控制權交給Boot loader。當OM等于01或10時,系統會直接從BANK0的起始地址0x00開始,為了儲存程序以及提高速度,一般選擇NOR Flash存儲器,它不僅可以保證掉電后程序不會消失,而且讀寫速度非?,雖然這樣可以減少Boot loader的設計量,但是從經濟和制造工藝兩方面考慮,還是NAND Flash更適合作為固化程序的存儲介質。
目前,具體開發板Boot loader的開發通常都是基于一些開源的Boot loader (如VIVI、Blob、U Boot、ARM Boot、Red Boot等)而設計,它們在設計思路上有許多相通之處。本系統Boot loader主要參考VIVI的模式設計的。VIVI有兩種工作模式:啟動加載模式和下載模式。啟動加載模式可以在一段時間后自行啟動Linux內核,這種模式也稱為“自主” 模式(Autonomous),也即Boot loader從目標機上的某個固態存儲設備上將操作系統加載到內存中運行,整個過程并沒有用戶的介入。這種模式是Boot loader的正常工作模式,因此在嵌入式產品發布的時候,Boot loader必須工作在這種模式下,這是VIVI的默認模式。在下載模式下,目標機上的Boot loader將通過串口連接或網絡連接等通信手段從主機(Host)下載文件,比如:下載內核映像和根文件系統映像等。從主機下載的文件通常首先被Boot loader保存到目標機的RAM中,然后再被Boot loader寫到目標機上的FLASH類固態存儲設備中。Boot loader的這種模式通常在第一次安裝內核與根文件系統時被使用,此外,以后的系統更新也會使用Boot loader的這種工作模式,工作于這種模式下的Boot loader通常都會向它的終端用戶提供一個簡單的命令行接口。根據VIVI的特點,以及系統的考慮,設計的Boot loader框圖如圖2所示。
圖2 Boot loader框圖
3 最小系統介紹
為了在硬件環境下實際檢驗所設計的Boot loader是否可以啟動Linux操作系統,需要設計一個基于S3C2410處理器的嵌入式最小系統。這個最小系統包括如下幾個部分:非易失存儲器(硬盤)、內存、LCD和幾種常用的接口。S3C2410是一種綜合性處理器,RS232串口和USB接口只要配置好內部寄存器就可以工作,NAND Flash和SDRAM掛在外部數據總線上,由于S3C2410沒有指定的Ethernet接口,所以需要在外部數據總線上擴展。大致系統框圖如圖3所示。
根據S3C2410處理器的特點,非易失存儲選擇的是NAND Flash,主要用于存儲Boot loader和Linux操作系統文件。內存選擇的是SDRAM,它可以使操作系統運行在高速狀態下。LCD用來顯示操作系統的圖形界面。RS232串口用來接受Boot loader啟動時的打印信息。主USB接口用來實現在Linux操作系統環境下鼠標的操作。從USB接口用來實現在Boot loader工作模式下下載操作系統文件。JTAG接口是下載Boot loader文件到NAND Flash中的唯一方法,因為系統在開始時對其它接口是沒有配置的。
圖3 最小系統框圖
應用的硬件系統如圖4所示。
圖4 硬件系統
4 Boot loader程序流程
在這個系統中,Boot loader的目標就是配置好操作系統所需的硬件環境,然后調用Linux操作系統來執行。系統開機后,通過給S3C2410的OM管腳置成00,也就是告訴處理器選擇啟動方式為NAND Flash啟動方式。在這種啟動模式下,系統啟動時會自動把NAND Flash中的前4KB程序復制到內部SRAM中,系統從內部SRAM首地址(0x00)開始執行。由于Boot loader的實現依賴于處理器的體系結構,因此大多數Boot loader都分為階段一和階段二這兩大部分。依賴于處理器體系結構的代碼,比如設備初始化代碼等,通常都放在階段一中,而且通常都用匯編語言來編寫,以達到短小精悍的目的。階段二則通常用C語言來實現,以實現更復雜的功能,而且代碼會具有更好的可讀性和可移植性。本系統Boot loader主要操作流程如圖5所示。
圖5 操作流程圖
啟動過程中這個Boot loader程序的主要工作任務是:
①配置部分硬件
②Boot loader第一階段與第二階段的過渡
③配置好操作系統運行前的硬件環境
④Boot loader的應用程序(主要面對的是系統開發人員)
⑤Boot loader的工作模式(主要面對的是用戶)
上述各部分的功能關系如圖6所示。
圖6 功能關系圖
5 結 論
本文設計的Boot loader已經成功地在這個最小系統上運行了Linux操作系統并測試通過,其調試結果用串口程序打印出來,如圖7所示。
圖7 串口程序打印
由于Boot loader與具體的CPU芯片、板上外圍設備以及所采用的操作系統有密切的聯系, 所以以上所列的設計流程和內容不是一成不變的, 應在具體的實際應用中做適當的修改。學習寫Boot loader也是嵌入式系統學習的重要環節,它不僅體現了設計者對硬件的了解能力,以及如何合理地操作軟件與硬件之間的銜接。對于設計者以后設計其它類型的嵌入式系統(像DSP、AVR等)都是很有幫助的。
參考文獻
[1]三星公司. S3C2410處理器數據手冊.
[2]www.mizi.com VIVI源代碼.
[3]杜春雷.ARM 體系結構與編程[M].北京:清華大學出版社,2003.
[4]龐繼勇,唐婷.ARM 處理器中斷處理的編程實現[J].電子產品世界,2005,(2):54—56.
[5]劉廣亮.VIVI在S3C2410開發板上的啟動分析. 內江科技,2007年第8期.
[6]闕大順,杜 瑋,岳 鵬. Vivi在S3C2410上的移植研究.武漢理工大學學報,第29卷,第12期,2007年12月.