歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

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

bochs這個軟件准確來說應該叫做“模擬器”,而不是虛擬機,因為VMware等虛擬機是將Guest系統所有的指令都放到真實硬件上執行,而bochs模擬器則是直接用軟件模擬硬件的執行,舉個例子,在bochs裡你可以自定義CPU指令並在匯編裡使用,這一條足以說明bochs是多麼強大,實在是操作系統開發者首選的利器。

bochs安裝

這篇文章http://www.linuxidc.com/Linux/2016-11/137343.htm講了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這樣的神級組合就是為開發操作系統而生的,稱之為宇宙最強應該不會有什麼問題。

CentOS 6.0 源碼 編譯 安裝 Bochs  http://www.linuxidc.com/Linux/2012-12/76952.htm

openSUSE 安裝Bochs 2.6  http://www.linuxidc.com/Linux/2012-11/75156.htm

Linux0.11 運行環境搭建以及調式--Bochs  http://www.linuxidc.com/Linux/2012-11/73902.htm

Ubuntu 12.04安裝帶調試功能的Bochs http://www.linuxidc.com/Linux/2012-10/73251.htm

Ubuntu安裝Bochs過程中遇到的問題及解決方法 http://www.linuxidc.com/Linux/2012-05/61422.htm

Ubuntu 14.04 LTS 安裝和配置Bochs  http://www.linuxidc.com/Linux/2016-10/135905.htm

Ubuntu上使用Bochs http://www.linuxidc.com/Linux/2016-10/135903.htm

Copyright © Linux教程網 All Rights Reserved