1.引言 嵌入式計算機系統隨著其應用方式不同,具有不同的體系結構形式。基于x86平臺的嵌入式計算機,因其采用與標準PC相同的硬件結構、操作系統和軟件開發平臺,開發方便,應用程序設計資源豐富,因此在嵌入式系統中占據越來越大的份額,尤其在工業控制方面得到了廣泛的應用。 不同于沒有操作系統、功能單一的消費類電子產品,也不同于加載啟動完全由BootLoader引導加載程序來完成的某些嵌入式系統,基于x86平臺的嵌入式計算機的結構由PC而來,其功能復雜,初始化硬件和引導操作系統仍然由BIOS來完成。但一個嵌入式系統的BIOS并不需要像通用PC BIOS那樣具有那么多的靈活性,因為通常它僅需處理某種特定的硬件配置方案。所以,LinuxBIOS是替代傳統BIOS的開源解決方法,移除了許多嵌入式平臺不必要的功能,為基于x86平臺的嵌入式計算機系統定制的基本輸入輸出系統。 本文將以基于 AMD Geode LX處理器的嵌入式 x86平臺為例,介紹了 LinuxBIOS的基本結構、運行過程;在此基礎上配置 LinuxBIOS映像,并實現其引導功能。 2.LinuxBIOS簡介 LinuxBIOS項目由美國Los Alamos國家實驗室高級計算實驗室的 Ron Minnich創始,遵循GPL條款的開源項目。目前LinuxBIOS不僅支持嵌入式 Linux系統的引導,在配置相應的映像如FILO、ADLO時還可以支持Windows 2000、FreeBSD、OpenBSD等操作系統。 LinuxBIOS的主要特征有:①系統引導— 支持ext2、fat、iso9600等文件系統,可從IDE、Flash等設備中引導系統內核。如果配置Etherboot映像,還支持網絡引導。②串口控制臺—在系統初始化早期階段輸出控制信息,目的主要用于調試,控制信息分為9個級別,可以根據調試的需要進行配置。③源碼易讀— LinuxBIOS項目除了在CPU和存儲器的初始化時使用匯編語言外,其它部分使用C語言,具有可讀性和可移植性,方便代碼的維護。 3.基于 Geode LX處理器的系統平臺 GeodeLX處理器是AMD公司推出的新一代基于x86體系結構的嵌入式處理器,主要用于工業控制、移動設備等領域。Geode LX處理器支持i586指令集,并且帶有MMX和AMD 3DNow!指令集擴展。其CPU頻率在400MHZ-500MHZ,帶有8級單發射的指令流水線,64K指令L1 cache和64K數據L1 cache,128K的可配置為指令或數據的L2 cache。處理器內部集成了圖形和視頻處理單元提高了二維圖形和視頻的應用加速。和Geode LX處理器一起使用的CS5536芯片組提供南橋的功能如IDE、USB2.0、Flash、AC97和x86的外圍設備接口。 4.LinuxBIOS的基本結構 LinuxBIOS支持多個主板、CPUs和芯片組,其工程目錄結構如圖 1所示;主要有三個目錄:src、targets和util。src目錄包含了CPUs、主板、南橋、北橋和其它設備的源碼,用來配置和初始化CPU、存儲器和 PCI控制器等設備。在 targets目錄中根據系統平臺的配置文件來創建 ROM映像文件。util目錄為創建 ROM映像或者將 ROM映像燒寫到主板的 Flash中提供了工具支持。 LinuxBIOS的平臺全局配置文件 Config.lb和選項文件 Option.lb在 src/mainboard/目錄內,配置文件 Config.lb描述資源在目標結構中是如何被使用的,規定了 CPU的結構、平臺所使用的 PCI設備以及代碼存放的地址等內容。比如在追加 VGA BIOS到 LinuxBIOS的映像文件中,需要在該配置文件 Config.lb的 PCI橋選項中填加 VGA BIOS的存放地址;而選項文件 Option.lb定義了在配置文件 Config.lb中所使用的選項。 在 ROM映像中有個 Payload映像如FILO、Etherboot等,該映像為 ELF格式,是用來加載操作系統內核的。在創建 LinuxBIOS的 ROM映像過程中,Payload映像被集成到 ROM映像;配置期間,開發人員可以設置 ROM映像的大小和 Payload映像的指向,還可以選擇是否采用NRV2B或 LZMA壓縮算法對 Payload進行壓縮,相關的配置選項在目錄/targets內相關系統平臺的配置文件 Config.lb中給出。 5.LinuxBIOS啟動過程 從操作系統的角度看,LinuxBIOS的總的目標是正確的調用系統內核來執行,由于LinuxBIOS的實現依賴于 CPU的體系結構,此部分將依據基于 Geode LX處理器的嵌入式 x86平臺來分析 LinuxBIOS的啟動流程,其流程圖如圖2,可以分為以下三個階段: 第一階段是主要用 C語言完成的,其中也內嵌了少量的匯編語言,主要是存儲控制器的初始化和其他硬件必要的初始化。系統加電啟動時,CPU首先從 reset16.inc啟動,隨后跳轉到 entry16.inc并切換到 32位的保護模式。在目錄/CPU/amd/model_lx/內的cache_as_ram.inc將初始化 CPU中的 Cache控制器,為堆棧準備空間,而在目錄/mainboard/amd/db800/內的 cache_as_ram_auto.c被 gcc編譯成auto.inc,將開始初始化存儲控制器。/CPU/amd/car/post_cache_as_ram.c是 cache_as_ram_auto.c的一部分,將Cache中的棧復制到 RAM中,使 Cache恢復正常,為 hardwaremain預留1M的空間,昀后調用 copy_and_run, copy_and_run將復制并解壓 hardwaremain到 RAM 中,跳轉到hardwaremain處執行。 第二階段是硬件列舉階段,開始列舉 PCI總線上的設備,分配存儲空間和 IO空間,配置南橋上設備如USB、Flash和一些外圍接口,初始化 PCI總線上的設備使其可用,并初始 化 LinuxBIOS表。 第三階段加載Payload,要檢測系統內存映射,將 Payload從 ROM映像中復制到RAM,開始解壓 Payload映像并執行,將根據啟動參數加載操作系統內核kernel。 6.Geode LinuxBIOS的配置 為了能從 IDE硬盤中啟動操作系統,選擇 FILO作為Payload,FILO支持從 IDE硬盤、CD-ROM等設備引導操作系統。構建 LinuxBIOS ROM映像需要的源文件有 LinuxBIOSv2、FILO-0.5和lx_vsa.36k.bin,其中lx_vsa.36k.bin是AMD Geode設備的系統管理模式軟件,它將被目錄/src/cpu/amd /model_lx/中的vsmsetup.c調用,由 AMD公司直接提供。 具體的配置 ROM映像的方法如下: ①創建 FILO Payload映像 將 FILO-0.5的壓縮文件包解壓,在 FILO-0.5的根目錄下運行 make命令,創建了一個默認的 Config文件,在該文件中指出所要引導 Linux內核映像文件的磁盤分區等信息,其相關配置如下: AUTOBOOT_FILE = "hda1:/vmlinuz root="/dev/hda1" console="tty0" console="ttyS0",115200" #自動加載系統的命令行參數 再次運行 make命令即可在 FILO-0.5的根目錄下產生 filo.elf映像文件。 ②配置 LinuxBIOS 為了加快系統啟動的速度,減少串口控制臺的輸出信息,可以通過修改 src/mainboard/amd/db800目錄中的 Option.lb文件的配置選項,降低輸出信息的級別,其默認選項為8,將其修改為6,輸出啟動各階段的通告信息。配置選項如下: default DEFAULT_C*OLE_LOGLEVEL=6 #要求級別 6的調試輸出 修改/targets/amd/db800目錄下 config.lb文件,使用 LZMA算法壓縮 payload映像,指出Payload 映像的指向為 payload /FILO-0.5/filo.elf,這樣可將 Payload映像集成到ROM映像中。下面是基于 AMD Geode處理器目標板的 ROM映像一些配置選項: option CONFIG_COMPRESSED_PAYLOAD_LZMA=0 #修改為 1時使用 LZMA算法壓縮 payload option ROM_SIZE=512*1024-36*1024 #預留 36k空間給 lx_vsa.36k.bin payload ../payload.elf #修改指向為 payload /FILO-0.5/filo.elf ③生成 LinuxBIOS ROM映像 在/LinuxBIOSv2/targets/目錄下,執行如下的命令: [root@localhost targets]#./buildtarget amd/db800此時在 amd/db800中產生了 db800目錄,目錄中有 Makefile、Makefile.settings和config.py文件,將切換目錄到 amd/db800/db800下,運行如下命令: [root@localhost db800]#make 在/db800目錄下生成了 db800.rom映像文件,其大小為476k,從前面的配置選項中得知,在/targets/amd目錄下的 config.lb文件中定義了 option ROM_SIZE=512*1024-36*1024,這 36k的空間是留給 lx_vsa.36k.bin的,執行下列命令將追加到 ROM映像中: [root@localhost db800]#cat db800.rom lx_vsa.36k.bin>LinuxBIOS.rom LinuxBIOS.rom為昀終所生成的 ROM映像文件。 7.燒寫映像文件并運行 LinuxBIOS ROM映像文件將通過與宿主機相連的 SUPERPRO/GX編程器燒寫到flashrom中,這樣比較簡單易行,方便調試。在啟動系統前,首先要配置 Linuxkernel-2.6.23,在配置中要選擇配置選項 Device Drivers中的 AMD Geode LXframebuffer支持模塊。 將已經燒寫了 LinuxBIOS.rom映像文件的 flashrom放到 db800開發板上。啟動目標板,通過 windows的超級終端顯示 LinuxBIOS的啟動信息的結果如圖3所示: 8.結束語 本文簡單介紹了 LinuxBIOS的基本特征,以及基于 Geode LX處理器的嵌入式 x86體系結構,重點給出了 LinuxBIOS的基本結構和針對基于 Geode LX處理器開發平臺的 LinuxBIOS的運行機理,昀后詳細地給出了 LinuxBIOS的 ROM映像配置和生成方法,并給出了實驗結果,實驗表明該方法配置出來的 ROM映像是能夠可靠運行的。 本文的創新點:闡明了在基于 Geode LX處理器的嵌入式開發平臺上 LinuxBIOS的配置方法和實現步驟,為從事嵌入式系統開發工作的人員提供一個參考。 |