|
本帖最后由 不点 于 2019-6-26 06:57 编辑
从图片可以看到,vol 命令先查找软盘,从软盘 0 一直查到软盘 A。这是一个错误。
看 vol 执行过程中的这段代码:
/* Search in hard disks first, since floppies are slow */
for (drive = 0; drive <= 0xff; drive++)
在注释中说,先查找硬盘,但实际的代码,却是先查找软盘。
第二个错误是,当启动盘是 (hd0) 而不是 (fd0) 的时候(这也正是报告者的实际情况),grub4dos 会在 bios 数据区中设定软盘个数为 0, 有效屏蔽掉软盘操作。但 vol 和 uuid 命令不管软盘个数的设置,直接使用软盘 0 ~ 10。
第三个错误是,bios 的软盘个数不可能超过 4 个,而 uuid 和 vol 命令使用了 11 个软盘(软盘0 ~软盘10,也就是图片中显示的软盘 0 ~ A,十六进制)。
所查找的这 11 个软盘,正好与 uuid 和 vol 中的代码是吻合的:
if ((drive > 10 && drive < 0x80) || (drive > (*((char *)0x475) + 0x80) && drive < 0x9f))
continue;
可能还有其它错误。
11 个软盘查找结束后,该去查找硬盘了。然而此时却死机了。就不知道,究竟是访问硬盘时死机了呢,还是在没开始访问硬盘之前就已经死机了。
这个 BIOS 确实在误导我们。它没有那么多软盘,却让那么多软盘的 EBIOS 接口返回成功。
而且,所有的软盘,其扇区 0 都是可读的,而且,能够从其扇区 0 计算出 H=255, S=63。怀疑这全都是 USB 硬盘的数据。就是说,这个 BIOS 让所有的软盘的扇区 0 的数据,都取自 USB 硬盘的扇区 0。
此时估计一下,死机的原因。
当 grub4dos 去访问不存在的那些软盘的时候,BIOS 本身可能发生了错乱(或者是 BIOS 故意自杀),导致此后在访问硬盘时死机。这个可能性较大。当然,死机还可能是别的原因。
补充:
刚刚看了 0.4.5c 里面的 uuid 命令,是正确的,不存在上述问题。
|
|