首页 > 代码库 > 调试linux内核环境搭建方法(ddd+busybox+qemu+linux3.5.4内核)

调试linux内核环境搭建方法(ddd+busybox+qemu+linux3.5.4内核)

环境搭建


1.1.准备工作

(1).qemu虚拟机

(2).busybox软件

(3).linux-3.5.4内核

(4).ddd 调试工具(终端中输入 sudo apt-get install ddd 安装)

1.2.编译内核

(1)建立工作目录:mkdir -p ~/work/qemu

(2)切换到此目录:cd ~/work/qemu

(3)下载 linux内 核

(4)解压内核:tar -jxvf linux-3.5.4.tar.bz2

(5)切换到linux-3.5.4目录: cd linux-3.5.4

(6)配置编译选项:makemenuconfig

说明:可能会缺依赖包 ncurses-dev 输入:sudo  apt-get install ncurses-dev有的版本 linux 源里可能是:sudo apt-get install libncurses5-dev

编译选项选中:

kernelhacking–>kerneldebugging–> compile the kernel with debug info

kernelhacking–> compilethe kernel with frame pointers

(7) 编译:make(注意:编译完之后不要安装内核,编译的时候如果有错误,请查看是否少安装了一些编译工具)

(8)将文件bzImage 拷到上级目录:cp arch/x86/boot/bzImage  ../

1.3.安装qemu虚拟机

(1)下载 qemu 安装文件

(2) 在安装 qemu前先要安装库文件。打开终端输入 sudo apt-get install gcc  libsdl1.2-dev zlib1g-dev libasound2-devpkg-config libgnutls-dev pciutils-dev

(3)切换到 qemu的源码目录输入./configure 生成 makefile

(4) 输入 make 开始编译(如果缺 automake 包,输入 sudo apt-get install autoconf automake libtool 安装)

(5)输入 sudo make install 开始安装

1.4.制作根文件系统

(1)切换目录: cd ~/work/qemu

(2)创建大小为10M 到根文件系统: dd if=/dev/zero of=rootfs.img bs=1M count=10

(3)以 ext3 类型来格式化根文件:mkfs.ext3 rootfs.img

(4)创建rootfs 目录:mkdir rootfs 

(5) 将rootfs.img 挂载到 rootfs 目录上: sudo mount -t ext3 -o loop rootfs.img rootfs

(6)切换到rootfs 目录: cd rootfs 

(7)创建三个目录:mkdir dev proc sys 

1.5.安装 busybox 到根文件系统

(1)下载busybox

(2)解压、切换到busybox 的源码目录,配置 busybox 编译选项:make menuconfig

a.选择静态编译:BusyboxSettings->Build options->BuildBusybox as a static binary

b.取消Networkingutilities->iptunel

c.取消Networkingutilities->inetd

(2)编译: make

(3) 把busybox 文 件 系 统 安 装 到 刚 创 建 的 根 文 件 系 统 中 : make  install CONFIG_PREFIX=~/work/qemu/rootfs

(4)切换到 qemu目录:cd  ~/work/qemu

(5)卸载根文件系统:sudo umount rootfs

1.6.验证流程

 (1) 在~/work目录下编写c验证程序 test_fork.c

#include<unistd.h>

#include<sys/types.h>

int main()

{

pid_t pid;

pid=fork();

}

(2)编译c程序

gcc -c -g -statictest_fork.c

gcc -o test_fork -static test_fork.o

因为busybox是编译成了静态的,要想c程序能够在qemu虚拟机中运行,也必须编译成静态的。这样test_frok命令才能在虚拟机中运行

(3) 输入 sudo mount -t ext3 -o loop rootfs.img rootfs 命令挂载 qemu 虚拟机的根文件系统。

(4)输入 cp fork rootfs/bin 命令将 fork 考到根文件系统的 bin/文件夹下

(5)卸载根文件系统:sudo umount rootfs

(6)启动 qemu

a.打开终端输入,输入命令切换到~/work/qemu 目录:cd  ~/work/qemu

b.输入qemu-system-i386 -S -kernel bzImage -hda rootfs.img -append "root=/dev/sdainit=/bin/ash rw" -monitor stdio启动 qemu(64位计算机请将i386换成x86)

注:rw代表开启的虚拟机是可以读写的。

-monitor stdio表示将qemu中的控制台转移到终端内,就不用ctrl+alt+2进行切换

c.在控制台中输入“gdbserver tcp::1234

d.打开另外一个终端,输入命令cd  ~/work/qemu/linux-3.5.4切换到~/misc/qemu/linux-3.5.4 目录

e.运行dddvmlinux(未安装ddd的输入sudo apt-get installddd 安装)

f.在ddd的命令窗口中输入命令target remote localhost:1234将qemu虚拟机连接到ddd的控制台

g.在ddd的命令窗口输入 b do_fork在do_fork函数上加上断点

h.在ddd的命令窗口中输入让虚拟机继续执行

(7) 在qemu虚拟机终端中输入test_fork命令,这样内核就会在do_fork函数处中断了。你就可以对这个函数各种调试了。。

不懂的可以给我留言。