在双启动系统中,BIOS如何选择要运行的引导加载程序?

我有一台Windows和Ubuntu的双系统电脑。当我开机时,BIOS会进行POST,然后启动引导程序。
我想了解BIOS是如何选择要运行的引导程序的。我想了解在双系统电脑中,BIOS和引导程序之间的过程。

7我建议你阅读以下链接:https://en.wikipedia.org/wiki/Power-on_self-test,https://en.wikipedia.org/wiki/BIOS,https://en.wikipedia.org/wiki/Master_boot_record,https://en.wikipedia.org/wiki/GUID_Partition_Table,https://en.wikipedia.org/wiki/UEFI。 - waltinator
3个回答

BIOS固件实际上并不选择引导加载程序。它会从磁盘的0扇区加载代码并执行。无论那里是什么,它都会执行。希望那是一个引导加载程序(或者是加载引导加载程序的东西),但这并非必须。在早期个人电脑时代,软盘上有一些游戏可以在没有操作系统的情况下直接引导和运行 - 这些现在被称为“引导程序”。
UEFI固件实际上了解分区和文件系统,并扫描驱动器以寻找UEFI系统分区类型。由于这是一个文件系统,可以在此处放置多个引导加载程序。UEFI固件应该提供菜单或其他方式让您选择使用哪个引导加载程序。
许多UEFI系统以“传统模式”启动 - UEFI加载一个“兼容性服务模块” - 使其看起来像是一个BIOS,并且实际上像BIOS一样工作。
GRUB是一种常见的开源引导加载程序,可以引导Linux或“链式引导”(将控制权交给)Windows的引导加载程序(通常是位于Windows分区的Boot文件夹中的winload.exe)。GRUB让您能够做出决策。GRUB可以读取配置文件并从中获取默认选择。
如果你想要大量、血腥的细节,请阅读this

这是Ubuntu上需要sudo或root权限来向未挂载的磁盘写入任何内容的原因之一;如果一个程序或恶意用户将恶意软件写入引导分区... - wizzwizz4
谢谢LawrenceC,你的解释让我更加清楚地理解了。再次感谢! - Prashant Singh

这张图显示了控制权从固件(BIOS或UEFI)传递到引导加载程序,然后从引导加载程序传递到Ubuntu操作系统。 enter image description here
          BIOS vs. UEFI 如果操作系统以不同的模式安装(BIOS和UEFI),使用grub双启动Windows和Ubuntu是无法正常工作的。在一些预装有Windows的计算机上,可以在UEFI设置实用程序中选择启动Windows的选项。

将Ubuntu转换为UEFI模式

  1. 启动Boot-Repair,并选择高级选项 -> GRUB位置选项卡。
  2. 如果您看不到单独的/boot/efi分区选项,这意味着您的计算机没有任何UEFI分区。
  3. 如果您看到单独的/boot/efi分区选项,请在其左侧的复选框中打勾。
  4. 点击右下角的应用按钮。

Converting Ubuntu into UEFI mode

4. 将BIOS设置为以UEFI模式启动硬盘。调整此设置的方法取决于计算机的具体型号,但通常该设置位于BIOS/UEFI设置实用程序的“引导”选项卡下的引导优先级设置中。
或者,您可以在以UEFI模式启动的Ubuntu USB会话中,通过终端将现有的Ubuntu安装从BIOS模式转换为UEFI模式,按照this answer中的说明进行操作。

将Ubuntu转换为BIOS模式

注意:仅在需要将UEFI模式下的Ubuntu安装转换为以BIOS/CSM/legacy模式启动时使用此过程。如果某些硬件在UEFI模式下无法正常工作(例如显卡常常是问题的源头),可能需要进行此转换。然而,如果Windows仍以UEFI模式启动,那么在BIOS/CSM/legacy模式下启动Ubuntu会使引导过程变得更加麻烦——您需要使用计算机内置的引导管理器在操作系统之间切换,而有些计算机的引导管理器可能非常糟糕,这样做可能是不可能的。

  • 如果Ubuntu安装在GPT磁盘上(您可以通过sudo parted -l命令来检查),请使用GParted分区编辑器在其磁盘的开头创建一个BIOS-Boot分区(1MB大小,未格式化文件系统,设置bios_grub标志)。
  • 启动Boot-Repair,并选择高级选项 -> GRUB位置选项卡。
  • 取消勾选单独的/boot/efi分区选项。

Uncheck the Separate /boot/efi partition option

点击右下角的应用按钮。 将您的BIOS设置为以传统模式引导硬盘。通常,此设置位于BIOS的引导选项卡→启动顺序部分。

将Windows转换为GPT模式

MBR2GPT.exe是一个命令行工具,位于Windows 10的System32文件夹中。使用它,您可以有效且非破坏性地将Windows 10操作系统磁盘从MBR(用于传统BIOS)转换为GPT分区样式(用于UEFI),而无需修改/删除磁盘上的任何数据或进行干净安装Windows 10。


链接:


在传统模式下(BIOS引导而非UEFI),BIOS控制着驱动器的顺序。曾经,这个顺序是由电缆控制的;但是改变BIOS设置比打开机箱并更换电缆要方便。
BIOS将第一个磁盘(或由BIOS控制的驱动器顺序)的第一个扇区(512字节的磁盘,称为MBR或主引导记录)加载到内存中,然后将(CPU)控制权传递给此“引导加载程序”。因此,BIOS完成了其工作,第一个扇区中的代码开始运行。

对不起,先生,但我有点困惑,因为BIOS将控制权交给引导加载程序,而Windows和Linux具有不同的引导加载程序,所以它将控制权交给哪个引导加载程序呢?BIOS经历了什么过程来选择引导加载程序? - Prashant Singh
2您的系统每个磁盘只能有一个引导加载程序(且仅有一个处于活动状态)。通常,如果您的系统上有两个操作系统,则第二个安装的操作系统拥有引导加载程序,因为它将自己的代码写入了MBR。这就是为什么GNU/Linux(Ubuntu)使用GRUB的原因;它是一个多步骤系统(步骤1是MBR,步骤1.5和2位于/boot中),它会出现菜单询问您要加载/运行哪个操作系统(grub知道的那些,以及您添加到其中的任何ISO文件)。如果您有两个硬盘驱动器,则可以在每个驱动器上都有一个引导加载程序,但BIOS将确定哪个将运行。 - guiverc
如果我的电脑上有两个操作系统,那么GRUB是否必须显示一个菜单来询问我要加载哪个操作系统,为什么不是Windows的引导加载程序显示这个菜单呢?毕竟我电脑上有两个操作系统。 - Prashant Singh
Windows也有一个引导加载程序(至少到Vista为止);但它不像Grub那样智能。Windows版本不会搜索非微软产品(也无法读取ext/reiserfs/xfs/zfs/btrfs/...),因此你必须自己添加*nix;而且下次更新......Windows版本不值得使用,因为Grub要好得多。如果Windows安装在一块硬盘上,Ubuntu安装在另一块上,你可以通过BIOS修改引导;但Grub更快、更容易。(如果对我的回答满意,请接受并关闭问题) - guiverc
谢谢,现在我明白了开机过程中发生的事情。 - Prashant Singh
@PrashantSingh - 在一个多启动系统中,所有的操作系统都是Windows的某个版本,那么本地的Windows多启动选项将会起作用。在我的系统上,我有4个Windows系统,Win XP Pro(32位),Win XP X64(64位),Win 7 Pro(64位)和Win 10 Pro(64位)(这只能工作是因为我的硬件组件足够旧以支持Win XP的驱动程序,并且足够新以支持Win 10的驱动程序)。 - rcgldr
3@Prashant Singh:为什么Windows引导程序不允许这样做(或者在我了解Windows的时候没有)的最基本原因是,微软不会通过让你运行其他操作系统来赚钱。 - jamesqf
告诉我,如果我有两个操作系统,那么我会有两个MBR记录。如果可能的话,BIOS会首先加载哪个MBR,是第一个操作系统的MBR还是第二个操作系统的MBR? - Prashant Singh
@guiverc:先生,您说过GRUB阶段1是MBR,但是BIOS首先会进入MBR,然后选择引导加载程序,所以GRUB阶段1如何成为MBR呢? - Prashant Singh
一块硬盘只能有一个MBR(磁盘的第一个512字节扇区,或者LBA 0的第一个扇区),这也是为什么如果你有两个硬盘,你可以有两个MBR;有三个硬盘,你可以有三个MBR;而BIOS控制着这些硬盘的顺序(第一个活动的硬盘使用其MBR)。因此,每块硬盘只能有一个MBR。Grub stage 1被限制在512字节,因为它必须适应那个第一个扇区(MBR)。Grub的后续阶段存在于文件系统中的文件中。 - guiverc
BIOS只能通过控制哪个驱动器是驱动器=0(或活动的),来控制使用哪个MBR。对于最近的x86_64,UEFI已经取代了MBR。但是MBR是一条简单的引导规则:将寄存器加载为0(sec=0,trk=0,head=0,drive=0);加载该扇区;然后运行加载的代码...没有[安全]验证... - guiverc