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://people.debian.org/~aurel32/qemu/armel/
http://www.cs.swarthmore.edu/~newhall/unixhelp/qemu_guide.html