ビデオによる学習体験の向上:
https://www.bilibili.com/video/BV12z4y177VQ/?vd_source=701807c4f8684b13e922d0a8b116af31
では、gdb デバッグをサポートする bochs 環境を構築しましょう。後のコードはすべて C で書かれているため、コードのロジックを明確にする場合は gdb デバッグが不可欠です。
環境 vmware + deepin-desktop-community-20.8-amd64
最初に他の必要なものをインストールします。
sudo apt install build-essential
sudo apt-get install libghc-x11-dev
sudo apt-get install xorg-dev
ダウンロードhttps://udomain.dl.sourceforge.net/project/bochs/bochs/2.6.8/bochs-2.6.8.tar.gz
ダウンロード後、仮想マシン内の目的の場所に移動して解凍し、次のコマンドを実行します。tar -zxvf bochs-2.6.8.tar.gz
boch をインストールするための空のディレクトリを作成します
mkdir bochs-gdb
解凍した bochs-2.6.8 フォルダーに移動します。cd bochs-2.6.8
bochs の設定ファイルを設定し (次の -prefix は bochs をインストールするディレクトリです)、コンパイルしてインストールします。
./configure --prefix=/home/rlk/Desktop/bochs-gdb --enable-gdb-stub --enable-disasm --enable-iodebug --enable-x86-debugger --with-x --with-x11 LDFLAGS='-pthread'
make
make install
bochs がインストールされているディレクトリに入り、コマンド: をcd ..
cd bochs-gdb
作成し、構成情報を書き留めます ( 、、および次のパス情報の最初の部分を独自の bochs インストール パスに変更します)。bochsrc.disk
touch bochsrc.disk
romimage:
romimage:
keyboard:
megs : 32
romimage: file=/home/rlk/Desktop/bochs-gdb/share/bochs/BIOS-bochs-latest
vgaromimage: file=/home/rlk/Desktop/bochs-gdb/share/bochs/VGABIOS-lgpl-latest
boot: disk
log: bochs.out
mouse:enabled=0
keyboard:keymap=/home/rlk/Desktop/bochs-gdb/share/bochs/keymaps/x11-pc-us.map
ata0:enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14
ata0-master: type=disk, path="hd60M.img", mode=flat,cylinders=121,heads=16,spt=63
gdbstub:enabled=1,port=1234,text_base=0,data_base=0,bss_base=0
ブートディスクを作成する
bin/bximage
次に、入力ボックスに次の内容を順番に入力し、いずれかを入力して Enter を 1 回押します。
1
hd
flat
60
hd60M.img
次に、Makefile内で
ASFLAGS
両方に-g パラメータを追加するCFLAGS
と、生成される .o ファイルにシンボルなどのデバッグ情報が含まれます。ld によって生成された最終的な kernel.bin には、デバッグ情報も含まれています。そして使用します
objcopy --only-keep-debug kernel.bin kernel.sym
カーネル イメージを Bochs にロードする前に、GDB が理解できるシンボル テーブル形式をエクスポートします。または、私がやったように Makefile にルールを追加して、すべてのファイルを作成するときにkernel.sym
ファイルが自動的に生成されるようにします。
変更 (メイクフィールド)
HD60M_PATH=/home/rlk/Desktop/bochs-gdb/hd60M.img #hd60M的路径改成支持GDB调试的bochs环境内的磁盘
ASFLAGS= -f elf -g
CFLAGS= -Wall $(LIB) -c -fno-builtin -W -Wstrict-prototypes -Wmissing-prototypes -m32 -fno-stack-protector -g
.PHONY:mk_dir hd clean build all boot gdb_symbol #定义了7个伪目标
#生成可以被GDB理解的符号表,用于GDB调试
gdb_symbol:
objcopy --only-keep-debug $(BUILD_DIR)/kernel.bin $(BUILD_DIR)/kernel.sym
all:mk_dir boot build hd gdb_symbol
#make all 就是依次执行mk_dir build hd gdb_symbol
kernel.bin ファイルをコンパイルして hd60M.img に書き込みます。
bochs 仮想マシンを起動するとbin/bochs -f bochsrc.disk
、gdb 接続を待つように求められます。新しいターミナルを開き、「gdb」と入力して gdb を起動します。gdb がない場合は、それをインストールする必要があります。コマンド:sudo apt install gdb
gdb ウィンドウに次のコマンドを入力して、target remote localhost:1234
デバッグのために boch に接続します。
次に、次のコマンドを入力して、symbol-file /home/rlk/Desktop/the_truth_of_operationg_system/chapter_12/c/build/kernel.sym
kernel.bin のシンボル テーブルをロードします。
gdb で C 言語をデバッグできるようになりましたが、gdb でデバッグする方法を自分で学ぶ必要があります。