这可能是特定于操作系统的,我不确定(我正在使用 Linux)。当 BIOS 将引导加载程序带入内存并且 CPU 开始执行它时,它如何定位操作系统?它是否存储在特殊的磁盘分区/知名扇区等中?如果它存储在文件系统上,那么引导加载程序需要与存储在操作系统中的文件系统代码进行交互。这个先有鸡的问题是如何解决的?
2 回答
引导加载程序分为几个部分。首先,BIOS 获取一些与一种非常特殊的格式相匹配的代码,称为 MBR(主引导记录)。记住您的旧计算机:您必须告诉 BIOS 它将按什么顺序浏览某些设备以搜索该 MBR。一旦它找到一个 MBR(MBR 长 512 字节,以一个幻数 - 结尾0x55aa
),它会在物理内存中的给定偏移处复制这段代码(0x7c00
在 x86 上),并将指令指针设置为该地址。大多数时候,MBR 包含一个分区表,并且会从设备中加载一些额外的代码来帮助加载实际系统:这被称为链加载或多阶段加载。
让我们详细说明最后一点。请记住,系统在此时以实模式运行,因此您只能访问 1MB 的物理内存,但另一方面,您可以通过BIOS 中断调用以非常简单的方式访问您的硬盘。如今,操作系统要求的内存比 1MB 多得多,并且他们希望将处理器切换到保护模式,以便访问完整的地址空间(4GB,至少在 32 位系统上)。但是一旦系统处于保护模式,BIOS 中断调用就不再可用,并且与 HDD 的输入/输出必须通过复杂的设置通信,例如DMA,并且该设置通常不会发生在引导加载程序中。引导加载程序将从实模式来回切换到保护模式。它从 HDD 获取一个扇区到 1MB 地址空间,然后切换到保护模式以将该扇区复制到某个位置到 4GB 地址空间中,最后它切换回实模式以获取另一个扇区硬盘。一旦所有扇区都被提取并复制到物理内存中,引导加载程序就会跳转到操作系统。
总结一下:
- BIOS 在设备列表中查找位于每个设备第一个扇区的 MBR。如果第一个扇区的最后一个 halword 匹配一个幻数,则找到一个 MBR。BIOS 将 MBR 复制到物理内存,然后跳转到它。
- MBR 嵌入了一个分区表,因此它知道应该从哪个位置(基本上是 HDD 的哪个柱面扇区)将更多代码加载到物理内存。例如,此步骤可能是加载 GRUB。
- 假设在 GRUB 中,
multiboot
规范用于定位操作系统。检查下面的链接以获取更多信息multiboot
。
您可能想看看这些资源: