从头写一个操作系统 13 (构建工具->GDB调试QEMU)

请自行google:monolithic kernel, microkernel, debugger, gdb

本节课目标:稍微暂停,梳理一下我们的代码,然后学习如何使用gdb调试我们的kernel。

也许你没有意识到你已经拥有了一个可以跑起来的内核。

虽然我们的内核还很小,只能打印'X'。但现在是时候停一下,将这些代码放入各自的文件夹中,写一个Makefile。

看一看新的文件结构吧,几乎都是从之前的课程目录中引用过的,所以如果要修改这些文件,最好是删掉这些引用重新写个新的。

由于后面我们大部分时间都会用C来编码,我们将用gdb连接qemu提供的调试端口。
第一步,我们需要一个交叉编译版本的gdb,苹果系统使用的lldb无法识别ELF格式(并且,homebrew的仓库里也查不到gdb)。

cd /tmp/src
curl -O http://ftp.rediris.es/mirror/GNU/gdb/gdb-7.8.tar.gz
tar xf gdb-7.8.tar.gz
mkdir gdb-build
cd gdb-build
export PREFIX="/usr/local/i386elfgcc"
export TARGET=i386-elf
../gdb-7.8/configure --target="PREFIX" --program-prefix=i386-elf-
make
make install

make debug试试。使用到的.elf文件是一个包含我们在内核上生成的所有符号的目标文件,因为我们调用gcc时使用了-g标志。请用xxd检查一下,你会看到一些字符串。实际上,检查对象文件中的字符串的正确方法是使用string kernel.elf

输入make debug:

设置断点:b main
运行OS:continue
运行两次next:程序运行到打印X前的一步,下一步就能够打印。

输入print *video_memory,将会出现L
让我们看看video_memory这个地址是哪, X将在下一步打印在这个位置:print vide0_memory

输入nextX被打印出来了吗?

现在是学习gdb这个软件的好机会,它是很有用的哦。

你可能感兴趣的:(从头写一个操作系统 13 (构建工具->GDB调试QEMU))