1,让调试错误信息显示到控制台
作者在第三章讲DPL时,设计了一个保护异常的出错例子(50页):将DPL设为1,RPL设为3,编译运行,结果“系统崩溃,bochs重启,在控制台你能看到这样的字样:load_seg_reg(ds):RPL&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:0x000000002 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
----------------------------------------------------------------------------------------------------------------------------------------
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” 命令执行。