用Qemu來調(diào)試FreeBSD內(nèi)核
1. 使用qemu來調(diào)試FreeBSD系統(tǒng)內(nèi)核
為了方便給qemu虛擬機來拷貝編譯完后的內(nèi)核文件,可以使用bochs的bximage來創(chuàng)建一個鏡像文件,但要注意的是bximage創(chuàng)建的Flat模式的鏡像文件只能有2G的大小。使用Flat模式的鏡像文件有一個好處,可以直接通過mdconfig和mount命令來把對應的虛擬機鏡像文件掛載到指定的目錄下,然后進到虛擬機的boot目錄替換內(nèi)核。Qemu和bochs建議從Port中安裝,可以選擇安裝kqemu來加速,有需要其他配置的同學請運行make config來進行相應的配置,不過一般Port中都是已經(jīng)給出了一個比較合理選項。
1.1. 準備工作
安裝完qemu和bochs并利用bximage來創(chuàng)建虛擬機鏡像文件后,使用qemu的下面這些選項來運行虛擬機,給創(chuàng)建的虛擬機安裝操作系統(tǒng)。
-hda 指定虛擬機鏡像文件
-cdrom 指定要使用的光驅(qū)或者ISO文件
-enable-kqemu 使用kqemu
-kernel-kqemu 使用kqemu來進行虛擬加速
-localtime 虛擬機中的時間和本地時間相同
-boot once=d 只在第一次引導的時候使用CDROM
-s 等待gdb連接進來,-s會開放1234這個端口,方便gdb使用remote target的方式來進行遠程調(diào)試
-m 指定虛擬機需要的內(nèi)存
-cpu 指定虛擬機要使用的CPU種類,-cpu ?只有在配置完所有的-hda之類的參數(shù)之后才會打印出qemu支持的CPU類型,否則的話只會報錯。
-M 指定虛擬機要使用的PC類型,-M ?的處理和-cpu ?一樣。
-k 使用的語言,這個選項也要影響到鍵盤的設置。一般建議選擇en-us。不選定該選項可能會導致qemu在運行時按鍵不匹配,我在通過XShell遠程FreeBSD8.1時,如果不指定該項,則Enter鍵之類的無法生效。
我使用的qemu的參數(shù)為:
qemu -k en-us -cpu coreduo -boot once=d -m 256M -localtime -kenerl-kqemu -enable-kqemu -hda hd.img -cdrom ../ISO/FreeBSD-8.1-RELEASE-i386-disc1.iso |
如果運行時報沒有加載kqemu,則手動加載一下:
sudo kldload kqemu |
1.2. 掛載虛擬機文件
用bochs創(chuàng)建hd.img并用qemu來裝完操作系統(tǒng)之后,在FreeBSD中可以使用mdconfig和mount來掛載相應的文件。首先我們先用mdconfig來創(chuàng)建一個md設備:
上面這條命令會創(chuàng)建vnode類型的md設備,命令會返回創(chuàng)建后的設備名(如md0之類)。直接用ls /dev/md0*來查找,可以看到以FreeBSD的Slice來進行區(qū)分的文件:
sudo mdconfig -a -t vnode -f hd.img |
根據(jù)我在安裝FreeBSD操作系統(tǒng)時進行掛載點劃分,一共有md0s1[a-f]個設備文件,我把md0s1f劃分為/usr掛載點,下面用mount命令來掛載md0s1f:
> ls /dev/md0* /dev/md0 /dev/md0s1 /dev/md0s1a /dev/md0s1b /dev/md0s1d /dev/md0s1e /dev/md0s1f |
用ls命令可以查看到usr/下面的內(nèi)容:
sudo mount /dev/md0s1f usr/ |
在進行內(nèi)核調(diào)試的時候,我們最需要的是掛載/boot目錄下的數(shù)據(jù),方便我們拷貝編譯后的內(nèi)核文件,因此上面的命令只作為參考,根據(jù)大家自己不同的掛載點劃分來mount相應的設備。
1.3. 編譯內(nèi)核文件
進入/usr/src/sys/i386/conf,拷貝并重命名GENERIC內(nèi)核配置文件為DebugOS,在里面加入
makeoptions DEBUG=-g options DDB options GDB options KDB |
make buildkernel KERNCONF=DebugOS
進行編譯即可。編譯后的內(nèi)核文件會在/usr/obj目錄中。拷貝相應的內(nèi)核文件到虛擬機中的boot目錄。Unmount掉相應的虛擬機掛載目錄后,準備進行內(nèi)核調(diào)試。
1.4. 開始調(diào)試
在qemu的參數(shù)中增加-s選項,該選項會讓qemu開啟1234的tcp端口,并等待gdb連接上來。運行qemu后,可以再運行gdb,通過target remote 127.0.0.1:1234命令來連接qemu虛擬機,然后就可以以源代碼級的方式來跟蹤內(nèi)核了。需要跟蹤系統(tǒng)調(diào)用的同學,可以直接在虛擬機上寫個程序,然后用GDB來跟蹤系統(tǒng)調(diào)用的處理。
posted on 2011-01-30 14:30 Young 閱讀(4852) 評論(0) 編輯 收藏 引用 所屬分類: FreeBSD

