宿主机是X86,其中安装了Ubuntu 12.04。首先在宿主机中安装QEMU。
apt-get install qemu-kvm qemu-kvm-extras
Debian提供了ARM平台的内核镜像文件和initrd文件,利用这两个文件启动QEMU后可以开始一个安装过程,在QEMU的虚拟硬盘中安装一个基于ARM平台的基本操作环境。
mkdir arm-emul; cd arm-emul
wget ftp://ftp.debian.org/debian/dists/squeeze/main/installer-armel/current/images/versatile/netboot/vmlinuz-2.6.32-5-versatile
wget ftp://ftp.debian.org/debian/dists/squeeze/main/installer-armel/current/images/versatile/netboot/initrd.gz
创建虚拟硬盘。
qemu-img create -f raw hda.img 2G
启动QEMU创建一个versatilepb虚拟机,并开始安装过程。该安装过程需要从Debian服务器下载安装文件,因此在启动QEMU之前应保证宿主机已经连接Internet。
qemu-system-arm -m 256 -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.gz -hda hda.img -append "root=/dev/ram"
整个安装过程与通常Debian或Ubuntu的安装过程类似,只是在最后阶段选择软件包的时候可以将SSH服务器选上,这样今后可以通过SSH远程登录虚拟机。由于虚拟机是文本界面,其窗口较小,在宿主机中远程登录虚拟机后就可以在较大的终端窗口中进行编程。
qemu-system-arm -m 256 -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.gz -hda hda.img -append "root=/dev/ram"
安装完成后,需要将虚拟机硬盘中的initrd文件拷贝到宿主机中。为此,应将虚拟机关闭,然后将虚拟硬盘中用于存储根文件系统的分区挂载到指定的目录,最后将文件复制出来。在挂载之前应先计算出硬盘分区的偏移量。具体的计算方法见《如何挂载一个镜像文件》一文。
mount -o loop,offset=1048576 hda.img /mnt
cp /mnt/boot/initrd.img-2.6.32-5-versatile .
umount /mnt
编写一个启动脚本,用于在宿主机中启用TAP,然后启动虚拟机。虚拟机与宿主机在同一个网段中,并假设该网段中有DHCP服务器。如不存在DHCP服务,则需要相应地修改脚本。
#! /bin/sh
ifconfig eth0 down
brctl addbr br0
brctl addif br0 eth0
ifconfig br0 0.0.0.0 promisc up
ifconfig eth0 0.0.0.0 promisc up
dhclient br0
tunctl -t tap0 -u root
brctl addif br0 tap0
ifconfig tap0 0.0.0.0 promisc up
qemu-system-arm -m 256 -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile -hda hda.img -append "root=/dev/sda1" -net nic -net tap,ifname=tap0,script=no,downscript=no
重新启动虚拟机后,安装编程所需要的工具。
apt-get install build-essential # 工具链
apt-get install jed # 编辑器
在宿主机中开一个终端窗口,执行ssh命令远程登录虚拟机。现在就可以开始ARM的编程了。