Qemu调试Linux内核

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

当然还需要安装交叉编译环境。

1. 下载编译qemu-0.12.5.tar.gz解压编译

$ 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

2.下载编译Linux内核

$ 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左边的[*]

Qemu调试Linux内核_第1张图片

(2)在Kernel Features里边点上Use the ARM EABI to compile the kernel左边的[*]

Qemu调试Linux内核_第2张图片

(3)点上Kernel hacking里边的Compile the kernel with debug info左边的[*] 
(4)然后exit -> save之后就执行下面的语句进行内核的编译

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all

3.下载编译Busybox

$ 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)左边的 [*]号

Qemu调试Linux内核_第3张图片

Qemu调试Linux内核_第4张图片

Qemu调试Linux内核_第5张图片

然后执行下面的语句编译安装

$ 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/sh
mount -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 ../../

4. 运行Linux内核+busybox

$ ./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"

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




你可能感兴趣的:(linux)