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