使用QEMU模拟搭建ARM开发平台

来源:互联网 发布:yum的配置 编辑:程序博客网 时间:2024/04/30 13:26

使用QEMU模拟搭建ARM开发平台(一):交叉编译Linux内核

tags: qemu

安装需要的包,我的主机环境是debian squeeze/x86_64,首先需要安装交叉编译工具链,安装qemu模拟器,下载linux内核。

安装交叉编译工具链

将下列源添加到/etc/apt/sources.list或在/etc/apt/sources.list.d/目录下新建一个文件debian-arm-toolchain.list。

## -- Emdebian cross toolchains## deb http://www.emdebian.org/debian/ unstable main# deb http://www.emdebian.org/debian/ testing maindeb http://www.emdebian.org/debian/ squeeze main

然后,执行

#apt-get update#apt-get install gcc-4.4-arm-linux-gnueabi

安装工具链的方法可以参考 http://wiki.debian.org/

安装qemu

#apt-get install qemu-system

下载linux内核

我下载的是linux-2.6.39.2.tar.bz2。存放在$HOME/目录下。

$cd $HOME$tar xjf linux-2.6.39.2.tar.bz2$make mrproper #保证原始干净环境$make ARCH=arm versatile_defconfig #使用versatile平台默认配置$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- all #编译

几分钟过后,arch/arm/boot/zImage即生成了,然后使用qemu模拟。之所以选择versatile平台,是因为qemu可以完全模拟。

$cp arch/arm/boot/zImage $HOME/versatile-zImage$qemu-system-arm -M versatilepb -kernel versatile-zImage -m 128M

由于没有提供根文件系统,所以kernel会崩溃,由于找不到合适的root挂载项。下面制作一个最小的initramfs,使其可以正常运行。

$mkdir $HOME/versatile-initramfs$cd $HOME/versatile-initramfs$cat > init.c <<EOF> #include <stdio.h>> #include <stdlib.h>> int main(void)> {> printf("hello arm\n");> while(1);> return 0;> }> EOF

然后,编译并且将其打包成initramfs。

$arm-linux-gnueabi-gcc -static -o init init.c$rm init.c$find . | cpio -o -H newc | gzip > ../versatile-initrd$qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-initrd -m 128M

使用QEMU模拟搭建ARM开发平台(二):加入busybox支持

tags: qemu

在上一篇文章中,搭建的arm平台只有一个最小化的initramfs,只是可以验证可以启动,但没有实用性,busybox是嵌入式环境中的杀手级应用,将busybox集成进initramfs变得非常实用。

首先要安装qemu, arm toolchain,还要下载busybox源码。我下载的是busybox-1.18.5.tar.bz2

$tar xjf busybox-1.18.5.tar.bz2$cd busy box-1.18.5$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig

选择将busybox编译成静态文件, "Busybox Settings --> Build Options"

$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install

编译安装完成后,会在当前目录下生成_install目录,此为默认的安装目录,也可以在Busybox Settings中设置为别的目录。现在制作initramfs。

$cd _install$find . | cpio -o -H newc | gzip $HOME/versatile-busybox

现在用qemu模拟。

$cd $HOME$qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-busybox -m 128M -append "root=/dev/ram rdinit=/bin/sh"

这里如果不加rdinit=/bin/sh,那么/linuxrc将会试图挂载根文件系统,并且运行新根文件系统中的init,由于我们没有另外的真正的根文件系统,所以使用rdinit=/bin/sh,启动到sh中,敲入回车,将会出现shell命令提示符。在当前root中,没有/proc,/sys存在,所以例如mount等这些以来/proc, /sys的命令不能正常工作。在虚拟机中执行

#mkdir /proc /sys#mount -t proc proc /proc#mount -t sysfs sysfs /sys

也可以将其加入到启动脚本中,关闭虚拟机,然后修改versatile-busybox

$cd busybox-1.18.5/_install$mkdir -p etc/init.d$cd etc/init.d$cat > rcS <<EOF#!/bin/sh>mkdir /proc /sys>mount -t proc proc /proc>mount -t sysfs sysfs /sys>mdev -sEOF$chmod +x rcS$cd busybox-1.18.5/_install$find . | cpio -o -H newc | gzip > $HOME/versatile-busybox

现在用qemu模拟

$ qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-busybox -m 128M -append "root=/dev/ram rdinit=/sbin/init"

注意这里的rdinit=/sbin/init,前面之所以是rdinit=/bin/sh,是因为/sbin/init会执行/etc/init.d/rcS,而前面并没有创建这个文件,所以会打印很多错误!特别是由于没有启动mdev。


0 0