Qemu是很有名的ARM虚拟程序,可以在Qemu中运行调试ARM平台Linux内核。编译Qemu,Linux内核,busybox的环境是安装ubuntu 10.4系统的virtualbox。
在安装完ubuntu 10.4之后,最好先准备一下编译环境。
首先需要安装编译需要的库
$ sudo apt-get install build-essential autoconf libtool zlib1g-dev
当然还需要安装交叉编译环境。
$ wget http://download.savannah.gnu.org/releases/qemu/qemu-0.12.5.tar.gz$ tar xzf qemu-0.12.5.tar.gz$ cd qemu-0.12.5$ ./configure --enable-sdl --disable-kvm --enable-debug --target-list=arm-softmmu$ ./make
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-3.12.6.tar.bz2$ tar xjf linux-3.12.6.tar.bz2$ cd linux-3.12.6/$ make ARCH=arm versatile_defconfig$ make ARCH=arm menuconfig
在menuconfig这一步需要设置几个才能在qemu中运行以及进行后续的调试
(1) 去掉Enable loadable module support左边的[*]
(2)在Kernel Features里边点上Use the ARM EABI to compile the kernel左边的[*]
(3)点上Kernel hacking里边的Compile the kernel with debug info左边的[*]
(4)然后exit -> save之后就执行下面的语句进行内核的编译
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all
$ tar busybox-1.21.1.tar.bz2
$ cd busybox-1.21.1$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
在menuconfig之后,进入Busybox Settings -> Build Options之后,点上Build BusyBox as a static binary (no shared libs)左边的 [*]号
然后执行下面的语句编译安装
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- install
$ cd _install
$ mkdir -p proc sys dev etc etc/init.d
$ cd etc/init.d
$ vi rcS
之后把下面的shell语句写到rcS文件
#!/bin/shmount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
然后按照下面的语句生成Ram File System
$ cd ../../$ chmod +x etc/init.d/rcS$ find . | cpio -o --format=newc | gzip > ../../rootfs.img.gz$ cd ../../
$./qemu-0.12.5/arm-softmmu/qemu-system-arm -M versatilepb -m 128M -kernel linux-3.12.6/arch/arm/boot/zImage -initrd rootfs.img.gz -append "root=/dev/ram rdinit=/sbin/init"
5. 调试方法
(1) 按4.运行Linux内核+busybox的命令一样,只是后面加上"-s -S"。运行该命令之后就可以看到Qemu启动,但看不到 有任何画面,因为Qemu在等待调试没有运行内核。
$ ./qemu-0.12.5/arm-softmmu/qemu-system-arm-M versatilepb -m128M-kernel linux-3.12.6/arch/arm/boot/zImage-initrd rootfs.img.gz-append"root=/dev/ram rdinit=/sbin/init" -s -S
(2) 另外打开一个终端,如数如下命令就可以看到程序停在start_kernel函数中
$ arm-none-linux-gnueabi-gdb> target remote : 1234> cd linux-3.12.6> file vmlinux> b start_kernel> c