为了更好的学习与了解一个OS微内核,了解微内核的代码如何运行十分必要,因此学会如何调试观察微内核的程序便是更好的学习与了解一个内核代码的开始。我学习的是Fiasco微内核系列中的基于x86体系的多核轻量级微内核NOVA,我们知道内核程序不能直接放在一般的IDE环境中运行,需要在硬件平台或者虚拟硬件平台上运行,在这我选用的是qemu这个虚拟平台。
环境搭建
运行文件形式搭建如下:
此环境搭建可借鉴我的另外一篇博文:https://blog.csdn.net/qq_40326481/article/details/79434934
然后将由kern和user中的源代码make生成的两个elf可执行文件放入boot文件夹:
make run写在环境最外层,运行后结果如下:
我们可以看到nova微内核已经在qemu虚拟平台上启动,因为我们的用户层写的是空循环没有加任何操作,暂时内核没有被调用,但这不影响先学习内核的启动过程。
接下来是要使用gdb来调试qemu上的内核程序,简单的介绍gdb是一款linux系统上的程序调试工具,在这它可以远程调试qemu上的内核程序。
要将gdb链接上qemu平台,我们需要在makefile文件的make run启动命令中加入以下命令参数:
其中-gdb tcp::1234 代表设置gdb远程调试端口,也可以用-s替换,会默认设置1234为gdb远程链接端口。
-S为启动后暂停qemu加载程序运行指令,以方便在gdb中调试时先加断点再运行。
在make run之前,我们还需在kern和user文件的makefile文件中加入-g命令参数重新make生成elf文件,这是为了生成供gdb调试的调试信息文件.
重新make run后结果如下:
然后打开另一个终端。打开gdb,输入 target remote:1234连接qemu平台,在输入file 内核elf文件的路径,便可准备开始调试:
GDB调试
GDB主要功能:
1. 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序
2. 可让被调试的程序在你所指定的断点处停住(断点可以是条件表达式)
3. 当程序被停住时,可以检查此时你的程序所发生的事情
4.动态的改变你的程序的执行环境
GDB相关调试命令:
(gdb)target remote:1234 ------远程链接qemu平台
(gdb)file elf文件路径 ------加载要调试的文件
(gdb)b 函数名/文件行数 ------打断点
(gdb)c ------继续运行至断点处
(gdb)list/l ------显示源代码
(gdb)p 变量名 ------显示变量
(gdb)info b/break/breakpoints ------显示断点信息
(gdb) info reg ------显示寄存器信息
(gdb)s -------执行一行源程序代码,如果此行代码中有函数调用,则进入该函数
(gdb) n -------执行一行源程序代码,此行代码中的函数调用也一并执行
(gdb) display /i$pc -------调试汇编指令,且每次程序中断后可以看到即将被执行的下一条汇编指令
(gdb) undisplay 1 -------取消先前的display设置,编号从1开始递增
整体源码见:https://github.com/chencoolboy/NOVA-QEMU-GDB-