请自行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
输入next
,X
被打印出来了吗?
现在是学习gdb这个软件的好机会,它是很有用的哦。
网友评论