Bootloader FAQ

来自osdev
跳到导航 跳到搜索

本文可能存在 可能对某些观点来说不平衡。请通过添加有关被忽视的观点信息[1]

此页面旨在回答与编写引导加载程序有关的最常见问题。

GRUB还是自定义引导加载程序?

这是OSDev社区永无止境的论点之一。 没有人能给你一个明确的答案,所以这取决于你对可用选项的权重并下定决心。

GRUB

支持使用GRUB作为引导加载程序的论点是:

  • 你可以避免几乎所有使启动变得复杂的遗留问题 (例如 实模式 分段 A20,大的BIOS中断列表,等等),这样你就可以更快地编写内核和用户空间。
  • 如果你愿意实现Multiboot,那么大多数赞成编写自定义引导加载程序的参数都将无效。

自定义引导加载器

除了 “重做轮子” 综合症和 “喜欢做有趣的事情” 的论点之外,还有一些技术论点赞成做一个自定义的引导加载程序:

  • 更好地控制启动过程。 另请参阅 我的引导加载程序应该支持什么? 对于引导加载程序应该做的事情。提示: GRUB可能其中一半工作都不做。
  • 较少的外部依赖关系,这可能是可取的,因为可以在需要时随时修补内部组件。 这也允许你以自己的速度轻松添加功能到你的引导加载程序。
  • 如果你的OS不像UNIX,则自定义引导加载程序可能会使其更容易集成为OS安装过程的一部分,因为GRUB的安装程序需要某种程度的 “UNIX-ness” 才能工作。
  • 不那么膨胀。 让我们承认,GRUB不仅是引导加载程序,还是引导管理器。 引导加载程序 (应该) 依赖于操作系统,而引导管理器 (应该) 能够链式加载用户选择的任何引导加载程序。 换句话说,这是两个独立的问题。

BIOS还是UEFI?

正文: UEFI#Legacy bootloader or UEFI application?

如何加载内核 (BIOS)?

你可能遵循了一个教程,该教程显示了如何使用BIOS编写打印 “Hello,World!” 的 “引导加载程序”。 现在,你自然会问如何加载内核,这确实是引导加载程序的预期目的。

不幸的是,加载内核并不是一件简单的事情,从 我的引导加载程序应该支持什么? 当然,这些东西不适合你在阶段1中获得的512字节,因此你需要在初始化内核环境之前加载更多扇区。

根据媒体的不同,引导过程的差异化程度足以使每个受支持的媒体具有不同的引导加载程序。 然而,最初,它可能是一个好主意,从一个单一的媒体 (例如cd) 开始,去一个点,在那里初始的内核可以被启动,然后支持更多的媒体。

硬盘

假设一个 MBR 分区的硬盘,BIOS加载并执行主引导记录 (MBR),该主引导记录负责加载并执行活动分区的卷引导记录 (VBR)。 通常,VBR应该简单地从 文件系统 或VBR之后的一些保留扇区 (而不是MBR,请参见 “脚注1”) 进行一些初始检查和加载阶段2。我建议做后者,以免打扰文件系统。 但是,如果你已经决定实现文件系统,请注意,普通文件系统不会为阶段1保留太多空间。 FAT 在这方面可能是最糟糕的,只保留一个扇区 (VBR) 用于进行初始检查,解析文件系统表并加载阶段2。 Ext2 稍微好一些,在VBR之后保留另一个扇区,但是Ext2需要比FAT更多的解析。 或者,如果你愿意,设计你自己的文件系统 (不要在设计和实现VFS之前这样做),其中VBR说在分区的开始有多少扇区被保留,这样你就可以把整个引导加载程序放在那里。

脚注1 : MBR之后和第一个分区之前的空间不应被任何操作系统使用。

脚注2 : 对于 GPT 分区的硬盘,引导过程略有不同,因为保护性主引导记录 (PMBR) 需要知道GPT的存在。

软盘

从软盘启动时,BIOS加载并执行其第一个扇区,该扇区应进行一些初始检查,并在扇区0之后从文件系统或某些保留扇区加载阶段2。

然而,请注意,软盘具有小容量 (通常1.44 MB) 并且缓慢且通常不可靠。 更不用说大多数不到十年的机器都不支持它们。

CDs

对于cd,有 El-Torito规范。 CD具有 ISO-9660文件系统,BIOS从文件系统读取文件并从中执行代码。 如果要求适当,兼容的BIOSes将加载完整文件。 但是,一些较旧的BIOSes可能仍然只能加载第一个扇区 (2048个字节),因此你可能希望将其分为两个阶段; 作为两个文件,或作为同一文件的两个部分,其中从偏移量2048开始的文件的第二部分包含一个由第一部分检查的魔术数。

请注意,你批量购买的cd通常只能刻录一次。 请寻找cd-rws,虽然它比cd-rs贵一点,但允许多次重写,使它们可以用于测试你的操作系统。

USB drives

上次安装Linux发行版时,你可能会将live CD写入USB驱动器并从中启动。 但是,问题在于BIOSes将USB驱动器视为硬盘,因此CD映像需要另外包含有效的MBR,然后由BIOS加载。 现在,与硬盘相比,MBR和第一感兴趣的ISO-9660扇区之间的可用空间可用于阶段2。

Network

网络引导加载程序可以直接从编译它的机器加载内核。 过去15年左右制造的许多 (全部?) 网络芯片组和生物传感器都支持用于网络引导的PXE标准。 你将需要一个tftp (Trivial FTP) 服务器来为你的内核和阶段2引导加载程序提供服务,并且可能需要专门配置合适的DHCP服务器。

我的引导程序应该支持什么?

除了加载内核之外,引导加载程序还必须在将控制权移交给内核之前适当地准备环境。 这可能包括:

  • 检测中央处理器/基本输入输出系统功能。 你需要确保CPU或BIOS支持你使用的任何功能 (例如INT 0x13扩展)。
  • 获取内存映射。 如果你不知道什么内存区域实际上是内存,你甚至会在哪里加载内核?
  • 使用 分页 启用 A20 保护模式 (如果在 x86_64 上运行,则启用 长模式)。 GRUB不启用分页或长模式,但这并不意味着其他引导加载程序也不应该这样做。 在引导加载程序中不启用分页或长模式意味着你需要先验地确定内核将驻留在哪个物理内存区域,这可能会导致两个潜在的后果:
    • 该地址实际上可能没有任何内存;
    • 它使 较高一半内核 变得更加困难,甚至不可能,并且更加混乱。

当你更高级时,你可能还想/需要在引导加载程序中做这些事情:

从最低限度开始加载内核可能是个好主意,然后实现你看到的内核需要的任何东西。 不要尝试匹配现有规范 (例如Multiboot),否则使用现有的引导加载程序 (例如GRUB) 可能会更好。