为什么 BIOS 需要从 MBR 加载第一阶段引导加载程序,而 UEFI 则不需要?
我猜这可能是因为 BIOS 无法寻址 64 位(以及 32 位)内存,而 UEFI 可以直接访问所有内存。还是我错了?
答案1
MBR 是一种分区方案(分区在磁盘上的显示方式的布局)。经典 BIOS 不了解分区。它只是从启动磁盘的扇区 0 加载 512 字节(最初称为 Cylinder-Head-Track,现在通常是逻辑块寻址),验证两字节签名,如果签名匹配则运行代码。 BIOS 的第一阶段引导加载程序是磁盘上一个 512 字节的区域,加载了 16 位执行代码,并保留了两个字节用于签名。
相比之下,UEFI 确实了解 MBR 和 GPT,并且可以使用任一分区系统来加载第一阶段加载程序文件,这是位于专门定义的分区中的预操作系统启动环境,甚至可以定制为跨多个芯片启动类型,具有不同数量的可用物理内存等。
实现 UEFI 的 BIOS 知道如何读取(某些类型的)分区并将该代码加载到内存中。加载后,UEFI 启动环境可以使用 32 位模式或 64 位模式,从磁盘上的任何位置加载操作系统,并提供附加服务,例如选择要加载的操作系统、验证启动条件是否安全等。使用整个分区作为其第一阶段引导加载程序。
BIOS 传统上被限制不能切换 CPU 模式(增强模式、长模式等)或更改 A20 门,这会改变操作系统的启动条件。这些限制还意味着扇区 0 引导加载程序将限制其可以访问的内存量或可以加载的扇区量。此外,在这种情况下,第一阶段引导加载程序通常也需要大部分可用空间来加载第二阶段引导加载程序,因此无法切换 CPU 模式、启用更多内存等。
第二阶段引导加载程序必须物理存在于磁盘上的某个偏移量内,以便引导扇区可引导。基本上,有关 BIOS 的所有内容都保留了向后兼容性。引导扇区代码最初必须为 16 位模式,尽管如果它知道下一阶段处于 32 位模式,它可以切换到 32 位模式,但很难利用有限的可用空间来做除了加载之外的任何事情来自磁盘的更多数据并跳转到该位置。
此外,使用 32 位模式会相应地减少可以执行的剩余指令数。最后,BIOS 仅以 16 位提供其“驱动程序”,因此更改 CPU 的模式将有效地禁用 BIOS,这是您在第二阶段引导加载程序之前不想做的事情,此时您有时间加载核心驱动等
您可以在具有 16GB 内存和 4TB 硬盘的新型 8 核处理器上安装 DOS 5.0(甚至更早版本),并且只要 BIOS 支持引导扇区加载,和只要它提供必要的 BIOS 调用(例如磁盘读/写/查找、键盘中断等),您的程序仍将在底层操作系统的限制内运行(例如您只能对部分硬盘空间进行分区、访问一些已安装的内存,并且仅使用 1 个核心)。最新、最好的硬件通常仍然支持三十年前或更早编写的代码,即使是在裸机上(即没有虚拟机或模拟器)。
答案2
答案3
你的猜测很接近,但错误。真正的限制是 640k 以及创建约定的 BIOS ROM 的大小,这是迄今为止限制 BIOS 启动的约束。 EFI很大。它实际上比早期版本的 DOS 更强大、更有用,它可以直接读写文件。安装早期的 ROM 阵列会非常昂贵(注意我没有说芯片,我不认为你可以将它安装在四个上!)直到 dos 被加载(它理解文件系统和文件)之前,引导加载程序只能使用块,即要求BIOS从磁盘上读取这个块或那个块,BIOS只会在磁盘上的第一个块中查找引导加载程序。