challenge2.1:learn_to_use
challenge2.1:learn to use
根据提示,学习一下如何使用gdb下断点调试;
Makefile-lab1mon
到路径/labcodes_answer/lab1_result/中;
- 执行
make lab1-mon |
此时qemu启动,运行后立即暂停,gdb显示相关信息;
0x0000fff0 in ?? () |
- 查看Makefile中lab1-mon的信息,依次执行;
less Makefile |
可以看到:
lab1-mon: $(UCOREIMG) |
在开启qemu后,qemu等待指令。短暂休眠后,gdb加载lab1init参数,进行调试;
- 查看/tools/lab1init的内容;
file bin/kernel |
可以看到,gdb加载了bin/kernel,连接远程调试的端口,并设置了架构为i8086,断点设置在了0x7c00,执行继续,并打印出eip所在和下一条的汇编指令;
单步跟踪BIOS
CPU加电后,CPU中ROM存储器将初始值赋值给寄存器,其中CS
为0xf000
,IP
为0xfff0
;因此读取的位置为f000:fff0
;
调试可知:
让qemu等待调试;
qemu -S -s -hda bin/ucore.img -monitor stdio |
gdb调试;
(gdb) target remote 127.0.0.1:1234 |
根据PC = 16*CS + IP,我们可以得到PC = 0xffff0,因此BIOS第一条指令的位置为0xffff0
;
在Makefile中,存在debug操作:
debug: $(UCOREIMG) |
这里载入了gdbinit的命令,可以去看一下;
file bin/kernel |
去掉continue
,因为break
了又continue
,相当于没有break
;
file bin/kernel |
再次执行make debug
,即有:
0x0000fff0 in ?? () |
可以看到:
(gdb) x/i 0xffff0 |
第一条指令即是跳转到0xf000e05b
,证明修改gdbinit后执行的即是第一条指令;
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 K1ose's Space!