Chinaunix首页 | 论坛 | 博客
  • 博客访问: 243041
  • 博文数量: 21
  • 博客积分: 796
  • 博客等级: 军士长
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-16 01:03
文章分类
文章存档

2020年(1)

2017年(1)

2016年(1)

2015年(2)

2012年(9)

2011年(7)

我的朋友

分类: LINUX

2012-12-22 16:30:52

今天看了《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环境,然后在虚拟机中安装必要的开发工具。这样,就可以在虚拟机中直接进行编程。具体的配置过程如下:
  1. 宿主机是X86,其中安装了Ubuntu 12.04。首先在宿主机中安装QEMU。
    apt-get install qemu-kvm qemu-kvm-extras
  2. 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
  3. 创建虚拟硬盘。
    qemu-img create -f raw hda.img 2G
  4. 启动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"
  5. 安装完成后,需要将虚拟机硬盘中的initrd文件拷贝到宿主机中。为此,应将虚拟机关闭,然后将虚拟硬盘中用于存储根文件系统的分区挂载到指定的目录,最后将文件复制出来。在挂载之前应先计算出硬盘分区的偏移量。具体的计算方法见《如何挂载一个镜像文件》一文。
    mount -o loop,offset=1048576 hda.img /mnt
    cp /mnt/boot/initrd.img-2.6.32-5-versatile .
    umount /mnt
  6. 编写一个启动脚本,用于在宿主机中启用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
  7. 重新启动虚拟机后,安装编程所需要的工具。
    apt-get install build-essential   # 工具链
    apt-get install jed               # 编辑器
  8. 在宿主机中开一个终端窗口,执行ssh命令远程登录虚拟机。现在就可以开始ARM的编程了。


参考文献:




如何挂载一个镜像文件



阅读(8364) | 评论(1) | 转发(2) |
0

上一篇:编译Fedora 4内核

下一篇:从Ruby调用C函数库

给主人留下些什么吧!~~

xparmenides2014-01-23 19:31:49

是的,qemu提供了一个NAT服务器和一个DHCP服务器,这种做法和vmware的做法应该类似的。DHCP服务器负责为虚拟机分配IP地址,NAT服务器负责端口映射实现虚拟机对外部网络的访问。