使用bochs和gdb聯合調試Linux內核

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步。

  1. 運行bochs命令會出現命令行菜單,選擇3. Edit options開始編輯配置,進入12. Disk & Boot options,把4. First HD/CD on channel 0設爲hd.img,這個過程需要輸入hd.img的一些參數例如柱面數、磁頭數、每磁道扇區數,其他的參數保持默認即可。

  2. 然後進入15. Boot Options,把1. Boot drive #1: floppy改爲disk。

  3. 內存可以不設置,也可以隨便設置下,進入7. Memory options->1. Standard Options->1. RAM size options後,將memory size設爲32,將host memory size設爲64。

  4. 開啓bochs的GDB stub功能,16. Other options->2. GDB Stub Options->1. Enable GDB stub: no,把no改成yes就行了,端口會自動設爲1234,Text baseData base以及BSS base都保持默認爲0即可。

  5. 返回到最開始的菜單,選擇4. Save options to...保存下配置,命名爲kdebug.bxrc

  6. 再選6. Begin simulation開始模擬。

  7. 如果跳過第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就打開了,在界面源碼框裏可以看到源碼。

  1. 在界面最下方的gdb命令行上輸入break start_kernel,在剛進入C語言函數處設個斷點。

  2. 然後繼續在gdb命令行上輸入target remote localhost:1234,這是讓gdb連接bochs以便進一步指導bochs如何運行。(溫馨提示:在gdb命令行窗口裏點右鍵沒有粘貼選項,因爲Paste選項在DDD主窗口的Edit菜單裏)

  3. 在gdb命令行輸入c,告訴bochs持續運行直到被斷點中斷。

  4. 在bochs那個黑框界面上應該能看到內核解壓的信息提示Uncompressing Linux... OK, booting the kernel,然後就到達斷點處了。

  5. 之後該怎麼調試就和調試一般的C語言程序一樣了。

  6. 藉助DDD的力量我們可以很方便的看到源碼,並且可以清晰的看到到底運行到哪一行了,想要查看數據結構也是極其地方便,還可以對數據進行圖形化顯示。

結語

總的來說,bochs+DDD這樣的神級組合就是爲開發操作系統而生的,稱之爲宇宙最強應該不會有什麼問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章