作業系統原理與實現 Bochs與GDB

2021-10-06 16:17:45 字數 2013 閱讀 5225

二、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有三種模式:

雖然操作核心的大量使用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

當我們將這個指令碼程式放置在解壓後的專案源**頂級目錄下並成功執行後,系統就會安裝好我們需要的bochs了。

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

我們執行bochs命令即可進入其命令選單,如下所示:

就像介面中提示的,我們可以在命令列中指定-q引數來跳過這個選單介面。

當我們進入編輯選單後,會出現上圖所示的子級選單項。在這些配置選項中,我們通常比較關心的是「磁碟與啟動選項」和「其他選項」。

設定好相關選項後要記得儲存為配置檔案。

當使用gdb遠端除錯bochs時,需要在乙個控制台視窗啟動bochs並等待gdb連線,之後還需要開啟另乙個控制台視窗啟動gdb以供我們除錯使用。在進行頻繁的除錯工作時,這個過程很容易讓人惱火。我們可以編輯以下指令碼程式來自動化此過程:

#!/bin/bash

gnome-terminal -t "bochs" -- bochs -q

gnome-terminal -t "gdb" -- gdb 核心程式文

此指令碼程式適用於ubuntu20.04,如果是其他linux發行版本,可能需要更換為對應的指令碼。

啟動gdb後,我們需要連線遠端除錯介面:

target remote localhost:1234
示例中的埠1234是bochs配置中開啟gdb stub功能後預設設定的埠,也可以在bochs配置中修改為其他未被占用的埠並在此使用新埠。連線成功後,如下圖所示:

gdb在除錯程式前,可以首先讀取當前目錄下的.gdbinit檔案,並執行裡面的gdb命令,這樣我們可以把一部分工作進一步自動化。但預設情況下,gdb是不允許我們這麼做的,gdb會認為這樣不是很安全。如下圖所時:

如圖中中所示的,為了執行.gdbinit中的gdb命令,我們需要進行如下操作:

作業系統原理 《現代作業系統 原理與實現》教材簡評

當看到上海交通大學陳海波教授 夏虞斌副教授等的著作 現代作業系統 原理與實現 這本教材時,內心滿是欽佩與敬意。過去一直採用國外的作業系統教材,很高興看到終於有國內學者編寫的重量級作業系統教材 全書共有24章 800多頁,這是迄今為止我所看到的知識最全面 內容最前沿 實踐最重視的一本作業系統教材了。作...

使用 Bochs 除錯作業系統

sudo configure enable debugger enable disasm sudo make sudo make install 啟動帶有除錯的 bochs 之後,我們會看到bochs 會進入乙個選項介面,我們選擇 6.begin simulation 就可以開始除錯了 行為指令 舉...

作業系統系列 核心介面與實現原理

shell 程式介紹 int fork main printf parent d pid exec 帶 p 和不帶 p 的差別在於 exit wait 檔案是使用者操作計算機的基本單位 printf 和 scanf 是用來分別操縱顯示器和鍵盤的函式 以 printf 為例具體來說 系統呼叫的意圖 實...