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