2021-05-12 14:32:11
使用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步。
- 執行
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這樣的神級組合就是為開發作業系統而生的,稱之為宇宙最強應該不會有什麼問題。
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
相關文章