配合视频学习体验更佳:
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
下载Bochs 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
为即将要安装的bochs创建一个空目录
mkdir bochs-gdb
进入解压后的bochs-2.6.8文件夹 cd bochs-2.6.8
配置bochs的config文件(–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
创建bochsrc.disk
命令: touch bochsrc.disk
,在其中写下配置信息(修改romimage:
、romimage:
、 keyboard:
后面路径信息的前部分为自己的bochs安装路径)
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
然后在输入框依次输入以下,输入一个,按一次回车
1
hd
flat
60
hd60M.img
然后Makefile中
ASFLAGS
与CFLAGS
均添加 -g 参数,这样生成的.o文件,是包含调试信息,比如符号。最后ld而成的kernel.bin也包含调试信息。然后使用
objcopy --only-keep-debug kernel.bin kernel.sym
在加载内核镜像到 Bochs 之前,导出 GDB 可以理解的符号表格式。或者像我一样在Makefile中添加规则,这样make all时候,自动生成kernel.sym
文件
修改(Makefiel)
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
编译,向hd60M.img中写入我们的kernel.bin文件
启动bochs虚拟机bin/bochs -f bochsrc.disk
,会提示等待gdb连接,现在我们打开一个新的终端,输入gdb以启动gdb,如果没有gdb,需要安装,命令:sudo apt install gdb
在gdb窗口中输入命令:target remote localhost:1234
以连接bochs进行调试
然后输入命令:symbol-file /home/rlk/Desktop/the_truth_of_operationg_system/chapter_12/c/build/kernel.sym
以加载kernel.bin的符号表
现在就能gdb调试c语言了,需要自行学习如何用gdb调试