|
关于 “在执行 int13/4B01 时发生死机” 的问题,今天有一些想法。
有以下可能性:
1、grub4dos 本身出现的 bug。这又分两种:(A)是 grub4dos 的代码、数据结构等出现了 bug。(B)是编译器 gcc 出现的 bug【而 grub4dos 的代码、结构都没有问题】。以上这两种,笼统都算是 grub4dos 本身出现的 bug。这是因为,用户拿到的是二进制编译结果,而不是 grub4dos 的文本程序代码。既然二进制编译结果是有问题的(尽管有可能是 gcc 造成的问题),那就算是 grub4dos 本身的问题。
2、调用 grub4dos 的那个调用者,出现的问题。可以通过举例来说明这方面的问题。
开发者在开发 grub.exe 的时候,已经知道,DOS 环境修改了中断向量表,而 grub.exe 无法完整恢复被 DOS 修改了的中断向量表,所以,有可能出问题。也正因如此,开发者建议尽量使用 grldr 而不是 grub.exe,也就是说,尽量躲过 DOS 环境,这样就降低了出问题的概率。强调一下,从 DOS 调用 grub.exe,这个调用者是 DOS,增加了复杂性。刚才说了,DOS 对于中断向量表的修改,就是造成问题的一个因素。grub4dos 的开发者,无法把控 DOS,换句话说,无法完全摸清 DOS 的内幕、底细,所以,不敢保证 grub.exe 能够适应各种 BIOS 环境(尤其是那些专门故意攻击 grub4dos 的主板)。因为没能完全恢复出原始的中断向量表,它们就可能在那些没有恢复的中断向量上添加一些 “能够让 grub4dos 死机” 的代码。比如说,这个主板(时不时地)专门去调用那个没有恢复的中断向量,这就必然要死机了。
上述例子说明了,grub4dos 的运行环境是很脆弱的,经不起一点周折。用户(以及第三方开发者)在使用 grub4dos 时,要尽量减少复杂性,减少周转步骤。要尽量直接使用 grub4dos,而不是经由另外一条路径间接进入 grub4dos。为什么呢?因为,既然你是间接进入 grub4dos,那么,你在进入 grub4dos 之前,做了哪些事情呢?你做的那些事情,就有可能埋下隐患了。你自己都不一定意识到。你可能觉得你的代码是 “正确” 的,不会有问题。然而,你不明白的是,“正确” 的代码,照样可以出问题,因为某个主板的底层程序做了微调,专门让某些的 “正确” 代码产生死机。你可能正好 “躺枪” 了。grub4dos 当然也会 “躺枪”,不过呢,grub4dos “躺枪” 的概率,肯定比你躺枪的概率低。为什么呢?因为 grub4dos 的开发者早都意识到了,并且也躲过了无数的 “枪”,或者说,已经中过那个枪了,不敢再去那个地方了,也就不会再去 “中枪” 了。你都没有这个意识,怎么可能会躲过呢?比如说,某些不该执行的 int13 调用, 你却执行了。此时你来调用 grub4dos,死机了。你大概不会知道,正是你先前执行的这个 int13 调用,触发了 “魔鬼”,让 BIOS 开始不稳定,或者 “颠簸”,导致 grub4dos 死机。根源是 BIOS 已经 “有病” 了,而不是 grub4dos 的锅。而 BIOS 之所以 “失常” 了、“神经” 了,则是因为你在不经意间触碰了 “魔鬼”。
刚才说的是某些主板故意制造的一个陷阱,在别的主板下,不存在同样陷阱(但可能会出现另外一个陷阱;陷阱是很多的,五花八门,各具特色)。
其实,还有一种可能性,就是,你在调用 grub4dos 之前,已经以某种方式对内存中的关键代码或数据造成了破坏。这是你自己的程序代码的锅,不是主板 BIOS 的锅。比如,你的代码在运行时,破坏了某些中断向量,或者破坏了 BIOS 数据区。这样,不仅 grub4dos 无法正常运行,其它任何启动软件,也都无法正常运行。
好的,最后一种可能。你没有躺 “主板 BIOS” 的枪,也没有破坏内存关键代码、数据。但是,你建立了一个 int13 磁盘映射。这个磁盘仿真代码是你自己编写的,也可能是来自 memdisk 等。grub4dos 运行在你建立的这个磁盘映射之下,这可超出了 grub4dos 的使用范围(前面提到过,这是增加了复杂性)。那么,这个先于 grub4dos 而存在着的、额外的磁盘仿真环境,就得 “准备好” 为 grub4dos 的启动失败而 “背锅”。因为,你接管了 int13,而正当 grub4dos 要去调用 int13 时,你的代码不工作了、死机了! 公平地说,grub4dos 要背 50% 的锅,你的 int13 环境也应该背 50% 的锅。究竟是谁的锅,通过调试、排查,就会弄清楚。设计几个简单的试验,用户自己通常就能判断出来。
本帖的探索性思考,希望能够对开发者有所帮助【让开发者不至于被用户的失败报告弄得疲惫不堪】,当然也希望能够对用户如何正确使用 grub4dos 有些许参考价值。 |
|