有时候在家里想研究嵌入式linux,但是有没有开发板(当然也可以买一套,但是有时候还是不如模拟器来的方便,而且学习处理器无关的内核部分,也用不到开发板),光看代码是不行的,必须实践才能深入理解很多东西,这时候就需要模拟器了。qemu是一款非常流行的模拟器,不但能模拟x86的PC机,还能模拟很多嵌入式开发板,包括MIPS和ARM架构的很多处理器,也能基于应用的处理器模拟,很好很强大。下面是qemu的支持的系统级模拟,也就是包括处理器和周围外设:
· PC (x86 or x86_64 processor)
· ISA PC (old style PC without PCI bus)
· PREP (PowerPC processor)
· G3 Beige PowerMac (PowerPC processor)
· Mac99 PowerMac (PowerPC processor, in progress)
· Sun4m/Sun4c/Sun4d (32-bit Sparc processor)
· Sun4u/Sun4v (64-bit Sparc processor, in progress)
· Malta board (32-bit and 64-bit MIPS processors)
· MIPS Magnum (64-bit MIPS processor)
· ARM Integrator/CP (ARM)
· ARM Versatile baseboard (ARM)
· ARM RealView Emulation/Platform baseboard (ARM)
· Spitz, Akita, Borzoi, Terrier and Tosa PDAs (PXA270 processor)
· Luminary Micro LM3S811EVB (ARM Cortex-M3)
· Luminary Micro LM3S6965EVB (ARM Cortex-M3)
· Freescale MCF5208EVB (ColdFire V2).
· Arnewsh MCF5206 evaluation board (ColdFire V2).
· Palm Tungsten|E PDA (OMAP310 processor)
· N800 and N810 tablets (OMAP2420 processor)
· MusicPal (MV88W8618 ARM processor)
· Gumstix "Connex" and "Verdex" motherboards (PXA255/270).
· Siemens SX1 smartphone (OMAP310 processor)
· AXIS-Devboard88 (CRISv32 ETRAX-FS).
· Petalogix Spartan 3aDSP1800 MMU ref design (MicroBlaze).
· Avnet LX60/LX110/LX200 boards (Xtensa)
还支持很多平台的用户模拟,主要针对应用层,比如在非x86的cpu上运行x86应用,但是目前只支持Linux和BSD系统:
x86 (32 and 64 bit), PowerPC (32 and 64 bit), ARM, MIPS (32 bit only), Sparc (32 and 64 bit), Alpha, ColdFire(m68k), CRISv32 and MicroBlaze CPUs
我是第一次接触qemu,除了在网上看看有关文章也没啥实践经验,在网上找了一篇很好的文章,顺着做下去,过程中发现作者有写的简单或遗漏的地方,我在下面进行了补充。原文地址是:http://blog.csdn.net/linyt/article/details/42504975。当然写这篇文章和原文章重复比较多,我只是加强一下印象和理解,方便日后复习,也做一些纠错分享给大家,让大家更容易搭起这个环境。废话少说,马上开始动手。
PC系统:Ubuntu 14.04
目标系统:作者是以Versatile Express-A9开发板为例搭建环境的,为了顺利完成第一次搭建,我也用这个环境。
1. 在官网下载最新版本的qemu源码,地址是:http://wiki.qemu.org/Download
也可以通过git下载源码树:git clone git://git.qemu-project.org/qemu.git
2. 原文所列出需要安装的软件包:
sudo apt-get install zlib1g-dev
sudo apt-get install libglib2.0-0
sudo apt-get install libglib2.0-dev
sudo apt install autoconf
sudo apt-get install flex bison
sudo apt-get install libtool
3. 解压qemu源码包:
tar zxvf qemu qemu-2.7.0.tar.bz2
cd qemu-2.7.0
4. 然后配置编译安装
./configure --target-list=arm-softmmu --audio-drv-list=
--audio-drv-list必须要加,否则运行时报告有关audio的错误:
audio: Could not init `oss' audio driver
5. 用root权限安装:
sudo make install
安装到系统目录 /usr/local中
linux内核编译
1. 安装gun的交叉编译工具:
sudo apt-get install gcc-arm-linux-gnueabi
2. 下载方法:
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.tar.xz
我开始是git下载的torvalds的源码树,是最新的4.8版本,但是运行时一点log都没有,看起来是没引导成功,由于时间原因没有查下去,按照原文作者的描述,又下载了3.16版本的内核进行编译
3. 配置与编译
export CROSS_COMPILE=arm-linux-gnueabi-
export ARCH=arm
make vexpress_defconfig
make -j2
4. 在arch/arm/boot/目录中生成zImage备用
嵌入式系统中也要用到linux系统中的工具,busybox包含了这些常用的工具,所以在嵌入式系统磁盘空间有限的情况下非常有用。
1. busybox下载
wget http://www.busybox.net/downloads/busybox-1.25.0.tar.bz2 --no-check-certificate
2. 配置编译:
make defconfig
make CROSS_COMPILE=arm-linux-gnueabi-
make CROSS_COMPILE=arm-linux-gnueabi-install
注意这里的make install也会发生编译行为,所以也要加上CROSS_COMPILE-参数,否则会可能会发生下面的错误,原文中并没有说明,这里补充一下,具体错误如下:
miscutils/nandwrite.c: In function 'nandwrite_main':
miscutils/nandwrite.c:151:3: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this function)
miscutils/nandwrite.c:151:3: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [miscutils/nandwrite.o] Error 1
make: *** [miscutils] Error 2
3. 编译完成后,可以制作根文件系统了,首先创建必要的目录
mkdir rootfs
cd rootfs
mkdir rootfs /lib
mkdir rootfs /dev
4. 拷贝busybox编译生产的目录和文件,编译器自带的lib
sudo cp busybox-1.25.0/_install/* -r rootfs/
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/
5. 创建4个tty端终设备
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
6. 生成32M大小的镜像 ,copy文件系统树到镜像文件中
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
mkfs.ext3 a9rootfs.ext3
mkdir tmpfs
mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
cp -r rootfs/* tmpfs/
sudo umount tmpfs
此时时刻,所有的东西都准备好了,让我们运行一下看看效果吧,输入原作者提供的参数
marquis@marquis-song: ~/src/qemu-rootfs/:qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/marquis/src/kernel/linux-3.16/arch/arm/boot/zImage -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd a9rootfs.ext3
系统果断运行起来,好激动。
纠正一个原文中的错误,参数console=ttyAMA0,可以在linux kernel .config中CONFIG_CMDLINE找到,不是原文中所说的CONFIG_CONSOLE。
qemu如此强大,还需要深入研究充分利用它来节省时间和金钱的成本,更高效的学习linux内核,驱动等。另外,后边我计划搭建uboot+uImage的环境,这个环境在我的工作中很常用,弄好了再和大家分享。
参考资料:
QEMU Emulator User Documentation
http://blog.csdn.net/linyt/article/details/42504975