首頁 > 軟體

使用bochs和gdb聯合偵錯Linux核心

2020-06-16 17:27:49

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

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-11/137342.htm


IT145.com E-mail:sddin#qq.com