一、编译Linux
1. 下载内核代码(linux-3.5.7.tar.bz2),缺省工作目录是/usr/src/work
sudo mkdir -p
/usr
/src
/work
sudo chmod 777
/usr
/src
/work
-R
cd /usr
/src
/work
tar -jxvf
linux-3.5.7.tar.bz2
2. 配置内核选项
cd linux-3.5.7
make defconfig
make menuconfig
需确保如下选项被选中(使能kgdb调试,并使用kgdboc作为与gdb通信模块)
General setup ---> [ * ] Prompt for development and/or incomplete code/drivers
Kernel hacking ---> [ * ] Compile the kernel with debug info
[ * ] Compile the kernel with frame pointers
[ * ] KGDB: kernel debugger --->
< * > KGDB: use kgdb over the serial console
3.编译内核
make
如果你的机器是多核的,可以使用-j+CPU数来进行并行编译,从而加快编译速度,如:
make -j2
编译完成后,复制bzImage和vmlinux到工作目录下备用
cp arch/x86/boot/bzImage /usr/src/work
cp vmlinux /usr/src/work
二、制作自己的文件系统
1. 去busybox站点下载一个busybox源码包,并解压。
cd /usr/src/work
tar -jxvf busybox-1.17.0.tar.bz2
cd busybox-1.17.0
2. 编译busybox
make menuconfig
Busybox Settings
---> Build Options
---> [ * ] Build
BusyBox as a static binary (no shared libs) Installation
Options
---> [ * ] Don't use /usr Miscellaneous Utilities
---> [ ] flashcp
[ ] flash_lock
[ ] flash_unlock
[ ] flash_eraseall 注:[ ] 表示不选择
3. 保存配置文件后开始编译和安装
此时在当前目录下生成了一个_install目录,里面就是busybox的执行文件
4. 制作文件系统
使用如下命令来创建一个虚拟文件系统磁盘文件,
在当前目录下创建一个名为busybox.img,大小为100M的文件,并将其格式化为ext3的文件系统
cd
/usr/src/work dd if=/dev/zero of=./busybox.img bs=1M count=100 mkfs.ext3
busybox.img
将这个虚拟磁盘文件到本地系统中,这样我们可以像访问本地文件一样访问它,
并将生成好的busybox的文件拷贝到这个文件里。
创建必须的文件系统目录
cd /mnt/disk/
sudo mkdir dev sys proc etc lib mnt
使用busybox默认的设置文件
sudo cp -a /usr/src/work/busybox-1.17.0/examples/bootfloppy/etc/*
/mnt/disk/etc
sudo vi /mnt/disk/etc/init.d/rcS
将下面内容拷贝到rcS里:
#! /bin/sh /bin/mount -a /bin/mount -t sysfs sysfs /sys
/bin/mount -t tmpfs tmpfs /dev
#动态添加虚拟机环境中的设备 /
sbin/mdev -s
做完上面的工作后,我们就可以卸载虚拟磁盘文件了
cd
/usr/src/work
sudo umount /mnt/disk
三、安装qemu
sudo apt-get install qemu
四、使用qemu运行自己编译的内核
qemu
-kernel /usr/src/work/bzImage -append "root=/dev/hda" -boot c -hda
/usr/src/work/busybox.img -k en-us
note: 如果你的硬盘是sata接口的,你也许需要将上面的 "root=/dev/hda" 替换为 "root=/dev/sda"
如果顺利的话,自己编译的内核+文件系统就会在那qemu黑乎乎的窗口里展现出来
五、gdb + kgdb 调试内核
使能kgdb可以在内核启动时增加使能参数,也可以在内核启动后echo kgdboc模块的参数来达到目的,这里我们采取在内核启动时增加启动参数(kgdboc=ttyS0,115200 kgdbwait)的方式:
qemu
-kernel /usr/src/work/bzImage -append "root=/dev/hda kgdboc=ttyS0,115200
kgdbwait" -boot c -hda /usr/src/work/busybox.img -k en-us -serial
tcp::4321,server
这时,运行qemu的终端将提示等待远程连接到本地端口4321:
QEMU waiting for connection on: tcp:0.0.0.0:4321,server
这时使用另外一个控制台执行:
gdb
/usr/src/work/vmlinux
(gdb) target remote localhost:4321
然后qemu就可以继续正常运行下去,最后停止内核,并显示如下信息:
kgdb: Waiting for connection from remote gdb…
这时gdb这边就可以看到如下的提示:
(gdb) target remote localhost:4321
Remote
debugging using localhost:4321 kgdb_breakpoint () at kernel/debug/debug_core.c:983 983 wmb(); /* Sync point after breakpoint */ (gdb)
开始你的内核之旅吧~~~
如果gdb提示如下信息:
warning: Invalid remote reply:
可以使用Ctrl+C来终止当前gdb的操作,再次使用下面命令重新连接一次kgdb即可:
(gdb) target remote localhost:4321
具体调试方法与gdb下没有很大区别,也可以安装ddd图形界面进行调试,这样更直观一些
阅读(1940) | 评论(0) | 转发(1) |