今天看了《Embedded Programming with the GNU Toolchain》一文,其中介绍了利用QEMU进行ARM编程实验的一种方法。基本思想是,在一个X86的Linux开发机中安装一种称为codesourcery-tools的GNU工具链,该工具链中包含了交叉编译器,利用该工具链在宿主机中编译出ARM的可执行文件,然后利用QEMU仿真一个PXA255(connex)目标机,并将可执行文件加载到目标机中运行。
这种方法简便易行,但由于在开发机中缺少操作系统,因此在汇编语言程序中无法引发系统调用。此外,每次交叉编译完成后还要启动QEMU加载可执行文件,这也比较麻烦。因此想搭建一个运行在ARM上完整的Linux系统,能够在其中方便地进行汇编编程。在网上发现了一篇文章《Emulate an ARM Plaform with QEMU on Ubuntu 10.10》,其中采用的方法能够满足我的需要,因此进行了相应的实验(下面的操作都采用root用户身份)。
这种方法的基本思路是在一个Linux宿主机中利用QEMU运行一个虚拟机,并在虚拟机中安装一个完整的基于ARM平台的Linux环境,然后在虚拟机中安装必要的开发工具。这样,就可以在虚拟机中直接进行编程。具体的配置过程如下:
-
宿主机是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的编程了。
参考文献:
如何挂载一个镜像文件
阅读(8364) | 评论(1) | 转发(2) |