使用Gdb+qemu调试内核:

我们调试内核需要一个叫qemu的虚拟机,qemu虚拟的一个好处便是可以让cpu处于冻结状态,从而让操作系统处于暂停状态,这样我们才能很方便的调试内核。 首先使用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程序之上:










Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐