我读到计算机通过搜索每个连接设备的前 512 KB 来加载操作系统。如果该内存空间充当引导扇区,它将开始加载其后的内存空间。
根据这篇文章:https://www.gnu.org/software/grub/manual/multiboot/multiboot.html
同一硬盘上的多个操作系统执行“链接”。现在,如果它们都在同一硬盘上,机器如何知道在跳转多少次后它会找到另一个引导扇区。
什么是链接
答案1
我读到计算机通过搜索每个连接设备的前 512 KB 来加载操作系统。
PC BIOS 会执行此操作 - 并且它不一定会访问每个连接的设备,只访问它知道如何读取并且配置为从设置中读取的设备。
采用较新 UEFI 标准的 PC 可以直接从硬盘上的 EFI 分区加载文件。传统上,BIOS 不理解 NTFS 或 FAT 等文件系统,但 UEFI 更智能一些,实际上可以从设备读取文件。
对于 BIOS 来说,加载的从来不是一个完整的操作系统,而是一个小程序,第一阶段引导加载程序。第一阶段的引导加载程序可能会加载完整的操作系统,但实际上仅限于 DOS 或其他非常简单的操作系统。
通常发生的情况是,第一阶段引导加载程序继续加载第二阶段引导加载程序,该引导加载程序可以是旧的 NT/XP NTLDR
、Windows Vista+ 引导加载程序winload.exe
或 GRUB。
引导加载程序(第二阶段及以上)的功能比 BIOS 还要多,因此它们会读取配置文件或数据,并向您提供要引导哪个操作系统的菜单。一旦操作系统加载完毕,引导加载程序就会被覆盖。
链式是引导加载程序调用另一个引导加载程序的地方。由于 Windows 仅使用其自己的引导加载程序进行引导,因此如果您安装了 GRUB,GRUB 加载 Windows 时所做的就是继续加载 BIOS 本来会加载的第一阶段引导加载程序。我相信,它存储在其分区的第一个扇区中。DOS 也是如此。
如果 GRUB 可以直接启动操作系统,则不需要这样做,对于任何 Linux 来说,它都可以。与其他操作系统不同,Linux 并不太关心其自身及其 initramdisk 如何进入内存。
UEFI 可以直接加载操作系统,但据我所知,Windows 不支持此功能,因此通常 UEFI 系统直接加载winload.exe
并运行它。
其他非 PC 引导程序(如 U-Boot)(您的家用路由器可能运行的程序)了解 FAT 和 Linux 文件系统并直接从它们加载 Linux,然后直接启动操作系统。
答案2
我读到计算机通过搜索每个连接设备的前 512 KB 来加载操作系统。
几乎正确。PC 风格的硬件读取第一个扇区,即 512 字节。(不是千字节)。
如果该空间充当引导扇区,它将开始加载其后的空间。
也几乎正确。经典主板固件包含称为 BIOS 的东西。当 PC 启动时,它会被执行。它的任务之一是将控制权移交给另一个设备(例如软盘驱动器)。
更高级的版本不只支持单个设备,而是会检查多个设备,如果其中一个设备无法提供启动解决方案,则转到下一个设备。例如,它可以尝试从软盘启动,如果失败,则转到尝试从 CD 启动,如果失败,则尝试从第一个硬盘启动。(其中第一的如果您有多个磁盘,这也很有趣)。
大多数情况下,它会读取硬盘的第一个扇区。硬盘通常有一个分区方案(IBM 兼容 PC 的 MBR)和一些启动代码。然后它会遵循加载程序链。
例如,固件将加载单个引导扇区并启动其中的代码。
从该扇区读取的代码将更多地了解磁盘并加载更大的程序。(如果需要,可以重复更多阶段)。
同一硬盘上多个操作系统进行“链接”。
操作系统不执行链接。但是,如果您的后续阶段之一是高级引导加载程序(例如 grub),那么它可以要求用户输入,并根据输入以不同的方式继续。例如,它可以加载 Linux 内核,也可以加载并启动 NTloader。