#Orange's 自制OS系列笔记(3)#调试操作系统
上一篇笔记提到当运行bochs虚拟机的时候:
bochs -f bochsrc
并不会直接运行,而是进入了调试状态,然后输入指令进行调试。
在上图中最后一行可以看到输入了指令“c”,
指令“c”的含义是“继续执行直到遇到断点"
. 实际这里可以输入很多指令,这篇笔记主要介绍使用bochs指令调试操作系统 ,常用指令见下图:
接下来对每条指令进行解释。
b addr : 在某个断点处设置断点
上图中使用指令 b 0x7c00 在地址 0x7c00处设置了一个断点,这里实际就是我们程序的入口地址,引导扇区就是在这里开始执行的。
info break: 显示所有的断点信息
因为我们只在 7c00h 处设置了一个断点,所以执行指令 info break 只显示出了一个断点信息
c : 继续执行直到遇到断点
因为我们只在 7c00h 处设置了断点,所以当运行到地址 7c00h
处的时候就会暂停,如上图所示,物理地址 0000:7c00 处对应的指令就是 mov ax , cs
s: 单步执行
指令
mov ax , cs 后单步执行 mov ds , ax
等指令。
r: 查看寄存器信息
上图显示了一共17个寄存器的内容
print-stack: 打印当前堆栈的内容
上图中顶部是栈顶,为低地址,底部是栈底,为高地址,每行显示堆栈中两个字节的内容。
如 STACK 0xfff4 [0x0000] 表示堆栈地址 0xfff4 存储的字节内容为 0x0000
下面来看两条指令:
xp /nuf addr : 查看内存物理地址内容
x /nuf addr : 查看线性地址内容
线性地址不是一个实际的地址,它会被cpu最终映射为物理地址。我们可以看到两条指令都可以选则
n,u,f三个参数。关于这三个参数的具体使用,可以使用 help x 指令查看。
n 显示的单元数 u 每个显示单元的大小,u可以是下列之一: b BYTE h WORD w DWORD g DWORD64 注意: 这种命名法是按照GDB习惯的,而并不是按照inter的规范。 f 显示格式,f可以是下列之一: x 按照十六进制显示 d 十进制显示 u 按照无符号十进制显示 o 按照八进制显示 t 按照二进制显示 c 按照字符显示
比如指令 xp /64bx
0xf000:0xe05b
:
n = 64 , u = b , f = x . 即显示从物理地址fe05bh处开始的64个字节,每次显示1个字节,字节内以16进制显示,执行该条指令结果见下图:
比如指令
x /64ho
0xf000:0xe05b
:n = 64 , u = h , f = o . 即显示从线性地址
fe05bh
处开始的64个字节,每次显示2个字节,字节内容以8进制显示,执行该条指令结果见下图:
u start end: 反汇编从地址start到地址end处的内存
u 0xf000:0xe05b 0xf000:0xe05f
表示对从地址fe05bh到fe05fh的内存进行反汇编 。
trace-reg on : 每执行一条指令就显示cpu信息
从上图可以看出,当没有执行指令
trace-reg on 的时候,执行指令 s 的时候不会显示寄存器信息,
执行指令
trace-reg on 后,执行指令 s 会显示寄存器信息。
下一篇笔记写关于引导扇区的笔记。