[操作系統原理與實現]Bochs與GDB


Bochs是一個x86硬件平臺的開源模擬器。它可以模擬各種硬件的配置。Bochs模擬的是整個PC平臺,包括I/O設備、內存和BIOS。更爲有趣的是,甚至可以不使用PC硬件來運行Bochs。事實上,它可以在任何編譯運行Bochs的平臺上模擬x86硬件。通過改變配置,可以指定使用的CPU(386、486或者586),以及內存大小等。

GDB是一個強大的命令行調試工具。大家知道命令行的強大就是在於,其可以形成執行序列,形成腳本。UNⅨ下的軟件全是命令行的,這給程序開發提代供了極大的便利,命令行軟件的優勢在於,它們可以非常容易的集成在一起,使用幾個簡單的已有工具的命令,就可以做出一個非常強大的功能。

我們可以使用Bochs模擬x86平臺來運行操作系統內核,但同時Bochs可以使用GDB的遠程調試功能,與其無縫銜接。這樣,我們就可以使用GDB在C語言源代碼層面對操作系統內核進行調試。

一、Bochs

1.1、下載Bochs

因爲Bochs的更新非常頻繁,在短短几天內就會更新一個版本,這也說明Bochs是一個很成熟的模擬器,自由社區對Bochs的支持力度也很大。所以,我們可能需要經常下載Bochs的源代碼,通過編譯安裝來解決當前版本中存在的問題。因爲Bochs項目組提供其源代碼時在URL中存在了版本信息,故本文在此只能提供其下載頁面:
Bochs下載頁面
在這個下載頁面中,我們可以找到下載連接,如下圖所示:
在這裏插入圖片描述

1.2、編譯Bochs

Bochs有三種模式:

  • 模擬器。其功能與VMware、VirtualBox這些重量級模擬器重疊,並且後兩者功能更爲強大。通常我們不採用這種模式。
  • 使用自帶的反彙編器進行CPU指令級調試。在這種模式下,不論操作系統內核是否存在調試信息,我們都可以對其進行逆向分析來了解內核的運行機制,但這對我們的能力要求非常高。
  • 提供模擬器功能,並開放端口以供GDB遠程調試。

雖然操作內核的大量使用C語言實現,但是在個別情況下,我們需要在CPU指令級對內核進行調試,故我們需要同時編譯第二種和第三種模式。爲了編譯方便,我們編寫了如下的shell腳本程序:

#!/bin/bash

echo "安裝 bochs 和 bochsdbg ..."
./configure --enable-debugger --enable-readline
make -j8
sudo make install
sudo mv `which bochs` `which bochs`dbg
./configure --enable-gdb-stub
make -j8
sudo make install
  • 使用--enable-debugger參數,Bochs使用內置的反彙編器進行調試;
  • 使用--enable-gdb-stub參數,Bochs開放端口供GDB遠程調試;
  • 使用--enable-readline參數,可以讓我們在使用Bochs內置調試器時使用readline庫提供的自動補全和歷史命令功能。
  • 將使用--enable-debugger參數編譯得到的bochs程序文件名更名爲bochsdbg,是爲了與使用--enable-gdb-stub參數得到程序文件相區別。這樣,通常情況下我們使用bochs,指令級調試時我們使用bochsdbg。也可以將文件更改爲其他的文件名,但使用Bochs項目自帶卸載功能時會將bochsdbg文件一併刪除,即便該文件不存在。

當我們將這個腳本程序放置在解壓後的項目源代碼頂級目錄下併成功執行後,系統就會安裝好我們需要的Bochs了。

1.3、配置Bochs

通常情況下,Bochs會自動讀取當前目錄下的已編輯好的bochsrc配置文件,我們也可以通過命令行參數要求Bochs讀取指定的配置文件:

bochs -f <Bochs配置文件>

對於Bochs配置文件,我們可以手動進行編輯,而網上大量傳播了此類教程。但在此,強烈建議大家通過Bochs程序自動生成此配置文件。因爲手動輸入錯誤,或是Bochs版本更新的緣故,會帶來很多莫名其妙的問題,所以,自動生成配置文件才能讓我們不會把有限的經歷花費在這種極度低級的錯誤上。

我們運行bochs命令即可進入其命令菜單,如下所示:
在這裏插入圖片描述
就像界面中提示的,我們可以在命令行中指定-q參數來跳過這個菜單界面。
在這裏插入圖片描述
當我們進入編輯菜單後,會出現上圖所示的子級菜單項。在這些配置選項中,我們通常比較關心的是“磁盤與啓動選項”和“其他選項”。

  • 在“磁盤與啓動選項”中,我們可以配置掛載的磁盤映像文件,並設置啓動設備。
  • 在“其他選項”中,我們可以設置提供給GDB的調試端口(--enable-gdb-stub參數模式下)。

設置好相關選項後要記得保存爲配置文件。

1.4、啓動Bochs

當使用GDB遠程調試Bochs時,需要在一個控制檯窗口啓動Bochs並等待GDB連接,之後還需要打開另一個控制檯窗口啓動GDB以供我們調試使用。在進行頻繁的調試工作時,這個過程很容易讓人惱火。我們可以編輯以下腳本程序來自動化此過程:

#!/bin/bash

gnome-terminal -t "Bochs" -- bochs -q
gnome-terminal -t "GDB" -- gdb <內核程序文件>

此腳本程序適用於Ubuntu20.04,如果是其他Linux發行版本,可能需要更換爲對應的腳本。

二、GDB

1、遠程調試

啓動GDB後,我們需要連接遠程調試接口:

target remote localhost:1234

示例中的端口1234是Bochs配置中開啓GDB Stub功能後默認設置的端口,也可以在Bochs配置中修改爲其他未被佔用的端口並在此使用新端口。連接成功後,如下圖所示:
在這裏插入圖片描述

2、.gdbinit文件

GDB在調試程序前,可以首先讀取當前目錄下的.gdbinit文件,並執行裏面的GDB命令,這樣我們可以把一部分工作進一步自動化。但默認情況下,GDB是不允許我們這麼做的,GDB會認爲這樣不是很安全。如下圖所時:
在這裏插入圖片描述
如圖中中所示的,爲了執行.gdbinit中的GDB命令,我們需要進行如下操作:

  • 1、創建上圖中指定的.gdbinit文件,如上圖紅框中的/home/hy/.gdbinit
  • 2、編輯此.gdbinit文件,在其中添加add-auto-load-safe-path指令,如上圖紅框中的add-auto-load-safe-path /home/hy/workspace/native/multiboot2/.gdbinit
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章