bochs调试心得

1,让调试错误信息显示到控制台

  作者在第三章讲DPL时,设计了一个保护异常的出错例子(50页):将DPL设为1,RPL设为3,编译运行,结果“系统崩溃,bochs重启,在控制台你能看到这样的字样:load_seg_reg(ds):RPL&amp;RPL must be <=DPL”

  可我专门找了一个上午都没有找到出错信息,最后发现bochs的调试出错信息默认都被重定向到bochsout.txt文件里去了。

  要想让出错信息重回控制台,把配置文件.bochsrc里“log: Bochsout.txt ”这行用#号注释掉就OK了。

  bochs在退出或崩溃时都会输出有关信息(到控制台或是Bochsout.txt),对调试自己的操作系统而言,这样的信息绝对重要。我一直是将配置文件中的这行保持注释的。


2,x /2 0x7c00 查看0x7c00地址开始,往下的两个双字!注意是双字

  在网上查到的
  -------------------------------------------------------
  x/nuf addr 查看一个物理地址的内存
  例如 x /2 0x7c00
  功能:查看0x7c00地址开始,往下的两个双字!注意是双字!即u=w
  在16位汇编时,还是指定u参数取h较直观。
  下面是具体参数介绍(我上面只指定了n参,u参默认为双字)
  n 显示多少个单位的内存
  u 内存单位大小,可以是
  b 字节
  h 字(2个字节)
  w 双字(4个字节)
  g 4字(8字节)

  注意: 它们不太符合Intel字节命名格式,


3,dh,dl表示描述符的高16位,低16位

  通常输入info cpu,会得到类似下面的结果:

----------------------------------------------------------------------------------------------------------------------------------------

1 1eax:0x8000844c, ebx:0x00000000, ecx:0x00000000, edx:0x00000000
2  ebp:0x00000000, esp:0x000001f0, esi:0xffff88ca, edi:0x00000000
3  eip:0x00000013, eflags:0x00000086, inhibit_mask:0
4  cs:s=0x0024, dl=0x84540018, dh=0x00409800, valid=1
5  ss:s=0x0014, dl=0x805401ff, dh=0x00409300, valid=5
6  ds:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
7  es:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
8  fs:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
9  gs:s=0x0013, dl=0x8000ffff, dh=0x000cf30b, valid=5
10  ldtr:s=0x0018, dl=0x7e380047, dh=0x00008200, valid=1
11  tr:s=0x0028, dl=0x7e800069, dh=0x00008900, valid=1
12  gdtr:base=0x00007e00, limit=0x2f
13  idtr:base=0x00000000, limit=0x3ff
14  dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
15  dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
16  cr0:0x80000011, cr1:0x00000000, cr2:0x00000000
17  cr3:0x00200000, cr4:0x00000000
18  done

----------------------------------------------------------------------------------------------------------------------------------------


  以第9行的gs为例

  dh,dl分别对应描述符的高16位,低16位

  [ 0 0 0 c f 3 0 b][ 8 0 0 0 f f f f ]


  我起初总是把dh,dl往投影寄存器上想,折腾了很久很久之后才幡然醒悟,d就是descriptor的简写,是我想多了。

  感觉bochs的设计者的思维有点儿反,他因该先输出dh,再输出dl,这样容易左右连接,让人联想到输出64位的的descriptor。或者是我脑子太锈了,实在难过。


4,单步操作命令s要慎用

  用s命令单步执行完写屏指令,bochs虚拟机的画面并不会更新,什么是写屏命令?像比下面一段指令:

mov ah,00001010b
mov al,'y'
mov bx,2*8
mov gs,bx
mov [gs:0],ax
  在调试执行最后一条指令(它就是写屏命令)时,如果仍然用“s”命令来单步执行,bochs的界面左上角并不会出现绿色的“y”字符!不知道是不是bug,这时候因该换作“n”
命令执行。




posted on 2012-10-06 15:08  weiweishuo  阅读(700)  评论(0编辑  收藏  举报

导航