前言:
多少操作系统爱好者在自制操作系统过程中,参考例如《30自制操作系统》或者《一个Oranges操作系统的设计与实现》,又或者参考linux-0.1.1编写一个简单的内核时,一定要使用bochs的调试功能,其调试指令与gdb差不多。例如我三次尝试参考上面的书探索一下操作系统的实现过程,基本总是抄写书上的代码,一旦自己写几句汇编代码,就出bug了,然后然后就是把书上的代码看懂了,执行一遍......基本没有达到自己写一个内核要求。最后发现原因在于总是把它当成一个操作系统来编写,遇到bug了,就参考原来书上是如何实现的,到第四次尝试写一个玩具内核时,就按照每一步需要什么功能了,按照自己的想法编写,按最简单的方式来,当成一个单片机程序来对待,遇到bug了,不参考书上的代码了,使用bochs调试,这样就达到了内核基本是自己编写的,与其他内核每一个环节的目的是一样的,但是方式不同了。
bochs内核调试常用指令:
环境搭建就不说了,在当前文件的Makefile里边添加一个宏,例如:
.PHONY
bochs:
bochs(前面是tab)
当然也得有一个bochsrc在当前目录下。b:设置断点
b 0x7c00
在地址0x7c00处设置一个断点。blist:查看设置了哪些断点
直接执行blist即可。d:删除断点
d 1
在使用blist查看设置的断点后,其前面有一个编号1、2、 3,即可使用d 1删除第一个断点
关于断点的设置与取消,上面三个已经够用了。
----------------------------------------------------------------------------------------------------------------------
c:全速执行
在最开始设置断点b 0x7c00后,可使用>>c ,执行到0x7c00处暂停。
s或者s n:执行一步或者n步
直接执行>>s ,就是只执行一步,一步是按照汇编上来讲(可反汇编后查看每一步),一步太慢,也可使用例如>>s 2 ,执行2步。
r/creg/sreg:查看相关类型的寄存器
具体查看的是什么寄存器,可具体看看,指令非常简单
xp /5bx 0:
上面这个指令只是一个简单的使用,其中:
5:表示查看5个byte数据
0:表示要查看的地址
这个xp指令是查看的物理地址的,还有一个x表示查看线性地址的数据
具体可参考其他blog即可。