这一段时间在研究在PC上跑arm模拟器,为了调试linux内核。也看了linux的UML模式,很不好用。认识qemu实在android的模拟器上,很方便。找到qemu的主页。本文关于交叉编译的部分都是ARCH=arm CROSS-COMPILE=arm-none-linux-gnueabi- 关于eabi就是2进制的嵌入式优化(EABI embedded application binary interface)。
ubuntu有qemu,先安装apt-get install qemu qemu-kvm qemu-common
但是版本太低了,自己编译支持arm的版本覆盖安装。
1,下载最新版的qemu-0.13.0.tar.gz 和arm的测试例子arm-test-0.2.tar.gz
编译qemu
#./configure --prefix=/usr --target-list=arm-softmmu,arm-linux-user
#make
#make install
测试官方提同的例子
#qemu-system-arm -kernel zImage.integrator -initrd arm_root.img
在终端的文本模式
#qemu-system-arm -kernel zImage.integrator -initrd arm_root.img -nographic -append "console=ttyAMA0"
因为支持qemu-kvm 速度很快。不过是linux是2.6.17。
用qemu测试最新的linux
2,下载支持arm的linux git://linux-arm.org/linux-2.6-stable.git
编译内核
把zImage.integrator里config解压出来 (arm-test-0.2.tar.gz里面有说明)
#make integrator_defconfig
#make menuconfig
去掉 CONFIG_BLK_DEV_INITRD 支持为了调试方便用nfs根文件系统
CONFIG_TUN=y 为了支持qemu的nfs文件启动
#make
#make
#make menuconfig #把静态编译选上。
#make install
在把_install文件夹拷出改名 busybox_install
添加 etc proc 等等文件夹 做成根文件系统 (查找网上的如何从busybox生成根文件系统)
3,使qemu和主机ubuntu可以网络通信,可以用nfs根文件系统
测试主机ubuntu支不支持 TUN 网络
#grep CONFIG_TUN= /boot/config-`uname -r`
如果 CONFIG_TUN=m
#modprobe tun
或者 CONFIG_TUN=y
#mkdir /dev/net/
#mknod /dev/net/tun c 10 200
在当前目录生成可执行文件 integrator-ifup
ifconfig tap0 10.0.2.2 broadcast 10.0.2.255 netmask 255.255.255.0 promisc up
现在可以用qemu官方测试版来测试下网络了。
#qemu-system-arm -kernel zImage.integrator -initrd arm_root.img -net nic -net tap,script=integrator-ifup 来测试网络
多加的命令就是在ubuntu主机上生成一个名字是tap0的虚拟网卡,可以让qemu通过这个网卡来访问主机。
当qemu执行的时候在主机ubuntu上
#ifconfig
可以看到除了eth0 还有一个网卡tap0
进入qemu的界面 配置qemu上linux内核 zImage.integrator 的网络地址
#ifconfig eth0 10.0.2.15 broadcast 10.0.2.255 netmask 255.255.255.0
测试和主机的网络连接
#ping 10.0.2.2
5, 在ubuntu上打开nfs服务,
在/etc/hosts.allow加上
nfsd:10.0.2.
portmap:10.0.2.
mountd:10.0.2.
lockd:10.0.2.
statd:10.0.2.
rquotad:10.0.2.
在/etc/exports加上
/srv/qemu/integrator/busybox_install 10.0.2.*(rw,no_root_squash,subtree_check,async)
4,在qemu上跑2.6.36内核和nfs根文件系统
#qemu-system-arm -kernel /srv/qemu/integrator/linux-2.6.36-nfs/arch/arm/boot/zImage -net nic -net tap,script=integrator-ifup -append root="/dev/nfs nfsroot=10.0.2.2:/srv/qemu/integrator/busybox_install rw ip=10.0.2.15:10.0.2.2:10.0.2.1:255.255.255.0"
/srv/qemu/integrator/linux-2.6.36-nfs/arch/arm/boot/zImage 是内核
/srv/qemu/integrator/busybox_install 是根文件系统
10.0.2.2 是主机ip地址
10.0.2.15 是从机ip地址