陳宇星,張 力,謝發(fā)榮
(昆明理工大學(xué)信息工程與自動(dòng)化學(xué)院,昆明 650500)
在后PC時(shí)代和物聯(lián)網(wǎng)概念盛行的今天,嵌入式設(shè)備無所不在。其中ARM微處理器是一種低功率高性能的32位RISC微處理器,目前ARM微處理器已經(jīng)深入到無線通信、網(wǎng)絡(luò)應(yīng)用、工業(yè)控制、消費(fèi)類電子產(chǎn)品、智能家居和汽車數(shù)碼等各個(gè)領(lǐng)域。而ARM9作為ARM系列中的主流產(chǎn)品,具有很高的性價(jià)比,在各個(gè)方面都有很廣的應(yīng)用,此處使用的MINI2440開發(fā)板就是采用了基于ARM9架構(gòu)的S3C2440微處理器。
大多數(shù)嵌入式系統(tǒng)的開發(fā),由于目標(biāo)機(jī)和宿主機(jī)使用的是不同體系結(jié)構(gòu)的處理器,因此無法在宿主機(jī)上運(yùn)行和測(cè)試目標(biāo)程序,通常需要建立一個(gè)交叉編譯環(huán)境,將編譯后的可執(zhí)行二進(jìn)制文件下載到目標(biāo)平臺(tái)上運(yùn)行。如此就使得只能在目標(biāo)操作系統(tǒng)移植系統(tǒng)設(shè)計(jì)完成之后,才能進(jìn)行嵌入式軟件的調(diào)試和開發(fā)[1]。而又因?yàn)榍度胧介_發(fā)一般需要邏輯分析儀、在線調(diào)試器和硬件設(shè)備這樣一套開發(fā)調(diào)試組合平臺(tái),費(fèi)用常常高達(dá)數(shù)萬元甚至十幾萬元以上,所以對(duì)于想進(jìn)行嵌入式操作系統(tǒng)研究學(xué)習(xí)或應(yīng)用軟件設(shè)計(jì)開發(fā)的研發(fā)人員而言,就可能存在以下兩個(gè)問題:
1)由于經(jīng)費(fèi)不足,無法購(gòu)買必須的硬件設(shè)備和軟件來構(gòu)造學(xué)習(xí)和開發(fā)的環(huán)境。
2)對(duì)硬件不太熟悉而在調(diào)試硬件方面耗費(fèi)太多精力,而高層次的軟件設(shè)計(jì)和開發(fā)一般又不用太考慮底層硬件的實(shí)現(xiàn)細(xì)節(jié),如果直接處于一個(gè)實(shí)際的硬件環(huán)境中,在開發(fā)和研究時(shí)就可能陷入硬件的具體細(xì)節(jié)中,不能把精力放在軟件開發(fā)上。
因此有必要使用一種介于嵌入式操作系統(tǒng)和硬件之間的嵌入式仿真系統(tǒng)即仿真軟件,來模擬各種硬件設(shè)備,使得開發(fā)者和學(xué)習(xí)者在此平臺(tái)上可模擬各種硬件設(shè)備,從而獲得一種高效且廉價(jià)(甚至是免費(fèi))的學(xué)習(xí)和開發(fā)環(huán)境[2]。
通常,仿真軟件是指通過軟件模擬的具有完整硬件系統(tǒng)功能的、運(yùn)行在一個(gè)完全隔離的環(huán)境中的完整計(jì)算機(jī)系統(tǒng)。仿真軟件能夠在其運(yùn)行的計(jì)算機(jī)系統(tǒng)上創(chuàng)建一個(gè)封閉的隔離環(huán)境,并能夠保證虛擬環(huán)境中計(jì)算行為的安全性。而嵌入式系統(tǒng)作為一種特殊的軟件和硬件綜合體,其普遍被認(rèn)同的定義是:以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)、軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗嚴(yán)格要求的專業(yè)計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)一般由嵌入式微處理器、外網(wǎng)硬件設(shè)備、嵌入式操作系統(tǒng)和特定的應(yīng)用程序所組成。其中硬件平臺(tái)的多樣性是嵌入式系統(tǒng)的主要特點(diǎn),不同的應(yīng)用通常有不同的硬件環(huán)境[3]。而嵌入式操作系統(tǒng)則具有相當(dāng)不變性,主要完成嵌入式應(yīng)用的任務(wù)調(diào)度和控制等核心功能,具有內(nèi)核較精簡(jiǎn)、可配置、與高層應(yīng)用緊密關(guān)聯(lián)等特點(diǎn)。嵌入式應(yīng)用程序運(yùn)行于操作系統(tǒng)之上,利用操作系統(tǒng)提供的機(jī)制完成特定的嵌入式應(yīng)用[4]。
仿真軟件和嵌入式系統(tǒng)的以上特征決定了此處所描述的嵌入式仿真系統(tǒng)需要在通用的LINUX和WINDOWS平臺(tái)上實(shí)現(xiàn)一個(gè)如圖1所示的仿真集成開發(fā)環(huán)境,模擬ARMLinux、uCOS-II、WinCE 等常見嵌入式計(jì)算機(jī)系統(tǒng)和TCP/IP、圖形子系統(tǒng)和文件子系統(tǒng)等系統(tǒng)軟件,并可對(duì)它們進(jìn)行源碼級(jí)別的分析和測(cè)試。
圖1 仿真平臺(tái)結(jié)構(gòu)圖
由于此處需要對(duì)ARM9-S3C2440微處理器嵌入式系統(tǒng)(簡(jiǎn)稱ARM2440)進(jìn)行模擬仿真,而目前可以模擬ARM2440的指令級(jí)仿真軟件有以下幾款:QEMU、ARMulator、國(guó)內(nèi)清華大學(xué)研發(fā)的 Skyeye,還有2010年國(guó)內(nèi)慧至科技公司研發(fā)的Realboard仿真軟件平臺(tái)。
鑒于從方便性、靈活性、成熟度和發(fā)展前景來分析比較,文章選擇了QEMU。因?yàn)镼EMU系統(tǒng)是目前較為先進(jìn)的可開發(fā)源代碼的具有動(dòng)態(tài)二進(jìn)制翻譯技術(shù)的跨平臺(tái)仿真軟件,它可以模擬IA32(x86)、ARM、AMD64、MIPS R4000、SPARC sun3 與 PowerPC(Prep及Power Macintosh)等架構(gòu)。而QEMU的原理是首先將ELF格式的可執(zhí)行文件翻譯成中間形式,然后根據(jù)中間形式,拷貝編譯好的微操作代碼(由C語言實(shí)現(xiàn)),形成目標(biāo)基本塊,最后再執(zhí)行此基本塊。它的總體結(jié)構(gòu)如圖2所示[5]。
圖2 QEMU總體結(jié)構(gòu)圖
另外目前的QEMU仿真速度已經(jīng)越來越快,不需要像skyeye一樣必須使用配置文件設(shè)置內(nèi)存地址等信息,而是可以直接使用腳本命令進(jìn)行修改操作,其中更重要的一點(diǎn)就是其網(wǎng)絡(luò)配置十分方便,它有三種網(wǎng)絡(luò)模式可供選擇,其中的TUN/TAP模式在Linux系統(tǒng)中模擬網(wǎng)絡(luò)是很標(biāo)準(zhǔn)的做法,這就與vmware和vitualbox等常用虛擬機(jī)的橋接網(wǎng)絡(luò)配置方式是一樣的。這種網(wǎng)絡(luò)配置方式特別有利于進(jìn)行U-Boot中的TFTP傳輸燒寫內(nèi)核和掛載NFS網(wǎng)絡(luò)文件系統(tǒng)的實(shí)驗(yàn)[6]。
此處所使用的宿主機(jī)平臺(tái)為發(fā)行版Linux免費(fèi)操作系統(tǒng)Ubuntu 11.10,主要是為了方便編譯工具的安裝制作,減少編譯源碼時(shí)產(chǎn)生的函數(shù)庫(kù)依賴問題。當(dāng)然宿主機(jī)平臺(tái)也可以使用其他的操作系統(tǒng)搭建編譯環(huán)境,例如在WINDOWS上安裝MinGW和MSYS以及CodeSourcery ARM EABI交叉編譯工具鏈,由于在這些環(huán)境中建立仿真平臺(tái)比在Ubuntu上更為復(fù)雜,因此這里就不予闡述了。
雖然在Ubuntu上使用軟件源自動(dòng)安裝的標(biāo)準(zhǔn)QEMU仿真軟件中的qemu-system-arm命令并不支持基于ARM920T的S3C2440處理器,但是可以從http://repo.or.cz/這個(gè)網(wǎng)站里面下載到專門支持S3C2440處理器的QEMU for MINI2440仿真軟件源碼和U-Boot for MINI2440引導(dǎo)程序源碼,還有Linux kernel for MINI2440的內(nèi)核源碼。
其中Qemu for MINI2440是已經(jīng)經(jīng)過修改專門為MINI2440開發(fā)板定制并且以u(píng)-boot為引導(dǎo)程序的專用性很強(qiáng)的源碼。引導(dǎo)程序U-Boot for MINI2440也是把架構(gòu)清晰、可移植性強(qiáng)的U-Boot開源程序經(jīng)過修改使之適應(yīng)于MINI2440的網(wǎng)卡和NAND FLASH等硬件驅(qū)動(dòng)。而Linux kernel for MINI2440則是將MINI2440開發(fā)板上的各種特殊硬件驅(qū)動(dòng)程序加入到了標(biāo)準(zhǔn)linux內(nèi)核源碼中。
首先,進(jìn)入 Ubuntu宿主機(jī)系統(tǒng),執(zhí)行以下命令[7]:
sudo apt-get install build-essential ddd cpio libncurses5-dev libsdl-dev zlib1g-dev
此時(shí),宿主機(jī)操作系統(tǒng)安裝了QEMU編譯工具GCC和必備的函數(shù)庫(kù)。接著執(zhí)行下列命令安裝TUN/TAP虛擬網(wǎng)絡(luò)仿真模塊:
sudo apt-get install kernel-package linuxsource//下載內(nèi)核源碼
cd/usr/src/linux-source-‘uname -r’
sudo tar xjvf linux-source-‘uname -r’
cd linux-source-‘uname -r’
sudo-s//進(jìn)入root根用戶模式
cp/boot/config-[kernel-version]./.config make menuconfig//配置內(nèi)核,將 TUN/TAP選擇(M)編譯模塊
make modules//重新只編譯(M)模塊選項(xiàng),不編譯(*)選項(xiàng)支持的功能
cp ./driver/net/tun.ko/lib/module/’uname -r’/kernel/driver/net
depmod//重新建立模塊依賴關(guān)系
modprobe tun//加載TUN虛擬網(wǎng)絡(luò)模塊
lsmod|grep tun//檢查若出現(xiàn) tun 87040則成功加載TUN模塊
然后到 http://repo.or.cz/w/qemu/mini2440.git/snapshot/HEAD.tar.gz 下載 qemu for mini2440源碼包,解壓后,在源代碼的主目錄中執(zhí)行下面的命令行操作對(duì)QEMU進(jìn)行編譯:
./configure- -target-list=arm-softmmu Make-j4
最后,在arm-softmmu文件夾內(nèi)將生成qemu-system-arm這個(gè)二進(jìn)制程序。
首先,使用以下命令安裝交叉編譯工具:
tar jxvf arm-2008q3-72-arm-none-linuxgnueabi-i686-pc-linux-gnu.tar.bz2-C/
export PATH=$PATH:/opt/arm-2009q1/bin/
使用以上最后一條命令將交叉編譯工具目錄加入環(huán)境變量,則交叉工具鏈 arm-none-linuxgnueabi-將在此終端命令行中產(chǎn)生作用。
然后下載U-Boot源碼包,使用下列命令將它解壓編譯:
mv HEAD.tar.gz uboot.tar.gz
tar xzvf uboot.tar.gz
cd uboot
打開Makefile配置文件,將CROSS_COMPILE變量修改賦值為現(xiàn)有的交叉編譯工具鏈的名稱:arm-none-linux-gnueabi-
再執(zhí)行下列命令進(jìn)行編譯:
make mini2440_config
make-j4
編譯完畢后,即在當(dāng)前目錄下生成名為uboot.bin的文件。注意如果在之后需要使用 uboot的nfs下載文件功能,需要修改代碼中的一部分,將net/nfs.c文件中的 NFS_TIMEOUT=2UL修改為NFS_TIMEOUT=20000UL,這樣就可以添加延時(shí)時(shí)間,從而避免NFS文件下載失敗。還有最好將其中初始化IP地址的代碼修改為和自己宿主機(jī)當(dāng)前的IP地址同屬一個(gè)網(wǎng)段,以方便以后的TFTP和NFS 聯(lián)網(wǎng)實(shí)驗(yàn)[8]。
最后,將編譯好的 u-boot.bin拷貝到 qemu/mini2440文件夾中去。
首先,使用以下命令安裝Uimage制作工具:sudo apt-get install uboot-mkimage
然后編譯Linux kernel for mini2440:make mini2440_defconfig ARCH=arm
make-j4 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
最后,會(huì)在arch/arm/boot目錄下生成uImage文件,將此文件復(fù)制到qemu目錄下面的mini2440文件夾下,并將 mini2440文件夾中的 mini2440_start.sh作如下修改,將 kernel一行改為 – kernel“$base/uImage”即可[9]。
首先,在友善之臂公司的官網(wǎng) http://www.arm9.net/download.asp上可以下載到基于 Linux kernel for mini2440的Rootfs-Qtopia-Qt4這樣的目標(biāo)文件系統(tǒng)壓縮包,它是基于 Busybox-1.13.3,包含 Qtopia-2.2.0 和 QtE -4.6.3 可以自由切換運(yùn)行的雙圖形系統(tǒng)。使用以下命令將它解壓[10]:
sudo tar xzvf rootfs_qtopia_qt4 -20100816.tar.gz-C/opt/nfs
然后,進(jìn)入/opt/nfs/rootfs_qtopia_qt4這個(gè)文件夾中,修改etc/init.d/rcS這個(gè)文件,將下面兩個(gè)語句按照如下方式注釋掉即可:
#/sbin/ifconfig lo 127.0.0.1
#/etc/init.d/ifconfig - eth0
其次,修改/etc/exports文件,在文件末尾添加如下一行:
/opt/nfs/rootfs_qtopia_qt4*(rw,sync,no_root_squash)
并按照如下命令安裝NFS服務(wù)器,并啟動(dòng)之:
sudo apt-get install nfs-kernel-server
sudo/etc/init.d/nfs- kernel- server restart
進(jìn)入qemu/mini2440這個(gè)文件夾中,修改mini2440_start.sh這個(gè)文件,改為下面的語句:
-net tap,vlan=0,ifname=tap0,script="$base/qemu-ifup",downscript="$base/qemu-ifdown"
最后,當(dāng)做完以上修改后,在命令行中進(jìn)入qemu目錄,并輸入以下命令:
sudo ./mini2440/mini2440_start.sh
就可以看到終端中kernel開始加載的信息,當(dāng)文件系統(tǒng)成功掛載后,可以在QEMU軟件中看到Qtopia2圖形操作系統(tǒng)。
本rootfs-qtopia-qt4文件系統(tǒng)之中有一個(gè)友善公司制作的名稱為Start Qt4.6.3的軟件,點(diǎn)擊后可以自動(dòng)切換進(jìn)入QT4圖形環(huán)境。本實(shí)驗(yàn)移植了一個(gè)基于QT4開發(fā)的電子詞典qt-dict[11]。由于本部分涉及的代碼修改過程和移植方法細(xì)節(jié)較多,在這里就不做詳細(xì)介紹了[12]。
移植成功后,仿真實(shí)驗(yàn)效果如圖3所示。
隨著社會(huì)的快速發(fā)展,嵌入式在人們生活的方方面面扮演著越來越重要的角色,ARM微處理器已經(jīng)出現(xiàn)在人們周圍各式各樣的設(shè)備中。而QEMU作為一個(gè)純軟件的開源跨平臺(tái)硬件仿真平臺(tái)已經(jīng)得到了越來越多的應(yīng)用,例如最近比較流行的智能移動(dòng)終端操作系統(tǒng)Android的開發(fā)模擬平臺(tái)使用的就是QEMU仿真軟件。QEMU的出現(xiàn)為嵌入式軟件設(shè)計(jì)節(jié)約了大量的開發(fā)時(shí)間。此處建立的開發(fā)環(huán)境,使得開發(fā)人員可以在沒有開發(fā)板的情況下進(jìn)行前期軟件開發(fā)、調(diào)試和試運(yùn)行,大大提高了開發(fā)效率,是對(duì)嵌入式軟件開發(fā)的有力支持。
圖3 基于QT4圖形界面的電子詞典
[1]江樂斌.嵌入式MCU仿真的研究與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2007.
[2]張雪燕.嵌入式仿真系統(tǒng)在嵌入式開發(fā)中的應(yīng)用[J].寧波廣播電視大學(xué)學(xué)報(bào),2006,4(1):82-84.
[3]Wei Chen.An Emulator for Executing IA - 32 Applications on ARM - Based Systems[J].JOURNAL OF COMPUTERS,2010,5(7):1133 -1135.
[4]宋靖,吳慶波.嵌入式系統(tǒng)仿真運(yùn)行環(huán)境SkyEye應(yīng)用研究[J].微處理機(jī),2007,28(2):94-97.
[5]Fabrice Bellard.QEMU,a Fast and Portable Dynamic Translator[C].2005 USENIX Annual Technical Conference,2005.
[6]Wolfgang Mueller.1st International QEMU Users Forum[C].Alpexpo,Grenoble,F(xiàn)rance,2011.
[7]Leao.使用qemu建立mini2440的模擬仿真環(huán)境[EB/OL].2011. http://www.cnblogs.com/jinmu190/archive/2011/03/21/1990698.html
[8]陳璇.嵌入式Linux開發(fā)[J].昆明理工大學(xué)學(xué)報(bào)(理工版),2005,30(z1):362 -365.
[9]盛惠興,王海濱,姚家坤.嵌入式Linux系統(tǒng)的開發(fā)與優(yōu)化[J].微電子學(xué)與計(jì)算機(jī),2007,24(6):94 -96.
[10]陳峰,李濱滔,戈志華.基于S3C2410的嵌入式Linux系統(tǒng)構(gòu)建[J].現(xiàn)代電子技術(shù),2007,30(20):55 -57.
[11]周國(guó)華,陸德波,朱荊洲.基于Linux的嵌入式應(yīng)用開發(fā)策略[J].計(jì)算機(jī)與數(shù)字工程,2005,33(3):42-45.
[12]王存健,張建正.嵌入式Linux下Qt/Embedded的應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2006,16(11):179 -181.