debugging the linux kernel under ubuntu 11.04

以前有一段时间,因为某些原因,一直在使用windows xp,在上面用vmware装了一个CentOS5.5,后来升级到5.6,就一直在上面做一些内核的开发,在上面编译内核,在上面debug 内核。这样做有一个麻烦的事情,就是有时候时间比较紧的话,就会不方便,比如说早上起来时间不多,7点起来,8点要去上班,一个小时的时候,起来看看别人回的邮件,要改一个patch,然后resend,因为去公司就不能上网了,就算在公共上网区的话,发patch也不好,用web gmail又会破坏补丁的格式,也不合适,所以就只能在早上这个时间及时地改完patch然后发上去,这样就得先开系统,然后看邮件,然后开虚拟机,然后改patch,再提交上去,时间经常是不够用,总是觉得很麻烦。从4月ubuntu 11.04出来后,换上了,然后就是前面的麻烦都省去了,相当不错,改代码也快了,编译起来也快不少。很给力。

看代码,改代码,用vim就相当好了,加上cscope,只要make O=../latest V=1 cscope生成.out的cscope tag文件,看代码的时候加进去就OK,挺不错的。

debug的时候,可以用qemu,这样很方便,在host上修改,编译,然后在qemu上test。非常方便。

可以编译一个qemu,也可以直接在ubuntu直接安装。

apt-get install qemu qemu-pxe

然后可以去qemu官网上下一个disk img,也可以自己做一个disk img,然后自己安装一个,但是这样比较麻烦,对于debug kernel来说我觉得也不需要多少,用这个就可以了。

下一个linux-0.2.img.bz2,解压出来。linux-0.2.img

为了方便,写一个shell:

$cat qemu.sh 

#!/bin/bash

qemu-system-x86_64 -s -S -hda ./linux-0.2.img -append "root=/dev/sda1 console=ttyS0 console=tty0" -serial file:./kernel.log -kernel $1 -initrd $2  

可以不加-S选项,直接运行,加上-S后,可以在另一个终端下用gdb连接。

./qemu.sh vmlinuz-2.6.39+ initrd-2.6.39+

gdb
/path/to/vmlinuz

(gdb)$target remote localhost:
1234

(gdb)$

嗯。这样就可以了。

前面vmlinuz-x.y.z,initrd-x.y.z,就是编译出来的kernel和initramfs。

make O=../latest V=1 -j4

make O
=../latest V=1 modules_install

cp ..
/latest/arch/x86/boot/bzImage ../kernel_test/vmlinuz-2.6.39+

mkinitramfs
-k -o initrd.img-2.6.39+ -v 2.6.39+

嗯,就是这样。

ref:

http://wiki.qemu.org/Manual

http://people.debian.org/~aurel32/qemu/armel/

http://www.cs.swarthmore.edu/~newhall/unixhelp/qemu_guide.html

posted @ 2011-05-22 22:13  冷月X  阅读(928)  评论(0编辑  收藏  举报