环境搭建
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函数处中断了。你就可以对这个函数各种调试了。。
不懂的可以给我留言。
调试linux内核环境搭建方法(ddd+busybox+qemu+linux3.5.4内核)