【发布时间】:2019-05-18 08:48:12
【问题描述】:
我想学习汇编程序以使用超最少的裸代码让任何 x86 兼容机器运行,以便在开机时在屏幕上显示硬编码文本。 我关心与 x86/IBM 机器的完全兼容性。
我按照关于简单引导代码的教程进行操作,但惨遭失败,无法通过笔记本电脑上的 USB 物理运行它们。就像我的笔记本甚至没有触及 MBR 代码一样。 我花了两个星期阅读大量文章,但结果一无所获。我学到了很多关于 BIOS 参数块、分区条目、this old Phoenix BIOS specification 和 UEFI 的知识。
我的笔记本电脑可以通过可启动的 FreeDOS USB 正确启动。 这是带有 MBR 的 FreeDOS USB 的第一个扇区: Nice and full of real useful codey-code
我尝试从带有 UEFI 的台式计算机启动它,它工作正常。 我尝试从带有 Phoenix BIOS 的笔记本电脑启动它,它工作正常。
然后我擦除了所有启动指令: Nice and full of NOTHING but one partition entry
我尝试使用 UEFI 从同一台台式计算机启动它,但它按预期失败。 我尝试从带有 Phoenix BIOS 的笔记本电脑启动它,它工作正常。我发誓。
我想知道为什么有一个 BIOS 可以自行处理并跳过 MBR 指令,如果有更多类似的,我在哪里可以找到有关它们的文档,以便我可以使我的启动代码与所有 BIOS 完全兼容.
我笔记本的BIOS版本是1.08,EC版本是1.07。 我不想更新它。如果 FreeDOS 可以正常启动,那么我希望我的引导代码也可以正常启动。
【问题讨论】:
-
我假设您正在使用硬盘驱动器仿真 (HDD) 而不是软盘仿真 (FDD) 启动此 USB。
-
使用 HDD USB 仿真时,一些 BIOS 实际上会从第一个扇区 (MBR) 读取分区表,找到一个活动条目,然后自动加载卷 (VBR) 的第一个扇区并开始运行它MBR 中的代码。对于 Freedos,分区的第一个扇区很可能是运行的实际代码。这只是一个疯狂的猜测。
-
BIOS 的工作方式因制造商而异,不幸的是,情况可能有些随意。增加通过 USB HDD 引导并在 MBR 中运行代码的一种技术是实际创建一个分区表,其中活动分区指向 MBR 本身,而不是卷引导记录 (VBR)。
-
嗨@MichaelPetch,你猜对了。该 BIOS 只能模拟 USB 硬盘,它是不可配置的。我还猜测 VBR 会直接执行,并考虑通过跳转到 MBR 来修复它,以最大限度地提高 BIOS 之间的兼容性。但是现在我想知道是否存在包含所有已知 BIOS 引导行为的书或文章中的列表,这样我可以确保我的代码不会在我插入的下一台机器上崩溃。FreeDOS 开发人员是如何知道这些行为的存在做出这样的解决方法吗?或者您认为这只是巧合,因为它是首先加载 VBR 的标准程序?
-
不,这并没有很好地记录在一个地方,而是基于互联网上传播的信息。 osdev.org 在他们的 Wiki 页面和论坛上有一些信息,但又不是全部合并在一个地方。这就是为什么很多人使用像 GRUB 这样的引导加载程序来处理所有这些问题的原因。