在尝试回答 askubuntu 上的这个问题时:如何卸载 GRUB我读过维基百科上有关 MBR 的文章还有对相关问题的完美回答然而,在超级用户这里,有一件事对我来说仍然不清楚:
BIOS 究竟是如何决定某个驱动器是否可启动的?如果系统中安装了多个驱动器,启动顺序如何跳过驱动器 #1 并继续尝试从驱动器 #2 启动?
我的理解是,BIOS 通常检查 MBR 上的唯一内容是位于 512 字节扇区最末端的签名,然后它将控制权转移到位于引导扇区前 446 个字节的初始引导加载程序。
这是否意味着即使磁盘无法启动,引导扇区的前 446 个字节也必须包含一些有意义的引导加载程序代码?
在 BIOS 将控制权转移到驱动器#1 上的引导加载程序(该驱动器恰好没有“可引导”分区)之后,第二个驱动器上的引导加载程序究竟是如何调用的?
抱歉,如果这个问题太技术性了:) 简短的问题是:“BIOS 究竟是如何跳过一个驱动器并继续尝试从下一个驱动器启动的?”
答案1
是什么让 BIOS 决定驱动器是否可启动?
BIOS 根据 16 字节分区记录来决定驱动器是否可启动,后MBR 代码区域(保存在从第446 个字节开始的表中)。每个分区记录中的第一个字节表示驱动器的可引导状态(设置为0x80
可引导或0x00
不可引导)。某些 BIOS 可能还会检查 MBR 的其他部分(例如分区类型、校验和),但基本要求是可引导标志。
如果系统中安装了多个驱动器,启动顺序如何跳过驱动器 #1 并继续尝试从驱动器 #2 启动?
这取决于具体实现,因此您需要正确选择启动顺序。在大多数情况下,BIOS 将按照您设置的顺序查看每个存储介质,并确定是否可以从该设备启动(通过 MBR 数据)。如果可以,则启动;如果不能,则继续循环其他设备(同样按照您选择的顺序)。
在 BIOS 将控制权转移到驱动器#1 上的引导加载程序(该驱动器恰好没有“可引导”分区)之后,第二个驱动器上的引导加载程序究竟是如何调用的?
一旦找到有效的启动设备(即设置了可启动标志,并且通过了其他附加检查),BIOS 就会将 MBR 扇区复制到 RAM 中。然后 BIOS 将指令指针重新定位到此位置的开头(使用指令JUMP
),即 MBR 代码段所在的位置,然后计算机启动。
如果 BIOS 支持BIOS 启动规范,MBR 代码可以通过特定指令将控制权返回给 BIOS,向其发出启动失败信号并提示其尝试下一个设备。但较旧的 BIOS 只会打印错误消息。判断您的 BIOS 是否支持此功能的一个好方法是您是否可以从 USB 启动。
我的理解是,BIOS 通常检查 MBR 上的唯一内容是位于 512 字节扇区最末端的签名,然后它将控制权转移到位于引导扇区前 446 个字节的初始引导加载程序。
这是正确的,但应该注意的是,大多数现代 BIOS 也会查找 GUID 分区表(GPT),以及较旧的传统 MBR 样式表。
这是否意味着即使磁盘无法启动,引导扇区的前 446 个字节也必须包含一些有意义的引导加载程序代码?
不,但驱动器必须具有有效的 MBR 或 GUID 分区表 - 否则计算机将无法检测到它。虽然 MBR 的代码部分确实可以为空,但驱动器的第一个扇区必须具有格式正确的 MBR/GPT。
答案2
我已阅读 @Breakthrough 的已接受答案,但我认为它是错误的。或者至少对于我这里的硬件来说它不适用(主板 MSI MS-6340)。在 @Breakthrough 的回答中,他说启动是通过分区进行的。因此,您可以拥有一个带有多个可启动分区的磁盘。但在我的主板的 BIOS 中,我只能选择磁盘。而不是分区。
正如您在手册的屏幕截图上看到的,您可以说“第三启动设备是 HDD-0”。
正如@Breakthrough 所说,启动是通过磁盘而不是通过分区进行的。
MBR 的分区表被 BIOS 完全忽略。
这符合以下描述osdev.org。
因此 BIOS 只会查看 MBR 的最后两个字节,看看它们是否与 0x55 0xAA 匹配。然后它会加载 MBR 并在一开始就执行引导程序。
MBR 中的分区表仅由 Windows 操作系统使用,而不由 BIOS 使用。
还要注意,如果你用 FAT32 格式化磁盘(例如 USB 笔式驱动器),那么它将有一个 MBR!虽然它不可启动!不要问我这个磁盘的 MBR 引导代码会做什么。它可能只是中止并转到下一个启动选项。