我最近了解了 Linux 的引导过程。我不禁想知道为什么我们会在 BIOS 之后遇到访问 MBR 的麻烦,以便那里的指令可以反过来将内核加载到 RAM 中。
为什么是中间人——为什么 BIOS 不直接加载内核?
我最近了解了 Linux 的引导过程。我不禁想知道为什么我们会在 BIOS 之后遇到访问 MBR 的麻烦,以便那里的指令可以反过来将内核加载到 RAM 中。
为什么是中间人——为什么 BIOS 不直接加载内核?
引导被设计为一个多阶段的过程。每个阶段都知道足以加载下一个阶段。这使每个阶段都保持简单,并使升级尽可能轻松(想象一下在安装新操作系统时需要重新编程您的 BIOS)。
也许更重要的是,它使整个过程尽可能地与平台无关。您可以用新的平台或实现替换链中的任何步骤,并且该过程的其余部分应该仍然有效。如果 BIOS 直接加载操作系统,它必须理解并能够解释文件系统、引导加载程序、操作系统在磁盘上存储组件的方式、需要加载哪些组件等。这需要完成对于每个操作系统、文件系统、引导加载程序等。如果创建了一个新的文件系统(例如),除非您重新编程 BIOS 以理解它,否则您将无法使用它。由于大多数 BIOS 源代码不公开,这将使开发文件系统和操作系统变得极其困难。
要考虑的另一件事是,虽然升级 BIOS 以获得对新事物的支持是很可能的,但人们会尽量避免这种情况。如果您在重新刷新 BIOS 时遇到任何问题,那么您很有可能最终导致系统损坏且无法恢复。避免需要刷新 BIOS 的最简单方法是保持它非常简单,以至于它非常通用以至于不需要升级(尽管有错误修复)。
因为否则任何时候您使用不同的磁盘或文件系统都需要重写 BIOS 中的说明。MBR 是代表 BIOS 处理该问题的中介,它知道操作系统的去向。
为了让 BIOS 能够加载 Linux,它必须了解其分区和文件系统的格式。后者会对 /boot 文件系统可能具有的文件系统施加很多限制。因此,为了保持 BIOS 最小化(B 代表 Basic :D)并让操作系统独立发展,BIOS 仅加载引导介质的前 512 个字节。
尽管它应该在它应该做的事情上“简单”(初始化、配置和对系统进行基本的健全性测试),但 BIOS 至少应该具有一定程度的灵活性。因此,它被设计为:
A) 允许用户/系统管理员配置一些硬件功能。这就是为什么会出现“按 DEL 进入设置”消息的原因。通常,默认值针对您的系统进行了优化,但一些配置选项包括 CPU 时钟、内存延迟、外设中断等。
B) 为一些琐碎的东西提供一个最小的基本 API,比如打印到屏幕上。这在今天很少使用,因为操作系统重新定义了自己的例程来做同样的事情,并且通常以更专业的方式(例如支持更高分辨率的图形驱动程序)
C) 从不同的媒体(CD-ROM、USB 闪存、不同的硬盘等)引导不同的操作系统
最后一项是 MBR 存在的原因。它是一种标准形式,用于列出驱动器上的主分区(允许多个操作系统存在于同一驱动器上)以及应执行哪些代码来加载和启动操作系统(此代码称为引导加载程序)。
无论如何,至少这就是“旧版”BIOS 以它的方式工作的原因。这正逐渐被淘汰,取而代之的是一种称为 UEFI 的新初始化固件(至少对于 x86 和 x86-64 而言),它支持更大的灵活性。
最后,您可以直接加载内核。看看 Coreboot 项目 (www.coreboot.org),它进行最少的初始化,然后加载一个有效负载,它可能是内核,也可能是标准的“旧版”BIOS ;-)
希望这可以帮助,
贾尼托