感谢 pt 的报告。如果不出所料,那么 2007-10-21 的版本应该解决了此问题。请测试。
发现了 FAT12/16 引导扇区中的一个隐蔽的 bug。
2007-10-21 应该解决了。
请 pt 测试。
PS:感谢 pt 漂亮的 bug 报告!使得此问题能够快速定位于 FAT16 引导扇区。
这是一个长期存在的隐患,自从 FAT12/16 代码写出来的那一天就一直存在了!
通过逐条检查 FAT12/16 引导扇区的代码,终于发现了一个可疑之处。
复制内容到剪贴板
mulb 0x1a(%bp) /* nHeads, but maybe a word value 0x100 */
jnz 1f
movb %bl, %ah /* nHeads=0x100, so AX=sectPerTrack*0x100 */
1:
在相乘操作 MUL 之后,零标志 ZF 是无定义的。所以,用 JNZ 是错误的,必将引发随机失败!这正好是 pt 所遇到的情况。
这同时也显示出 Intel CPU 设计上的一个缺陷(可以说是很大的一个缺陷)。
一个良好的 CPU 设计,应该在执行任何一条命令之后,都不出现“无定义”的标志位。因为这种“无定义”的状态,没有任何用处。注意,“无定义”并不等同于“保持指令执行前的状态”。“无定义”等同于“随机的”。
具体针对 mul 指令来说,当相乘的结果是 0 的时候,就应当设置 ZF 标志(零标志),反之,就应当清除 ZF 标志,而完全没必要把 ZF 搞成“无定义”的状态,从而给程序员带来巨大负担。程序员有了负担,那么程序代码的质量就难以保证。这如果发生在 BIOS 和系统程序设计上,它的危害就更大。(其实 GRUB 就是一个小系统)。
感谢大家的一同努力!相信 grub4dos 会日益完善!
在这个问题上,pt 是一个伟大的贡献者。先前也有几位报告了几个长期存在的问题,他们也是很伟大的贡献者。
朋友们,没有你的参与,grub4dos 的问题就不能得到解决。这就是你的伟大之处!你不是平凡的,你也是开发者的一员。向你致敬!
Last edited by 不点 on 2007-10-21 at 12:55 PM ]