Welcome to Rooeye's blog

Orange’s自制操作系统系列笔记(3)—使用bochs调试操作系统

操作系统 rooeye 388℃ 0评论
上一篇笔记提到当运行bochs虚拟机的时候:

  1. 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 指令查看。

  1. n 显示的单元数
  2. u 每个显示单元的大小,u可以是下列之一:
  3. b BYTE
  4. h WORD
  5. w DWORD
  6. g DWORD64
  7. 注意: 这种命名法是按照GDB习惯的,而并不是按照inter的规范。
  8. f 显示格式,f可以是下列之一:
  9. x 按照十六进制显示
  10. d 十进制显示
  11. u 按照无符号十进制显示
  12. o 按照八进制显示
  13. t 按照二进制显示
  14. c 按照字符显示
比如指令 xp /64bx 0xf000:0xe05bn = 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: 反汇编一段内存

u 0xf000:0xe05b 0xf000:0xe05f 表示对从地址fe05bh到fe05fh的内存进行反汇编 。

trace-reg on : 每执行一条指令就显示cpu信息



从上图可以看出,当没有执行指令 trace-reg on 的时候,执行指令 s 的时候不会显示寄存器信息,执行指令 trace-reg on 后,执行指令 s 会显示寄存器信息。

下一篇笔记写关于引导扇区的笔记。














来自为知笔记(Wiz)

转载请注明:寻梦人博客 » Orange’s自制操作系统系列笔记(3)—使用bochs调试操作系统

喜欢 (1)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址