使用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程式之上: