BIOS/MBR引导过程
无论使用哪种计算机或者操作系统,标准(“ IBM兼容”)台式计算机和笔记本电脑都可以使用以下两种方式之一开机和启动:传统的BIOS-MBR方法和最新的UEFI-GPT方法,最新的较新的PC,笔记本电脑和平板电脑上的Windows,Linux和Mac OS X版本。
本文总结了传统BIOS PC加载操作系统的过程,涵盖了BIOS,MBR和引导程序的基本知识和详细信息。
BIOS/MBR引导过程概述
引导过程分为几个主要组件,每个组件都是一个完全独立的子系统,具有许多不同的选项和变体。
每个组件的实现可能会因硬件和操作系统而有很大差异,但是它们遵循的规则和工作过程始终是相同的。
引导过程的组成部分
BIOS
BIOS是硬件首次与软件相遇的地方,也是所有引导魔术的开始。
BIOS代码被烘焙到PC的主板中,通常存储在所谓的EEPROM 1中,并且与硬件有关。
BIOS是与整个硬件连接的最低软件级别2,并且是引导加载程序和操作系统内核可以与之通信并控制硬件的接口。
通过对BIOS的标准化调用(计算机术语为“中断”),操作系统可以触发BIOS读取和写入磁盘并与其他硬件组件进行接口。
首次启动PC时,会发生很多事情。
PC的电气组件最初负责使计算机正常工作,因为防弹电路会推动我们按下电源按钮并触发一个开关,该开关可激活电源并将电流从PSU引导至主板,并主要通过主板传递至PC的所有各种组件。
当每个单独的组件获得赋予生命的电力时,它就会上电并在线恢复其初始状态。
诸如内存和PSU之类的简单组件的启动例程和整体功能通过一系列逻辑电路(AND/NAND和OR/NOR门)硬连线到它们中,而诸如显卡之类的更复杂的部件则具有自己的微控制器。
充当微型CPU,控制硬件并与PC的其余部分进行接口,以委派和监督工作。
开机自检过程
PC开机后,BIOS将作为POST(开机自检)过程的一部分开始工作。
它将PC的所有各个部分桥接在一起,并根据需要在它们之间进行接口,将视频显示设置为接受基本的VGA并将其显示在屏幕上,初始化存储库并为CPU提供对所有硬件的访问权限。
它会扫描IO总线以查找连接的硬件,并识别并映射对已连接到PC的硬盘的访问。
较新主板上的BIOS足够智能,甚至可以识别和识别USB设备(例如外部驱动器和USB鼠标),使我们可以从U盘启动,并在旧版软件中使用鼠标。
在POST过程中,将在可能的情况下进行快速测试,并且经常发现由硬件不兼容,设备断开连接或者组件故障引起的错误。
是由BIOS引起的各种错误消息,例如“键盘错误或者不存在键盘”或者有关内存不匹配/无法识别的警告。
至此,BIOS的大部分工作已经完成,几乎可以进入启动过程的下一个阶段了。
剩下的唯一事情就是运行所谓的“添加ROM”:某些连接到主板的硬件可能需要用户干预才能完成其初始化,而BIOS实际上将整个PC的控制权转交给了编码为硬件的软件例程,例如显卡或者RAID控制器。
他们承担了对计算机及其显示器的控制,并允许我们在PC真正完成加电之前执行诸如设置RAID阵列或者配置显示设置之类的操作。
完成执行后,他们将计算机的控制权交还给BIOS,然后PC进入基本的可用状态,可以开始使用了。
BIOS引导移交
在配置了PC的基本输入和输出设备之后,BIOS现在进入最后阶段,该阶段仍由计算机控制。
在这一点上,通常会为我们提供一个选项,可以快速按一个键进入BIOS设置程序,我们可以其中配置硬件设置并控制PC的启动方式。
如果我们不选择任何内容,BIOS将使用默认设置开始第一步,实际上是“引导”PC。
前面我们提到过,BIOS工作的重要部分是检测和映射已连接的硬盘。
该列表现在派上用场了,因为BIOS会将一个很小的程序从第一个硬盘加载到内存中,并告诉CPU执行其内容,将计算机的控制权移交给硬盘驱动器上的任何内容,并结束其活动状态在加载PC中扮演的角色。
该硬盘驱动器称为“启动设备”,“启动磁盘”或者“驱动器0”,通常可以在BIOS设置程序中进行选择或者设置。
引导设备
无论将BIOS配置为从本地硬盘引导还是从可移动USB引导引导,切换顺序都是相同的。
完成BIOS POST和AddOn ROM过程后,BIOS从所选引导设备的硬盘驱动器中加载前512个字节,这512个字节通常称为MBR或者主引导记录。
主启动记录(MBR)
MBR是基于BIOS的计算机引导过程中软件方面的第一个也是最重要的组件。
每个硬盘都有一个MBR,其中包含一些重要的信息。
分区表
首先,MBR包含一个称为分区表的东西,如果有的话,它是同一磁盘上最多四个分区的索引。
没有它(例如软盘上的磁盘),整个磁盘只能包含一个分区,这意味着我们不能在同一驱动器上拥有不同的文件系统之类的东西,这又意味着我们永远无法在Linux上安装Linux和Windows。
例如同一张磁盘。
引导代码
其次,MBR还包含非常重要的一部分代码,称为“引导代码”。
这512个字节中的第一个4403可以包含BIOS加载它并按原样执行其内容的所有内容,从而启动引导加载程序。
440字节非常小。
多么小?
好吧,总的来说,440字节仅是古老的1.44 MiB软盘容量的0.3%,不足以容纳任何形式的有用代码和方式,太小了,无法完成像调用操作系统那样复杂的操作磁盘中的内核。
鉴于MBR的引导程序代码段很小,它真正服务的唯一有用的目的是从磁盘上查找另一个文件并加载该文件以执行实际的引导过程。
这样,该引导程序代码通常被称为“第一阶段引导程序”。
取决于操作系统,引导程序代码搜索“ stage 2 bootloader”的确切位置可以更改,但是在Windows上,stage 1 bootloader将在MBR分区表中搜索标记为“活动”的分区,即MBR-表示“可启动”,表示分区的开始在其启动扇区(也称为“启动扇区”)中包含启动代码的下一部分。
在正确创建的MBR磁盘上,一次只能将一个分区标记为活动的。
4
因此,MBR中引导代码段的工作非常简单:从分区表中查找活动分区,并将该代码加载到内存中,以供CPU执行,作为引导链中的下一个链接。
根据所加载的操作系统,它实际上可能会查找硬编码分区而不是活动分区(例如,始终加载第三个分区的引导扇区),并且分区引导扇区内的启动代码偏移可能会更改(例如,而不是分区的第一个2 KiB,它可能是第二个KiB或者从月球当前相位的第二个倍数开始的6 KiB),但基本概念保持不变。
但是,出于遗留兼容性的原因,MBR几乎总是加载活动分区的第一个扇区,即仅加载另一个512字节。
boot签名
在IBM兼容PC(基本上是所有设备)上,512字节MBR的最后两个字节称为引导签名,BIOS用来确定所选的引导驱动器是否可引导。
在包含有效引导程序代码的磁盘上,MBR的最后两个字节应始终为0x55 0xAA.5如果MBR的最后两个字节分别不等于0x55和0xAA,则BIOS将假定该磁盘不可引导,并且是在这种情况下不是有效的引导选项,它将退回到引导顺序列表中的下一个设备(在BIOS设置中配置)。
例如,如果将BIOS中的第一个引导设备设置为U盘,第二个是本地硬盘,则如果插入没有正确引导签名的U盘,BIOS将跳过它并继续尝试操作。
从本地磁盘加载。
如果引导设备列表中没有磁盘具有正确的0x55 0xAA引导签名,则BIOS将显示错误,例如臭名昭著的“没有可用的引导设备”或者“重新引导并选择正确的引导设备”。
分区引导扇区
如上所述,MBR中的引导程序代码通常会从活动分区的开头加载一系列字节。
分区的确切布局取决于创建或者格式化该分区所使用的文件系统,但是通常看起来像这样:
同样,取决于操作系统和文件系统,分区的确切布局肯定会有所不同。
但这与我们通常看到的内容非常接近:
- 一条JMP(跳转)指令,与goto命令的assembly6等效。
- 文件系统标头,它将包含特定于文件系统本身且对文件系统重要的信息。
- 另一个引导程序代码段,包含引导加载程序过程的下一个阶段。
- 扇区结束标记,与我们在MBR前面看到的0x55 0xAA引导签名非常相似。
这些通常都打包在分区的第一个扇区中,该分区通常又只有512个字节长,并且又一次不能容纳太多数据或者指令。
在用于较新操作系统的现代文件系统上,引导程序代码可以利用增强的BIOS功能来读取和执行512个字节以上的字节,但是在所有情况下,基本步骤均保持不变:
- MBR将活动分区的前512个字节加载到内存中,并指示CPU执行它们。
- 分区引导程序的头三个字节包含一个JMP指令,告诉CPU跳过xx个字节,然后从那里执行引导加载程序的下一个阶段。
- CPU遵循JMP指令,并查找分区引导扇区中包含的引导程序代码的开头,然后开始执行。
分区中的引导程序代码并不是路途的尽头,而是整个过程的又一步。
由于为分区引导扇区中的引导程序代码分配了很少的空间,因此该代码中包含的代码通常以另一个JMP命令结 tail,该命令指示CPU跳转到分区中的下一个扇区,该扇区通常留给分区的其余部分代码。
根据文件系统的不同,它的长度可以是几个扇区,或者要适合引导加载程序的这一阶段,它需要很长的扇区。
第二阶段引导程序
引导加载程序的第二阶段存储在引导程序部分的分区引导扇区中,并且可以选择继续进行下去,执行引导加载程序过程的下一步:它查找存储在分区本身上的文件(作为常规文件) ,并告诉CPU执行其内容以开始引导过程的最后一部分。
与MBR和分区引导程序的先前引导程序段不同,引导过程的下一步不是存储在分区内的专用偏移处(即,引导程序代码不能仅告诉CPU JMP到位置0xABC并执行该操作)。
引导文件),它是存储在磁盘文件系统中的其他普通文件中的普通文件。
这个复杂得多的引导程序代码实际上必须读取分区上文件系统的目录表。
7来自较旧文件系统版本的第二阶段引导加载程序通常对它们需要加载的引导加载程序文件设置了复杂的限制,例如要求它们出现在分区的前几千字节中,或者无法在分区上加载非连续分配的文件。
该文件是引导程序难题的最后一部分,通常对其大小或者内容没有任何限制,这意味着它可以从磁盘加载操作系统内核并继续进行传输时,可以变得既大又复杂。
PC到OS的控制。
引导加载程序
磁盘上实际的引导加载程序文件构成引导加载过程的最后部分。
当人们谈论引导加载程序和引导文件时,他们通常指的是引导过程的最后一个关键步骤。
一旦将PC的控制权从BIOS转移到MBR中的引导程序代码,再从MBR转移到分区引导程序中的引导程序代码,再从那里转移到活动分区上的可执行启动文件,则实际逻辑涉及确定要加载哪个操作系统,从其中加载它,将哪些参数/选项传递给它,以及完成与用户的任何可能的交互,启动操作系统的实际过程就开始了。
引导配置文件
虽然可执行的Bootloader文件理论上可以包含与要从磁盘加载的操作系统有关的硬编码信息,但那根本不是很有用。
这样,几乎所有引导加载程序都会将实际的可执行引导加载程序与包含有关要加载的操作系统信息的配置文件或者数据库分开。
下文提到的所有主要的引导加载程序均支持加载多个操作系统,该过程称为“双重引导”或者“多重引导”。
流行的引导程序
如前所述,那里有许多不同的引导程序。
每个操作系统都有自己的引导加载程序,专门用于读取其文件系统并找到需要加载才能运行OS的内核。
以下是一些常见操作系统的一些最受欢迎的引导程序及其必要的配置文件:
每个流行的操作系统都有其自己的默认引导程序。
Windows NT,2000和XP以及Windows Server 2000和Windows Server 2003使用NTLDR引导加载程序。
Windows Vista引入了BOOTMGR引导加载程序,目前Windows Vista,7、8和10以及Windows Server 2008和2012都使用该引导加载程序。
尽管这些年来Linux已经存在许多不同的引导加载程序,但两个主要的引导加载程序是Lilo和。
GRUB,但是现在大多数Linux发行版都围绕功能强大的GRUB2引导加载程序合并在一起。
NTLDR
NTLDR是旧的Windows引导程序,首先在Windows NT中使用(因此“ NTLDR”中的“ NT”,是“ NT Loader”的缩写),当前在Windows NT,Windows 2000,Windows XP和Windows Server 2003中使用。
NTLDR将其启动配置存储在一个名为BOOT.INI的简单基于文本的文件中,该文件存储在活动分区的根目录(通常为C:\Boot.ini)中。
一旦NTLDR由第二阶段的引导程序加载并执行,它就会执行一个称为NTDETECT.COM的帮助程序,该程序可以识别硬件并生成有关系统信息的索引。
有关NTLDR,BOOT.INI和NTDETECT.COM的更多信息,请参见我们知识库中的链接文章。
BOOTMGR
BOOTMGR是Microsoft Windows使用的引导加载程序的较新版本,它首先在Windows Vista的Beta版中(然后称为Windows代号Longhorn)引入。
它目前在Windows Vista,Windows 7,Windows 8,Windows 8.1和Windows 10以及Windows Server 2008和Windows Server 2012中使用。
BOOTMGR标志着与NTLDR的重大偏离。
它是一个自包含的自举程序,具有更多选项,特别是为了与现代操作系统中的较新功能兼容而设计,并且考虑到EFI和GPT的要求(尽管只有某些版本的BOOTMGR支持从GPT磁盘或者UEFI中加载Windows。
/EFI配置)。
与NTLDR不同,BOOTMGR将其配置存储在一个名为BCD的文件中-BCD是启动配置数据库的缩写。
与BOOT.INI不同,BCD文件是无法手动打开和编辑的二进制数据库。
8相反,必须使用经过专门设计的命令行工具(例如bcdedit.exe)和更加用户友好的GUI实用程序(例如EasyBCD)来读取和编辑BCD文件。
修改操作系统列表。
GRUB
GRUB是1990年代和2000年代初期用于Linux的主要引导程序,其设计不仅可以装载Linux,还可以装载任何为其内检查确认现开放式多重引导规范的操作系统。
GRUB的配置文件包含空格格式的操作系统列表,通常称为menu.lst或者grub.lst,位于/boot /或者/boot/grub /目录下。
由于可以通过使用不同的选项重新编译GRUB来更改这些值,因此不同的Linux发行版在不同目录中的不同名称下都有该文件。
GRUB 2
尽管GRUB最终击败了Lilo和eLilo,但在2002年左右将其替换为GRUB 2,而旧的GRUB正式更名为“ Legacy GRUB”。
令人困惑的是,GRUB 2现在正式称为GRUB,而旧的GRUB正式降级为“ Legacy GRUB”的名称,但是值得庆幸的是,我们会在网上找到大多数资源,这些资源将GRUB引导加载程序的更新版本称为GRUB 2.
GRUB 2是功能强大的模块化引导加载程序,与引导加载程序相比,它更类似于操作系统。
它可以加载许多不同的操作系统,并支持自定义插件(“模块”)以引入更多功能并支持复杂的启动过程。
GRUB 2的实际引导程序文件不是名为GRUB2的文件,而是通常称为core.img的文件。
与旧版GRUB不同,GRUB 2配置文件更多是脚本,而不是传统配置文件。
grub.cfg文件通常位于引导分区上的/boot/grub/grub.cfg中,与shell脚本相似,并且支持诸如功能之类的高级概念。
GRUB 2的核心功能是由模块补充的,这些模块通常位于/boot/grub /目录的子目录中。
引导过程
如前所述,引导过程的阶段比前面的步骤要复杂得多,这主要是由于读取文件系统的另外复杂性所致。
引导加载程序还必须(通过BIOS或者通过其自身)获取有关基础计算机硬件的信息,以便从正确的分区正确加载所需的操作系统,并提供可能需要的任何其他文件或者数据。
它还必须从存储在引导分区文件系统中的常规文件中读取其自己的配置文件,因此它至少需要对驻留在其上的任何文件系统具有完全读取的支持。
- 启动文件系统访问
在发生其他任何事情之前,首次运行引导加载程序时,它必须加载并运行原始文件系统“驱动程序”,使它至少能够读取其所在的文件系统。由于在此之前它无法读取文件系统,因此必须将提供此功能的代码编译到核心Bootloader文件本身中。 - 加载和读取配置文件
通过支持加载的文件系统,引导加载程序现在可以从磁盘读取操作系统列表,并且如果指定了多个操作系统,则可以对其进行显示准备。 - 加载并运行支持模块
对于不完全独立的引导加载程序(例如NTLDR和GRUB 2),该引导加载程序现在从磁盘加载任何支持模块或者帮助程序(例如NTDETECT.COM)。可以在刚刚读取或者硬编码/编译到引导加载程序本身的配置文件中指定要加载的模块列表。通常,每个模块都会在其定位并从磁盘加载后执行。 - 显示启动菜单
此时,有了所有相关的配置,引导加载程序就可以在屏幕上显示通常称为引导菜单的内容。如果安装了多个操作系统,则计算机的用户可以通过引导菜单浏览操作系统列表并选择要加载的操作系统。从其中某些引导加载程序还可以指定运行时选项,例如是否以安全模式加载选定的操作系统。 - 加载操作系统内核
记录用户的选择后,引导加载程序将进入引导过程的最后一个阶段。取决于操作系统和内核类型,引导程序会从配置文件中指定的路径(如果需要,在任何子模块的帮助下)将内核镜像加载到内存中。然后,它指示CPU将JMP迁移到新加载的内核中的某个位置,然后从那里开始执行。