这就排除了 int13 保护代码造成问题的可能性。
剩下的测试将是艰苦的。目前怀疑 grub4dos 的 A20 控制代码影响了 USB BIOS。但是 A20 控制代码现在还不太容易对付,只能暂缓,等元旦之后再来解决。
目前你可以用 debug 来测试。你是机房管理员,debug 应该很熟练吧。实在不熟练,可以找人帮你。
请用 U 盘启动到纯 DOS,在 DOS 下用 debug 测试读 U 盘第一扇区是否成功以及返回的寄存器:
先用 扩展读功能 int13/ah=42h,然后再用 常规读功能 int13/ah=02h。
具体操作步骤:
敲入 debug 回车,进入 debug 的命令提示符。
敲入 a 100 回车,开始汇编程序。
敲入 mov si,0180 回车,数据包在 0180 处,下面我们会构造它。
敲入 mov ax, 10 回车,这是数据包长度,等于十进制的 16。
敲入 mov [si], ax 回车。
敲入 mov ax, 1 回车,这是要读的扇区数,我们将读取一个扇区
敲入 mov [si+2], ax 回车
敲入 mov ax, 0200 回车,这是存放 512 字节数据的缓冲区地址偏移
敲入 mov [si+4], ax 回车
敲入 mov ax, cs 回车,这是存放 512 字节数据的缓冲区地址段值
敲入 mov [si+6], ax 回车
敲入 mov ax, 0 回车,这是要读的磁盘的逻辑扇区号,它是 8 字节的 0
敲入 mov [si+8], ax 回车
敲入 mov [si+a], ax 回车
敲入 mov [si+c], ax 回车
敲入 mov [si+e], ax 回车
敲入 mov dx, 80 回车,这个 80 就是硬盘号码,应该代表你的 U 盘,我们将从 U 盘读取数据。
敲入 mov ax,4200 回车
敲入 int 13 回车
敲入 int 3 回车
此处多敲入一个回车,结束汇编程序。
此处敲入 g 开始运行这个程序,把屏幕显示的寄存器值抄录下来。此时用
d 200 回车
显示刚才读出的缓冲区,你可检查一下,看它是不是你的 U 盘的 MBR。
刚才的 d 200 命令只是显示了 80h 字节的数据,而不是全部的 MBR 扇区,因此你接下来还需要再用三个 d 命令,来继续显示 MBR 中的其余部分。
如果你不能确定这是不是你的 MBR,那么请你把这些显示都抄写上来。
好了,现在你可以敲入 q 回车,退出 debug,返回到 DOS 提示符。
-----------------------------------------
不要关机,也不要重启动。紧接着,你再次敲入 debug,进入下一个测试。
在 debug 提示符下,仍然是:
敲入 a 100 回车,开始汇编。
敲入 mov ax,201 回车
敲入 mov bx,200 回车
敲入 mov cx, 1 回车
敲入 mov dx, 80 回车
敲入 int 13 回车
敲入 int 3 回车
此处多敲入一个回车,结束汇编程序。
此处敲入 g 开始运行这个程序,把屏幕显示的寄存器值抄录下来。此时用
d 200 回车
显示刚才读出的缓冲区,你可检查一下,看它是不是你的 U 盘的 MBR。
刚才的 d 200 命令只是显示了 80h 字节的数据,而不是全部的 MBR 扇区,因此你接下来还需要再用三个 d 命令,来继续显示 MBR 中的其余部分。
如果你不能确定这是不是你的 MBR,那么请你把这些显示都抄写上来。
好了,现在你可以敲入 q 回车,退出 debug,返回到 DOS 提示符。
请报告以上结果。
----------------------------
如果你对此很精通,请你自己再把 int13/ah=41h 以及 int13/ah=48h 的测试一同做了,因为很可能需要你做(如果前面的测试结果能反映出问题,就不需要你再做测试了,但如果反映不出问题来,那么就需要你做 41 和 48 这两个测试了)。
请参照 ralf brown's interrupt list 来做这些测试。用 google 可以搜到。
注意,如果你准备做这两个附加测试,那么测试顺序是
先做 int13/ah=41h
其次 int13/ah=48h
然后 int13/ah=42h,前面已经说了详细步骤
最后 int13/ah=02h,前面已经说了详细步骤
注意,这四个测试之间不要关机,也不要重启。测试之间允许 退回到 DOS 然后再进入 debug 做下一个测试。
请把结果一并报告上来。
剩下的测试将是艰苦的。目前怀疑 grub4dos 的 A20 控制代码影响了 USB BIOS。但是 A20 控制代码现在还不太容易对付,只能暂缓,等元旦之后再来解决。
目前你可以用 debug 来测试。你是机房管理员,debug 应该很熟练吧。实在不熟练,可以找人帮你。
请用 U 盘启动到纯 DOS,在 DOS 下用 debug 测试读 U 盘第一扇区是否成功以及返回的寄存器:
先用 扩展读功能 int13/ah=42h,然后再用 常规读功能 int13/ah=02h。
具体操作步骤:
敲入 debug 回车,进入 debug 的命令提示符。
敲入 a 100 回车,开始汇编程序。
敲入 mov si,0180 回车,数据包在 0180 处,下面我们会构造它。
敲入 mov ax, 10 回车,这是数据包长度,等于十进制的 16。
敲入 mov [si], ax 回车。
敲入 mov ax, 1 回车,这是要读的扇区数,我们将读取一个扇区
敲入 mov [si+2], ax 回车
敲入 mov ax, 0200 回车,这是存放 512 字节数据的缓冲区地址偏移
敲入 mov [si+4], ax 回车
敲入 mov ax, cs 回车,这是存放 512 字节数据的缓冲区地址段值
敲入 mov [si+6], ax 回车
敲入 mov ax, 0 回车,这是要读的磁盘的逻辑扇区号,它是 8 字节的 0
敲入 mov [si+8], ax 回车
敲入 mov [si+a], ax 回车
敲入 mov [si+c], ax 回车
敲入 mov [si+e], ax 回车
敲入 mov dx, 80 回车,这个 80 就是硬盘号码,应该代表你的 U 盘,我们将从 U 盘读取数据。
敲入 mov ax,4200 回车
敲入 int 13 回车
敲入 int 3 回车
此处多敲入一个回车,结束汇编程序。
此处敲入 g 开始运行这个程序,把屏幕显示的寄存器值抄录下来。此时用
d 200 回车
显示刚才读出的缓冲区,你可检查一下,看它是不是你的 U 盘的 MBR。
刚才的 d 200 命令只是显示了 80h 字节的数据,而不是全部的 MBR 扇区,因此你接下来还需要再用三个 d 命令,来继续显示 MBR 中的其余部分。
如果你不能确定这是不是你的 MBR,那么请你把这些显示都抄写上来。
好了,现在你可以敲入 q 回车,退出 debug,返回到 DOS 提示符。
-----------------------------------------
不要关机,也不要重启动。紧接着,你再次敲入 debug,进入下一个测试。
在 debug 提示符下,仍然是:
敲入 a 100 回车,开始汇编。
敲入 mov ax,201 回车
敲入 mov bx,200 回车
敲入 mov cx, 1 回车
敲入 mov dx, 80 回车
敲入 int 13 回车
敲入 int 3 回车
此处多敲入一个回车,结束汇编程序。
此处敲入 g 开始运行这个程序,把屏幕显示的寄存器值抄录下来。此时用
d 200 回车
显示刚才读出的缓冲区,你可检查一下,看它是不是你的 U 盘的 MBR。
刚才的 d 200 命令只是显示了 80h 字节的数据,而不是全部的 MBR 扇区,因此你接下来还需要再用三个 d 命令,来继续显示 MBR 中的其余部分。
如果你不能确定这是不是你的 MBR,那么请你把这些显示都抄写上来。
好了,现在你可以敲入 q 回车,退出 debug,返回到 DOS 提示符。
请报告以上结果。
----------------------------
如果你对此很精通,请你自己再把 int13/ah=41h 以及 int13/ah=48h 的测试一同做了,因为很可能需要你做(如果前面的测试结果能反映出问题,就不需要你再做测试了,但如果反映不出问题来,那么就需要你做 41 和 48 这两个测试了)。
请参照 ralf brown's interrupt list 来做这些测试。用 google 可以搜到。
注意,如果你准备做这两个附加测试,那么测试顺序是
先做 int13/ah=41h
其次 int13/ah=48h
然后 int13/ah=42h,前面已经说了详细步骤
最后 int13/ah=02h,前面已经说了详细步骤
注意,这四个测试之间不要关机,也不要重启。测试之间允许 退回到 DOS 然后再进入 debug 做下一个测试。
请把结果一并报告上来。
因为我们亲手创建,这个世界更加美丽。
