APP下载

基于QEMU的嵌入式系统仿真环境的构建

2012-09-11陈宇星谢发荣

微处理机 2012年6期
关键词:宿主机源码文件夹

陈宇星,张 力,谢发荣

(昆明理工大学信息工程与自动化学院,昆明 650500)

1 引言

在后PC时代和物联网概念盛行的今天,嵌入式设备无所不在。其中ARM微处理器是一种低功率高性能的32位RISC微处理器,目前ARM微处理器已经深入到无线通信、网络应用、工业控制、消费类电子产品、智能家居和汽车数码等各个领域。而ARM9作为ARM系列中的主流产品,具有很高的性价比,在各个方面都有很广的应用,此处使用的MINI2440开发板就是采用了基于ARM9架构的S3C2440微处理器。

大多数嵌入式系统的开发,由于目标机和宿主机使用的是不同体系结构的处理器,因此无法在宿主机上运行和测试目标程序,通常需要建立一个交叉编译环境,将编译后的可执行二进制文件下载到目标平台上运行。如此就使得只能在目标操作系统移植系统设计完成之后,才能进行嵌入式软件的调试和开发[1]。而又因为嵌入式开发一般需要逻辑分析仪、在线调试器和硬件设备这样一套开发调试组合平台,费用常常高达数万元甚至十几万元以上,所以对于想进行嵌入式操作系统研究学习或应用软件设计开发的研发人员而言,就可能存在以下两个问题:

1)由于经费不足,无法购买必须的硬件设备和软件来构造学习和开发的环境。

2)对硬件不太熟悉而在调试硬件方面耗费太多精力,而高层次的软件设计和开发一般又不用太考虑底层硬件的实现细节,如果直接处于一个实际的硬件环境中,在开发和研究时就可能陷入硬件的具体细节中,不能把精力放在软件开发上。

因此有必要使用一种介于嵌入式操作系统和硬件之间的嵌入式仿真系统即仿真软件,来模拟各种硬件设备,使得开发者和学习者在此平台上可模拟各种硬件设备,从而获得一种高效且廉价(甚至是免费)的学习和开发环境[2]。

2 仿真软件与嵌入式系统

通常,仿真软件是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离的环境中的完整计算机系统。仿真软件能够在其运行的计算机系统上创建一个封闭的隔离环境,并能够保证虚拟环境中计算行为的安全性。而嵌入式系统作为一种特殊的软件和硬件综合体,其普遍被认同的定义是:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专业计算机系统。嵌入式系统一般由嵌入式微处理器、外网硬件设备、嵌入式操作系统和特定的应用程序所组成。其中硬件平台的多样性是嵌入式系统的主要特点,不同的应用通常有不同的硬件环境[3]。而嵌入式操作系统则具有相当不变性,主要完成嵌入式应用的任务调度和控制等核心功能,具有内核较精简、可配置、与高层应用紧密关联等特点。嵌入式应用程序运行于操作系统之上,利用操作系统提供的机制完成特定的嵌入式应用[4]。

仿真软件和嵌入式系统的以上特征决定了此处所描述的嵌入式仿真系统需要在通用的LINUX和WINDOWS平台上实现一个如图1所示的仿真集成开发环境,模拟ARMLinux、uCOS-II、WinCE 等常见嵌入式计算机系统和TCP/IP、图形子系统和文件子系统等系统软件,并可对它们进行源码级别的分析和测试。

图1 仿真平台结构图

3 基于ARM9的仿真软件

由于此处需要对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]。

4 建立嵌入式开发环境

此处所使用的宿主机平台为发行版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内核源码中。

4.1 QEMU仿真环境的建立

首先,进入 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这个二进制程序。

4.2 编译移植U-Boot

首先,使用以下命令安装交叉编译工具:

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文件夹中去。

4.3 编译移植Linux kernel for 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]。

4.4 挂载rootfs-qtopia-qt4文件系统

首先,在友善之臂公司的官网 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图形操作系统。

5 移植QT4应用程序

本rootfs-qtopia-qt4文件系统之中有一个友善公司制作的名称为Start Qt4.6.3的软件,点击后可以自动切换进入QT4图形环境。本实验移植了一个基于QT4开发的电子词典qt-dict[11]。由于本部分涉及的代码修改过程和移植方法细节较多,在这里就不做详细介绍了[12]。

移植成功后,仿真实验效果如图3所示。

6 结束语

随着社会的快速发展,嵌入式在人们生活的方方面面扮演着越来越重要的角色,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.

猜你喜欢

宿主机源码文件夹
面向数据可靠传输的高译码率带反馈的LT码
国内一站式工程设备租赁平台众能联合完成C2、C3两轮融资
浅谈开源操作系统的历史
企业如何保护源码
嵌入式计算机软件测试关键技术研究
虚拟网络实验室在农村职校计算机网络技术教学中的应用研究
摸清超标源头 大文件夹这样处理
调动右键 解决文件夹管理三大难题
挂在墙上的文件夹
不容忽视的空文件夹