以前有一段時間,因為某些原因,一直在使用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/bashqemu-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