陳宇星,張 力,謝發榮
(昆明理工大學信息工程與自動化學院,昆明 650500)
在后PC時代和物聯網概念盛行的今天,嵌入式設備無所不在。其中ARM微處理器是一種低功率高性能的32位RISC微處理器,目前ARM微處理器已經深入到無線通信、網絡應用、工業控制、消費類電子產品、智能家居和汽車數碼等各個領域。而ARM9作為ARM系列中的主流產品,具有很高的性價比,在各個方面都有很廣的應用,此處使用的MINI2440開發板就是采用了基于ARM9架構的S3C2440微處理器。
大多數嵌入式系統的開發,由于目標機和宿主機使用的是不同體系結構的處理器,因此無法在宿主機上運行和測試目標程序,通常需要建立一個交叉編譯環境,將編譯后的可執行二進制文件下載到目標平臺上運行。如此就使得只能在目標操作系統移植系統設計完成之后,才能進行嵌入式軟件的調試和開發[1]。而又因為嵌入式開發一般需要邏輯分析儀、在線調試器和硬件設備這樣一套開發調試組合平臺,費用常常高達數萬元甚至十幾萬元以上,所以對于想進行嵌入式操作系統研究學習或應用軟件設計開發的研發人員而言,就可能存在以下兩個問題:
1)由于經費不足,無法購買必須的硬件設備和軟件來構造學習和開發的環境。
2)對硬件不太熟悉而在調試硬件方面耗費太多精力,而高層次的軟件設計和開發一般又不用太考慮底層硬件的實現細節,如果直接處于一個實際的硬件環境中,在開發和研究時就可能陷入硬件的具體細節中,不能把精力放在軟件開發上。
因此有必要使用一種介于嵌入式操作系統和硬件之間的嵌入式仿真系統即仿真軟件,來模擬各種硬件設備,使得開發者和學習者在此平臺上可模擬各種硬件設備,從而獲得一種高效且廉價(甚至是免費)的學習和開發環境[2]。
通常,仿真軟件是指通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離的環境中的完整計算機系統。仿真軟件能夠在其運行的計算機系統上創建一個封閉的隔離環境,并能夠保證虛擬環境中計算行為的安全性。而嵌入式系統作為一種特殊的軟件和硬件綜合體,其普遍被認同的定義是:以應用為中心、以計算機技術為基礎、軟件硬件可裁剪、適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專業計算機系統。嵌入式系統一般由嵌入式微處理器、外網硬件設備、嵌入式操作系統和特定的應用程序所組成。其中硬件平臺的多樣性是嵌入式系統的主要特點,不同的應用通常有不同的硬件環境[3]。而嵌入式操作系統則具有相當不變性,主要完成嵌入式應用的任務調度和控制等核心功能,具有內核較精簡、可配置、與高層應用緊密關聯等特點。嵌入式應用程序運行于操作系統之上,利用操作系統提供的機制完成特定的嵌入式應用[4]。
仿真軟件和嵌入式系統的以上特征決定了此處所描述的嵌入式仿真系統需要在通用的LINUX和WINDOWS平臺上實現一個如圖1所示的仿真集成開發環境,模擬ARMLinux、uCOS-II、WinCE 等常見嵌入式計算機系統和TCP/IP、圖形子系統和文件子系統等系統軟件,并可對它們進行源碼級別的分析和測試。

圖1 仿真平臺結構圖
由于此處需要對ARM9-S3C2440微處理器嵌入式系統(簡稱ARM2440)進行模擬仿真,而目前可以模擬ARM2440的指令級仿真軟件有以下幾款:QEMU、ARMulator、國內清華大學研發的 Skyeye,還有2010年國內慧至科技公司研發的Realboard仿真軟件平臺。
鑒于從方便性、靈活性、成熟度和發展前景來分析比較,文章選擇了QEMU。因為QEMU系統是目前較為先進的可開發源代碼的具有動態二進制翻譯技術的跨平臺仿真軟件,它可以模擬IA32(x86)、ARM、AMD64、MIPS R4000、SPARC sun3 與 PowerPC(Prep及Power Macintosh)等架構。而QEMU的原理是首先將ELF格式的可執行文件翻譯成中間形式,然后根據中間形式,拷貝編譯好的微操作代碼(由C語言實現),形成目標基本塊,最后再執行此基本塊。它的總體結構如圖2所示[5]。

圖2 QEMU總體結構圖
另外目前的QEMU仿真速度已經越來越快,不需要像skyeye一樣必須使用配置文件設置內存地址等信息,而是可以直接使用腳本命令進行修改操作,其中更重要的一點就是其網絡配置十分方便,它有三種網絡模式可供選擇,其中的TUN/TAP模式在Linux系統中模擬網絡是很標準的做法,這就與vmware和vitualbox等常用虛擬機的橋接網絡配置方式是一樣的。這種網絡配置方式特別有利于進行U-Boot中的TFTP傳輸燒寫內核和掛載NFS網絡文件系統的實驗[6]。
此處所使用的宿主機平臺為發行版Linux免費操作系統Ubuntu 11.10,主要是為了方便編譯工具的安裝制作,減少編譯源碼時產生的函數庫依賴問題。當然宿主機平臺也可以使用其他的操作系統搭建編譯環境,例如在WINDOWS上安裝MinGW和MSYS以及CodeSourcery ARM EABI交叉編譯工具鏈,由于在這些環境中建立仿真平臺比在Ubuntu上更為復雜,因此這里就不予闡述了。
雖然在Ubuntu上使用軟件源自動安裝的標準QEMU仿真軟件中的qemu-system-arm命令并不支持基于ARM920T的S3C2440處理器,但是可以從http://repo.or.cz/這個網站里面下載到專門支持S3C2440處理器的QEMU for MINI2440仿真軟件源碼和U-Boot for MINI2440引導程序源碼,還有Linux kernel for MINI2440的內核源碼。
其中Qemu for MINI2440是已經經過修改專門為MINI2440開發板定制并且以u-boot為引導程序的專用性很強的源碼。引導程序U-Boot for MINI2440也是把架構清晰、可移植性強的U-Boot開源程序經過修改使之適應于MINI2440的網卡和NAND FLASH等硬件驅動。而Linux kernel for MINI2440則是將MINI2440開發板上的各種特殊硬件驅動程序加入到了標準linux內核源碼中。
首先,進入 Ubuntu宿主機系統,執行以下命令[7]:
sudo apt-get install build-essential ddd cpio libncurses5-dev libsdl-dev zlib1g-dev
此時,宿主機操作系統安裝了QEMU編譯工具GCC和必備的函數庫。接著執行下列命令安裝TUN/TAP虛擬網絡仿真模塊:
sudo apt-get install kernel-package linuxsource//下載內核源碼
cd/usr/src/linux-source-‘uname -r’
sudo tar xjvf linux-source-‘uname -r’
cd linux-source-‘uname -r’
sudo-s//進入root根用戶模式
cp/boot/config-[kernel-version]./.config make menuconfig//配置內核,將 TUN/TAP選擇(M)編譯模塊
make modules//重新只編譯(M)模塊選項,不編譯(*)選項支持的功能
cp ./driver/net/tun.ko/lib/module/’uname -r’/kernel/driver/net
depmod//重新建立模塊依賴關系
modprobe tun//加載TUN虛擬網絡模塊
lsmod|grep tun//檢查若出現 tun 87040則成功加載TUN模塊
然后到 http://repo.or.cz/w/qemu/mini2440.git/snapshot/HEAD.tar.gz 下載 qemu for mini2440源碼包,解壓后,在源代碼的主目錄中執行下面的命令行操作對QEMU進行編譯:
./configure- -target-list=arm-softmmu Make-j4
最后,在arm-softmmu文件夾內將生成qemu-system-arm這個二進制程序。
首先,使用以下命令安裝交叉編譯工具:
tar jxvf arm-2008q3-72-arm-none-linuxgnueabi-i686-pc-linux-gnu.tar.bz2-C/
export PATH=$PATH:/opt/arm-2009q1/bin/
使用以上最后一條命令將交叉編譯工具目錄加入環境變量,則交叉工具鏈 arm-none-linuxgnueabi-將在此終端命令行中產生作用。
然后下載U-Boot源碼包,使用下列命令將它解壓編譯:
mv HEAD.tar.gz uboot.tar.gz
tar xzvf uboot.tar.gz
cd uboot
打開Makefile配置文件,將CROSS_COMPILE變量修改賦值為現有的交叉編譯工具鏈的名稱:arm-none-linux-gnueabi-
再執行下列命令進行編譯:
make mini2440_config
make-j4
編譯完畢后,即在當前目錄下生成名為uboot.bin的文件。注意如果在之后需要使用 uboot的nfs下載文件功能,需要修改代碼中的一部分,將net/nfs.c文件中的 NFS_TIMEOUT=2UL修改為NFS_TIMEOUT=20000UL,這樣就可以添加延時時間,從而避免NFS文件下載失敗。還有最好將其中初始化IP地址的代碼修改為和自己宿主機當前的IP地址同屬一個網段,以方便以后的TFTP和NFS 聯網實驗[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
最后,會在arch/arm/boot目錄下生成uImage文件,將此文件復制到qemu目錄下面的mini2440文件夾下,并將 mini2440文件夾中的 mini2440_start.sh作如下修改,將 kernel一行改為 – kernel“$base/uImage”即可[9]。
首先,在友善之臂公司的官網 http://www.arm9.net/download.asp上可以下載到基于 Linux kernel for mini2440的Rootfs-Qtopia-Qt4這樣的目標文件系統壓縮包,它是基于 Busybox-1.13.3,包含 Qtopia-2.2.0 和 QtE -4.6.3 可以自由切換運行的雙圖形系統。使用以下命令將它解壓[10]:
sudo tar xzvf rootfs_qtopia_qt4 -20100816.tar.gz-C/opt/nfs
然后,進入/opt/nfs/rootfs_qtopia_qt4這個文件夾中,修改etc/init.d/rcS這個文件,將下面兩個語句按照如下方式注釋掉即可:
#/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服務器,并啟動之:
sudo apt-get install nfs-kernel-server
sudo/etc/init.d/nfs- kernel- server restart
進入qemu/mini2440這個文件夾中,修改mini2440_start.sh這個文件,改為下面的語句:
-net tap,vlan=0,ifname=tap0,script="$base/qemu-ifup",downscript="$base/qemu-ifdown"
最后,當做完以上修改后,在命令行中進入qemu目錄,并輸入以下命令:
sudo ./mini2440/mini2440_start.sh
就可以看到終端中kernel開始加載的信息,當文件系統成功掛載后,可以在QEMU軟件中看到Qtopia2圖形操作系統。
本rootfs-qtopia-qt4文件系統之中有一個友善公司制作的名稱為Start Qt4.6.3的軟件,點擊后可以自動切換進入QT4圖形環境。本實驗移植了一個基于QT4開發的電子詞典qt-dict[11]。由于本部分涉及的代碼修改過程和移植方法細節較多,在這里就不做詳細介紹了[12]。
移植成功后,仿真實驗效果如圖3所示。
隨著社會的快速發展,嵌入式在人們生活的方方面面扮演著越來越重要的角色,ARM微處理器已經出現在人們周圍各式各樣的設備中。而QEMU作為一個純軟件的開源跨平臺硬件仿真平臺已經得到了越來越多的應用,例如最近比較流行的智能移動終端操作系統Android的開發模擬平臺使用的就是QEMU仿真軟件。QEMU的出現為嵌入式軟件設計節約了大量的開發時間。此處建立的開發環境,使得開發人員可以在沒有開發板的情況下進行前期軟件開發、調試和試運行,大大提高了開發效率,是對嵌入式軟件開發的有力支持。

圖3 基于QT4圖形界面的電子詞典
[1]江樂斌.嵌入式MCU仿真的研究與實現[D].成都:電子科技大學,2007.
[2]張雪燕.嵌入式仿真系統在嵌入式開發中的應用[J].寧波廣播電視大學學報,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]宋靖,吳慶波.嵌入式系統仿真運行環境SkyEye應用研究[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,France,2011.
[7]Leao.使用qemu建立mini2440的模擬仿真環境[EB/OL].2011. http://www.cnblogs.com/jinmu190/archive/2011/03/21/1990698.html
[8]陳璇.嵌入式Linux開發[J].昆明理工大學學報(理工版),2005,30(z1):362 -365.
[9]盛惠興,王海濱,姚家坤.嵌入式Linux系統的開發與優化[J].微電子學與計算機,2007,24(6):94 -96.
[10]陳峰,李濱滔,戈志華.基于S3C2410的嵌入式Linux系統構建[J].現代電子技術,2007,30(20):55 -57.
[11]周國華,陸德波,朱荊洲.基于Linux的嵌入式應用開發策略[J].計算機與數字工程,2005,33(3):42-45.
[12]王存健,張建正.嵌入式Linux下Qt/Embedded的應用[J].計算機技術與發展,2006,16(11):179 -181.