使用Gdb+qemu调试内核:
安装qemu:
在ubuntu10.10下用# sudo apt-get install qemu下载最新的qemu版本
从已经装好的操作系统ubuntu9.10_32.img的硬盘启动,测试qemu是否可以运行:
# qemu –hadubuntu9.10_32.img
基本安装结束后,开始进入调试阶段:
从http://www.kernel.org/pub/linux/kernel/v2.6/
下载linux2.6内核,本实验使用编译的内核为linux2.6.30
# cd/Downloads
#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.bz2
# tar –jxvf linux2.6.30.tar.bz2
# cdlinux-2.6.30
下面我们需要编译自己的内核,产生image文件bzImage和内核ELF文件vmlinux,具体的编译过程参考技术博客:http://www.cyberciti.biz/tips/compiling-linux-kernel-26.html
# make menuconfig
# make
编译后会在./arch/x86/boot/ 下生成bzImage文件:
注:编译时间很长,由于我没有对内核进行裁剪,以后编译时可以参考:
http://lamp.linux.gov.cn/Linux/kernel_options.html来对配置文件进行裁剪,对不需要的模块要进行裁剪,可以采用先剪裁几个模块后进行编译,没有错误后再进行裁剪编译,最大程度上上保持内核配置的正确性,在这方面必须要加强,不能拿来个内核全都编译,这样时间和空间都是种浪费。
运行qemu,启动调试模式:
# qemu –S–kernel arch/x86/boot/bzImage –had ubuntu9.10_32.img –append “root=dev/had”
在命令中使用S参数,是freeze CPU ata startup。
系统跳出一个黑显示界面,无任何内容,此时通过ctrl+alt+1与ctrl+alt+2可以切换,ctrl+alt+2是qemu控制台,ctrl+alt+1是屏幕输出。
现在我切换到qemu控制台(ctrl+alt+2)
(qemu)gdbserver 1234
此时需要另打开一个终端,进入linux2.6.30源码目录下:
# gdbvmlinux
(gdb)target remote localhost:1234
这时就可以正常使用gdb编译内核了
设置断点break start_kernel,停在linux内核的第一个c程序之上: