我们再接下来看一下练习二
练习二也是一个实践的过程
我们希望大家能够通过
我们硬件模拟器qemu 还有GDB
能够执行和调试lab1中的软件
这里面给出一些小的练习
比如说我们能不能单步跟踪BIOS
单步跟踪0x7C00处的设置断点
然后把它整个执行过程代码给记录下来等等
这是我们后续要去完成的实验
这里面呢 我们可以看到
这里也给出了提示
我们在这里有一个叫做makelab1-mon
这是一个什么呢
那这条命令你可以看出来
它这里面大致是干了两个事情
第一个是让qemu把它执行的指令给记录下来
把log信息给记录下来
放到这个地方 q.log
第二个是和我们的GDB结合
结合来调试
来可以调试正在执行的Bootloader
需要注意 这里面还没有到uCore
还在Bootloader阶段
这个比较重要
它是以前初始化的一些执行指令
我们看看这里面有什么内容
那这个呢都是GDB
GDB能够识别的一些命令
它第一个 比如说加载bin/kernel
这是加载符号信息了
这实际上是uCore的信息
这里其实还没用到 第二个呢是
第二条指令是与qemu进行连接
通过这个TRP进行连接
刚开始的时候
BIOS是进入是8086的16位实模式方式
那一直到0x7C00在BIOS这个阶段启动
最后把Bootloader加载进去
把控制权交给Bootloader
那么Bootloader第一条指令
就是在0X7C00处
所以说 在这个地方
我们设一个断点break
break 0X7C00
然后让这个系统继续运行
那我们就可以看到
它会在这个断点处停下来
那我们可以把相应的这个指令给打印出来
最后一条是x /2i $pc
就是把这个 我们PC 就是我们EIP
也就是指令的指针寄存器
它存当前正在执行这个指令的地址
那么X是显示的意思
/2i是显示两条 i 是指令 是个含义
那么我们可以看看执行下会是怎么一个结果
比如说make lab1 mon
它前两个窗口 一个是qemu
这里面是qemu 可以看到已经启动起来了
但是它断下来了 断在哪呢
0X7C00处 我们这已经看到了
那这里面 其实还可以显示更多条数信息
比如说我们可以在x/10i $pc
可以把当前的10条指令都显示出来
那这些指令在哪呢
大家想 这个指令在什么地方
我们启动代码这个目录下存放
就是Bootloader那 其实也可以看到
在这边 从第16行开始 它这个指令
和我们刚才看到的GDB里面的指令
我把这个先关掉
和我们看到GDB里面的指令是一样的
可以看到其实我们现在
已经断到了Bootloader起始的位置
我们接下来可以让它继续运行
那我们可以看到这个效果
我们可以把这个显示在这儿
让它一直位于顶端 OK
那这时候它就一直会出现
continuing一下 好
你可以看到 这时候它跑的很快
就是这里面
它已经把我们uCore都加起来了
可以进去运行了
Ctrl+C断掉
OK那现在就停下来了
这就是一个很方便的调试Bootloader的方法
包括后续的uCore也是一样 很类似
好 那这是一些提示信息
比如GDB里面怎么去单步调试
那这是命令方式
我们上次讲lab0所以给大家提示过
怎么能够在ECLIPSE环境下
来提升它调试 这个命令比较简单
所以我们用GDB直接来调试了