摘 要:嵌入式系統(tǒng)開發(fā)要依賴真實的硬件平臺,所以進行開發(fā)的成本較高。本文研究用軟件仿真的方式來模擬各種硬件開發(fā)平臺,使得開發(fā)者和學習者在模擬環(huán)境中進行嵌入式操作系統(tǒng)的移植工作,為在硬件平臺上的移植以及后續(xù)的開發(fā)工作打下良好的基礎。本文分析了常見的仿真平臺,并給出uclinux在Skyeye上的移植過程。
關鍵詞:嵌入式操作系統(tǒng);移植;仿真;Skyeye;Armulator
中圖分類號:TP316.2;TP391.9
嵌入式開發(fā)的首要任務是在嵌入式硬件平臺上安裝配置嵌入式操作系統(tǒng),由于嵌入式硬件平臺的異構性和多樣性,加之嵌入式操作系統(tǒng)種類較多,導致嵌入式操作系統(tǒng)的移植往往比較復雜和容易出錯。而且,嵌入式開發(fā)和實驗平臺成本較高,使得實驗機會相對較少。因此本文討論使用軟件仿真的方式代替真實硬件平臺,以便可以在缺少硬件平臺的情況下掌握嵌入式操作系統(tǒng)移植的方法,提高在真實硬件平臺上的成功率。由于仿真軟件不能模擬硬件平臺的所有特性,而且在硬件平臺上的開發(fā)流程依賴真實的硬件特性,與仿真環(huán)境有一定區(qū)別,所以最終的仿真結果還需要在硬件平臺上測試。
1 常見嵌入式仿真軟件
嵌入式仿真軟件是在宿主機上建立起一個內核與外設均可配置與裁剪的模擬平臺,能進行指令級的模擬,操作系統(tǒng)和軟件能在仿真軟件上運行,就像在真正的硬件系統(tǒng)上一樣。將仿真軟件應用到嵌入式軟件的開發(fā)與測試中,可以讓軟件和硬件開發(fā)同步進行,縮短開發(fā)周期;可以根據(jù)設計需要選擇外設和芯片型號,構建新的嵌入式系統(tǒng);可以提供比真正硬件環(huán)境下更豐富的測試環(huán)境,可以避免直接使用硬件測試帶來的風險;能夠方便的進行調試。嵌入式仿真軟件中最核心的部分是指令模擬器,可以模擬ARM指令的執(zhí)行過程。常見的嵌入式仿真軟件有ARM公司的ARMmulator,清華大學Sky Eye項目中的指令模擬器,Linux上的開源軟件GDB ARMulator等。ARM公司針對ARM相關應用開發(fā)和調試提供了一個開發(fā)軟件套裝ARM Developer Suite(ADS)。本文主要對ARMulator和skyeye進行介紹并研究嵌入式操作系統(tǒng)uClinux在skyeye上的具體移植方法。
2 ARMulator簡介
通常所說的ARMulator有兩種,一種是GDB/ARMulator,是國際開源組織的程序調試工具GDB自帶的模擬器。另一種是ARM公司自己推出的它包含在在其集成成開發(fā)環(huán)境ADS中的ARM模擬器。他們都是指令集模擬器,需要和在通x86體系結構計算機上的運行的調試器軟件連接,得以實現(xiàn)模擬ARM體系結構和指令集,并且給出了ARM程序的軟件仿真開發(fā)和調試環(huán)境。除了能夠仿真ARM處理器的體系結構和指令集,ARMulator還可以其他硬件結構如存儲器和外圍設備,例如中斷控制器和定時器等,這樣就模擬了一個進行嵌入式開發(fā)的最小子系統(tǒng),另外使用者還可以擴展添加自己的外設。
通過分析ARMulator的源代碼,我們可以看到它是由一個一個的模塊(module)組成的,其中起核心作用的模塊主要有:處理器核心模塊;存儲器模塊。以及一些外設模塊,如:中斷控制器仿真模塊;定時器仿真模塊,用來為系統(tǒng)提供定時中斷;堆棧跟蹤器模塊;顯示管模塊,等等。開發(fā)人員可以通過修改已有模塊來生成滿足特定需求的模塊,也可以按照給定的接口規(guī)范編寫出符合應用需求的其他外設仿真模塊。而且,在ARMulator上可以很好的移植μC/OS-II操作系統(tǒng)。μC/OS-II是一個嵌入式實時操作系統(tǒng)內核,包含了任務調度、任務管理、時間管理、內存管理和任務間的通信與同步等基本功能。研究人員可以在ARMulator上移植和調試μC/OS-II,甚至可以在其上完成一些開發(fā)工作,這樣就可以為在實際嵌入式硬件平臺上移植和開發(fā)打下基礎。
3 SkyEye概述
SkyEye是一個比較完整的嵌入式仿真軟件環(huán)境,目前可以仿真大部分主流的嵌入式開發(fā)板和外部設備。SkyEye中的ARM模擬器是在GDBARMulator基礎上進行開發(fā)和完善的。SkyEye是一個源代碼開放的開源項目,由清華大學發(fā)起,支持windows系統(tǒng)和linux系統(tǒng),目前已維護到2.0版本。SkyEye的目標是在常用的Linux平臺上仿真多種主流的嵌入式開發(fā)板和外部設備,而在windows中是通過mingw和mysys構建GNU環(huán)境來實現(xiàn)對Skyeye的支持,從而建立一個可擴展的硬件模擬框架。SkyEye是指令級模擬器,可以模擬多種嵌入式開發(fā)板,可支持多種CPU指令集,而在SkyEye上運行的OS意識不到它是在一個虛擬的環(huán)境中運行,而且開發(fā)人員可以通過SkyEye調試操作系統(tǒng)和系統(tǒng)軟件。
3.1 整體架構
SkyEye可以模仿多種完整的嵌入式計算機系統(tǒng)。其內部結構按功能可以分為四大部分:User Interface負責與用戶的接口;FlagManagement負責符號管理;Target Controlling負責目標控制;Target Smiulating負責對目標進行模擬。在這四個部分中,最核心最重要的部分是目標模擬部分,它實現(xiàn)了對SkyEye硬件各個方面的模擬,并仿真執(zhí)行每一條機器指令,體現(xiàn)了SkyEye硬件模擬器中的模擬邏輯。
3.2 Target Smiulating的功能結構
SkyEye目標模擬部分是整個仿真環(huán)境的關鍵,它包括以下幾個主要模塊:
(1)初始化模塊:此模塊的功能是實現(xiàn)對模擬硬件的配置和初始化,在模擬硬件開始運行前,需要修改配置文件中各選項的參數(shù)來進行配置和初始化。
(2)處理器模擬模塊:模擬CPU指令執(zhí)行過程、模擬內存管理單元和緩存、模擬協(xié)處理器。
(3)輸入輸出模擬模塊:模擬各種外設的行為,主要包括模擬系統(tǒng)輸入輸出模塊、模擬網絡芯片模塊、模擬LCD模塊等。
(4)MEMORY模擬模塊:此模塊的主要功能是初始化內存,加載二進制鏡像文件,模擬RAM和ROM的讀寫過程,此模塊不涉及具體的CPU和開發(fā)板。
3.3 SkyEye的配置信息
Skyeye的配置信息包括靜態(tài)配置信息和動態(tài)配置信息。他們都存在于SkyEye目標模擬模塊中。
SkyEye的靜態(tài)配置信息最為關鍵的數(shù)據(jù)結構是skyeye_config_t,它包含了SkyEye模擬的整個硬件的靜態(tài)配置,skyeye_config_t結構中包含了開發(fā)板配置信息、CPU核心配置信息、內存圖配置信息、網絡配置信息和顯示屏配置信息等與模擬硬件緊密相關的信息。
SkyEye的動態(tài)配置信息最為關鍵的數(shù)據(jù)結構是ARMul_State結構,它保存著SkyEye中隨模擬的硬件運行而不斷改變的硬件數(shù)據(jù)。通過分析ARMul_io的數(shù)據(jù)結構,可以了解如何一步一步的為某個具體的開發(fā)板添加虛擬硬件。
3.4 SkyEye的執(zhí)行過程分析
SkyEye的執(zhí)行按執(zhí)行時間順序可分為初始化配置過程和模擬執(zhí)行過程兩個階段。第一階段所做的工作包括:加載操作系統(tǒng)的可執(zhí)行文件;根據(jù)skyeye.conf配置文件中的參數(shù)對模擬硬件進行配置;加載skyeye.conf配置文件中的所有BinaryImage格式文件;由GDB加載調試信息;由GDB加載操作系統(tǒng)可執(zhí)行文件中的代碼段和數(shù)據(jù)段等;執(zhí)行相關模擬硬件的初始化函數(shù)。第二階段所做的工作是根據(jù)具體硬件的配置參數(shù),開始執(zhí)行具體的硬件模擬過程。
對于輸入輸出硬件模擬部分,SkyEye把這一部分抽象了出來,建立了一個獨立的I/O抽象層。然后再根據(jù)各種基于ARM的具體的CPU和開發(fā)板實現(xiàn)具體 I/O處理模擬。這樣做是因為具體的CPU和開發(fā)板都有自己的各不相同擴展,這些擴展與硬件系統(tǒng)的I/O有很大的關系,這樣做可以最大程度地減少代碼冗,并且使結構和模塊化更清晰,同時可以降低因開發(fā)板多樣性帶來的開發(fā)難度。
4 使用SkyEye建立嵌入式開發(fā)環(huán)境
由于Skyeye已經相對比較完善,可以仿真的開發(fā)板較多,本文選用Skyeye作為測試環(huán)境來分析嵌入式操作系統(tǒng)在仿真環(huán)境下的移植過程。
首先需要安裝配置Skyeye開發(fā)環(huán)境,為下一步的一直工作做準備。
4.1 安裝SkyEye
本文選用宿主機操作系統(tǒng)為ubuntu10.04,該版本為SkyEye開發(fā)團隊測試通過的安裝平臺。SkyEye并不是在所有發(fā)行板上做測試,所以可以選用一個經過官方測試的發(fā)行版以避免在搭建平臺過程中遇到未知問題。
(1)下載skyeye的發(fā)行包:http://sourceforge.net/projects/skyeye/files/skyeye/
以root權限登錄ubuntu,用tar xvjf 命令解壓下載的SkyEye發(fā)行包。
(2)編譯安裝程序
#./configure --prefix=/opt/skyeye
#make lib
#make
# make install_lib
# make install
需要說明的是,其中configure為配置編譯環(huán)境,設置安裝路徑,make lib用來編譯第三方的庫,make來編譯SkyEye的源代碼
4.2 SkyEye的目錄結構
SkyEye安裝完后在opt目錄下會生成以下目錄:Bin目錄用來存放SkyEye的工具軟件。如nandflash鏡像的制作工具mknandflashdump,SkyEye為命令行應用程序,對代碼覆蓋率結果文件進行格式轉換的prof_convert工具,在xterm終端來顯示串口的輸出的uart_instance工具等等。Include目錄中存放的是開發(fā)SkyEye插件時所用到的頭文件。Info目錄中存放的是info格式的文檔。Lib目錄中存放的是SkyEye的核心庫文件libcommon.so和其他一些以動態(tài)庫文件方式存在的插件。Testsuite中存放的是測試用例文件。
5 在SkyEye中模擬uClinux內核的移植
5.1 建立交叉編譯環(huán)境
與具體開發(fā)板對應的SkyEye平臺安裝配置完成之后就可以進行uClinux操作系統(tǒng)的移植工作。移植前非常重要的準備工作就是建立交叉編譯環(huán)境。嵌入式開發(fā)板資源有限,無法對操作系統(tǒng)進行編譯,所以必須在其他平臺上編譯出嵌入式開發(fā)板上能夠運行的操作系統(tǒng)代碼,這就是交叉編譯。仿真的嵌入式開發(fā)平臺面臨同樣的問題。
交叉編譯環(huán)境就是為了解決如何在宿主操作系統(tǒng)上生成在開發(fā)板上運行的代碼的問題。在這里我們的宿主操作系統(tǒng)是ubuntu10.04。需要對將要運行在開發(fā)板上的 uClinux 的源代碼重新編譯,生成可以在SkyEye上運行的二進制文件。交叉編譯環(huán)境是幾個程序的集合,這些程序運行在宿主機器上,包括編譯器、連接器等。在宿主機器上使用這些程序就能生成在開發(fā)板上運行的二進制代碼。一些開源組織已經開發(fā)出了一些交叉編譯工具,一般稱之為交叉編譯工具鏈。在本文中使用了ARM-ELF-TOOLS這個交叉編譯工具鏈,首先下載arm-elf-tools-20040427版本,開發(fā)人員只需要在根目錄下執(zhí)行./arm-elf-tools-20040427.sh后,就可以在/usr/local/bin中生成以arm-elf 開頭的可執(zhí)行文件,其中 arm-elf-gcc 就是交叉編譯器。
5.2 編譯Linux內核
下載uClinux最新版本uClinux-dist-20121024.tar.bz2
將uClinux-dist-20121024.tar.bz2解壓,然后進入解壓后的目錄uClinux-dist。
執(zhí)行內核配置命令:make menuconfig
選擇
Vendor/Product: GDB/ARMulator
Kernel Version: linux-2.6.x
Libc Version: uC-libc
保存退出
#make dep
#make
5.3 在Skyeye中運行uClinux
首先在uclinux-dist目錄下添加文件skyeye.conf。
根據(jù)模擬使用的平臺修改相應內容。
例如
cpu :arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
lcd: state=on
然后執(zhí)行
#./(skyeye目錄)/binary/skyeye -e (uClinux目錄)/linux-2.6.x/linux
6 結束語
目前的嵌入式硬件平臺的仿真軟件已經可以仿真一些主流的開發(fā)板,為嵌入式開發(fā)和學習提供了高效的低成本的實驗環(huán)境,使得開發(fā)人員在沒有硬件環(huán)境的情況下也能熟悉嵌入式硬件開發(fā)平臺的結構,掌握嵌入式開發(fā)的方法。但是現(xiàn)在的嵌入式仿真軟件還不成熟,易用性有待進一步提高,同時與真實的硬件平臺有著一定的差距,不能完全仿真硬件的各種特性,最終的開發(fā)還是要在真實硬件平臺上實現(xiàn)。因此開發(fā)人員應該采用軟件仿真與硬件實現(xiàn)相結合的方式來提高開發(fā)效率并保證開發(fā)的可行性。
參考文獻:
[1]陳渝等.源碼開放的嵌入式系統(tǒng)軟件分析與實踐[M].北京:北京航空航天大學出版社,2004.
[2]沈沙等.uclinux操作系統(tǒng)在嵌入式SOC平臺上的移植.計算機工程與應用[J].2004,40(26):104-108.
[3]Michael.Kang.SkyEye用戶手冊.[EB/OL].http://sourceforge.net,2010.
[4]uClinux in the GDB/ARMulator.http://www.uclinux.org.
[5]陳渝,楊曄,李明,等.嵌入式系統(tǒng)仿真環(huán)境SkyEye[J].電子設計應用,2004(2).
作者簡介:李鑫(1979-),男,講師,研究方向:嵌入式系統(tǒng)。