bochs這個軟件準確來說應該叫做“模擬器”,而不是虛擬機,因爲VMware等虛擬機是將Guest系統所有的指令都放到真實硬件上執行,而bochs模擬器則是直接用軟件模擬硬件的執行,舉個例子,在bochs裏你可以自定義CPU指令並在彙編裏使用,這一條足以說明bochs是多麼強大,實在是操作系統開發者首選的利器。
bochs安裝
上一篇博文講了DDD的安裝,這一篇博文先將講bochs的安裝,之後再說聯合調試。下載bochs解壓後進入目錄。
./configure --enable-gdb-stub make make install
搞定,系統裏面又多了一個命令bochs
bochs配置
這裏依然使用之前的博文製作出來的hd.img可啓動內核鏡像,這裏麪包含2.4.0內核。爲了清楚起見我把bochs配置過程在這裏再寫一遍,這個過程與之前單純的運行內核時有所不同,之前我們只想運行內核,現在我們要調試內核,所以多了第4步。
運行
bochs
命令會出現命令行菜單,選擇3. Edit options
開始編輯配置,進入12. Disk & Boot options
,把4. First HD/CD on channel 0
設爲hd.img,這個過程需要輸入hd.img的一些參數例如柱面數、磁頭數、每磁道扇區數,其他的參數保持默認即可。然後進入
15. Boot Options
,把1. Boot drive #1: floppy
改爲disk。內存可以不設置,也可以隨便設置下,進入
7. Memory options
->1. Standard Options
->1. RAM size options
後,將memory size
設爲32,將host memory size
設爲64。開啓bochs的GDB stub功能,
16. Other options
->2. GDB Stub Options
->1. Enable GDB stub: no
,把no
改成yes
就行了,端口會自動設爲1234,Text base
、Data base
以及BSS base
都保持默認爲0
即可。返回到最開始的菜單,選擇
4. Save options to...
保存下配置,命名爲kdebug.bxrc再選
6. Begin simulation
開始模擬。如果跳過第4步,也就是說不開啓stub功能,那麼Begin simulation後內核會直接啓動,直到它因爲找不到根文件系統的文件而panic。有了第4步,在Begin simulation後只會彈出一個黑框,什麼都不顯示,因爲此時bochs正在等待gdb連接,bochs需要gdb給它指示,告訴它下一步該怎麼執行。
獲取帶有調試信息的內核文件vmlinux
在內核源碼的頂層Makefile裏將 CFLAGS_KERNEL =
改爲 CFLAGS_KERNEL = -g
給內核加入調試信息。編譯後在頂層目錄裏的vmlinux
就是帶調試信息的未壓縮內核鏡像。這個鏡像僅供調試使用。
這個vmlinux文件必須放在源碼頂層目錄裏,不能挪動位置,不然調試時無法顯示對應的源碼信息。這裏的源碼目錄可以是編譯完內核過後的源碼目錄,也可以是完全乾淨的源碼目錄。舉個例子,我的實驗平臺是CentOS 6.4和RedHat Linux 7.3構成的,CentOS專門修改和調試內核,RedHat僅負責編譯內核,我可以在RedHat上把附帶調試信息的內核編譯出來,然後將vmlinux
文件複製到CentOS上,放到剛解壓出來完全乾淨的源碼頂層目錄裏,這樣是完全沒有問題的。我之所以不選擇將編譯完內核後的整個目錄直接複製到CentOS上是因爲這麼做實在是太慢了,130M的大小,那麼多文件,壓縮和複製都挺麻煩的。解壓一份新源碼,將vmlinux
放進去,這多快,多方便。
祭出你的宇宙最強調試器——DDD!
最激動人心的時刻來了,命令行切換到源碼目錄裏,再輸入ddd vmlinux
,DDD就打開了,在界面源碼框裏可以看到源碼。
在界面最下方的gdb命令行上輸入
break start_kernel
,在剛進入C語言函數處設個斷點。然後繼續在gdb命令行上輸入
target remote localhost:1234
,這是讓gdb連接bochs以便進一步指導bochs如何運行。(溫馨提示:在gdb命令行窗口裏點右鍵沒有粘貼選項,因爲Paste
選項在DDD主窗口的Edit
菜單裏)在gdb命令行輸入
c
,告訴bochs持續運行直到被斷點中斷。在bochs那個黑框界面上應該能看到內核解壓的信息提示
Uncompressing Linux... OK, booting the kernel
,然後就到達斷點處了。之後該怎麼調試就和調試一般的C語言程序一樣了。
藉助DDD的力量我們可以很方便的看到源碼,並且可以清晰的看到到底運行到哪一行了,想要查看數據結構也是極其地方便,還可以對數據進行圖形化顯示。
結語
總的來說,bochs+DDD這樣的神級組合就是爲開發操作系統而生的,稱之爲宇宙最強應該不會有什麼問題。