为什么BIOS不直接加载Linux内核 - 为什么MBR和所有这些麻烦?



我最近了解了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;-)

希望这能有所帮助,

Janito

最新更新