Windows XP在引导过程中将经历预引导、引导和加载内核三个阶段.在 Windows 的较早版本中,引导文件boot.ini是系统文件,它包含有关计算机上安装的 Windows *** 作系统的信息。当您打开计算机时,在启动的过程中显示该信息。它在多重引导配置中或者对于需要自定义 Windows 启动方式的高级用户或管理员最有用。
当系统首次引导时,或系统被重置时,处理器会执行一个位于已知位置处的代码。在个人计算机(PC)中,这个位置在基本输入/输出系统(BIOS)中,它保存在主板上的闪存中。嵌入式系统中的中央处理单元(CPU)会调用这个重置向量来启动一个位于闪存/ROM 中的已知地址处的程序。在这两种情况下,结果都是相同的。因为 PC 提供了很多灵活性,BIOS 必须确定要使用哪个设备来引导系统。
当找到一个引导设备之后,第一阶段的引导加载程序就被装入 RAM 并执行。这个引导加载程序在大小上小于 512字节(一个扇区),其作用是加载第二阶段的引导加载程序。
当第二阶段的引导加载程序被装入 RAM 并执行时,通常会显示一个动画屏幕,并将 Linux 和一个可选的初始 RAM磁盘(临时根文件系统)加载到内存中。在加载映像时,第二阶段的引导加载程序就会将控制权交给内核映像,然后内核就可以进行解压和初始化了。在这个阶段中,第二阶段的引导加载程序会检测系统硬件、枚举系统链接的硬件设备、挂载根设备,然后加载必要的内核模块。完成这些 *** 作之后启动第一个用户空间程序(init),并执行高级系统初始化工作。
这就是 Linux 引导的整个过程。
第一步:预引导按下电源开关后,到启动Windows XP之前的这段时间称为预引导阶段。首先计算机会运行自检过程,也就是POST(Power On Self Test,开机自检),检测项目包括内存大小和其他硬件设备的状况,在启动时的能源之星画面中的大堆参数就是自检的结果了。然后,计算机的BIOS(Basic Input/Output System,基本输入输出系统)进行一些必要的硬件配置,就根据设定好的引导顺序查询设备,一般情况下是找到第一块硬盘,然后找到MBR(Main Boot Recorder,主引导记录,大约在主分区的第一个物理扇区,和分区表一起共512KB),根据MBR中保存的地址载入引导程序(也称为加载器),引导程序包括Windows XP自带的OS Loader或者Linux下的LILO、GRUB等,Windows XP的引导程序文件名为NTLDR。
第二步:引导
NTLDR获得控制权之后,会将原来的实模式转换为32位平面内存模式。在实模式中,系统为MS-DOS保留640KB内存,其余内存视为扩展内存而在32位平面内存模式中,系统(Windows XP)视所有内存为可用内存。接着,NTLDR启动内建的mini-file system drivers(迷你文件系统驱动),这样NTLDR就能识别每个NTFS或者FAT文件系统的分区,这样就能顺利地加载可能位于各个分区中的Windows XP。其实在此过程中还有一步,就是“考虑”究竟该启动谁,它会询问一下主分区根目录下的boot.ini,如果boot.ini告诉它只有一个系统在XXX位置,NTLDR当然会直接启动系统,而如果有双系统,则NTLDR会显示一个启动菜单供选择。
第三步:加载内核
在加载内核阶段,ntldr加载ntokrnl.exe(仅仅是加载,并不初始化),这个文件即为 *** 作系统的内核,然后ntldr加载硬件抽象层HAL(文件为hal.dll),接着系统加载注册表中[HKEY_LOCAL_MACHINE\system],NTLDR读取其下的“select”键值来决定哪一个“Control Set”分支中的设置数据将被加载(各个“Control Set”分支包含需要加载哪些设备驱动程序以及需要加载的服务的信息)。NTLDR加载[HKEY_LOCAL_MACHINE\system\service]下“start”键值为0的底层设备驱动。当Current Control Set(其实就是各个Control Set分支中被采用的那个分支的拷贝)全加载完后,ntldr就交出了控制权,接力赛中的内核选手上场了。
第四步:初始化内核
现在你应该能看到彩色的Windows XP Logo和底下的滚动条了。系统这时会加载各种设备驱动以及系统服务,以及完成一些准备工作,比如有一个挺有名的技巧就是修改注册表中的预读文件参数来提高启动速度,这也是这个阶段的一项工作。
最后就是系统里某些安装软件自启动加载项。
一般来说,当电脑启动时,它所执行的第一条指令并不是来自安装在硬盘上的 *** 作系统。换句话说,要想启动我们熟悉的 *** 作系统,电脑需要首先启动一个预程序。完成这一 *** 作的就是引导程序(Bootloader)。
引导程序通常很小,甚至只是预先写死在 ROM 中的几条指令。在机器接收到启动信号时,引导程序指挥机器去完成配置硬件、寻找系统等一系列 *** 作。
通常,我们可以根据启动顺序,把引导程序大致分为两类:
顾名思义,这种引导程序更底层,往往是预置在主板中,我们无法进行更改的。我们经常用到的 BIOS(严格来说我们常用到是 BIOS 设置界面,但是在交流中我们经常把设置界面和 BIOS 程序本身划等号,这里自然指的是 BIOS 程序)在电脑中就是扮演这个角色。折腾过电脑的人可能有过这样的经验,无论电脑是否连接了硬盘,都可以正常进入 BIOS;实际上,更多数遇到的情况是硬盘突然崩了导致开机无法进入系统而自动进入了 BIOS。可见,BIOS 程序的启动与硬盘无关。
当电脑启动了 BIOS 后,电脑便开始在硬盘上寻找 *** 作系统了。在硬盘茫茫文件中,电脑是如何精确定位到系统文件的呢?这时就需要硬盘上的二级引导程序。
为了讲清二级引导程序,我们需要首先了解几个关于硬盘的概念。
引导记录,通常指主引导记录(MBR),既可以指一种在硬盘最开始扇区寻找引导程序的引导方式,又可以指在硬盘最开始的一部分扇区中存放的记录分区、引导等重要信息的数据。不过为了方便理解,我个人习惯把引导方式称为“MBR 引导”,把负责记录引导的相关扇区称为“主引导记录(MBR)”,而负责记录分区的称为“分区表”。
硬盘的分区我想大家应该都能理解,所谓分区表就是指硬盘的分区方式,相关数据通常存在硬盘最开始的一部分扇区中。
这里,分区表又分为两种类型:
顾名思义,即以 MBR 方式进行分区的分区表类型。在这种方式中,硬盘前部的 64 个扇区存放分区表。由于每个主分区都需要 16 个扇区记录分区信息,所以 MBR 分区表类型下只能划分出 4 个主分区。若想划分更多的分区,只能牺牲最后一个主分区用作扩展分区,进而划分逻辑分区。
在这种分区下, 引导信息写在硬盘前部扇区的 MBR 中,而不是硬盘分区内。 由于扇区大小的限制,引导扇区中的引导程序不能太长。通常情况下都是在引导扇区中写入一个简单的引导程序,再指引电脑在硬盘分区执行下一步的引导程序。
GUID 是全局唯一标识分区表(GUID Partition Table)的缩写,这是为了替代 MBR 分区表而发布的一个新的标准。在这种分区表类型下,硬盘的容量不再限制于 4TB。同时,GUID 是 EFI(Extensible Firmware Interface,可扩展固件接口)标准中的一部分,在这种分区表类型下电脑采用了之后会提到的 EFI 执行程序的方式引导系统。
为了简化理解,我们可以大致总结出如下的对应关系。
: MBR 分区表类型——扇区引导——适用于 BIOS(LEGACY)启动
: GPT 分区表类型——分区引导——适用于 UEFI 模式启动
在 MBR 分区表类型中,BIOS 首先搜寻硬盘的引导扇区,在扇区中执行存放的引导指令,指令通常指向并启动硬盘中引导分区内的引导程序,进而启动系统。
而在 GPT 分区表类型中,电脑会在 EFI 引导分区(ESP 分区)中寻找 EFI 可执行程序,通常为 Bootx64.efi 或者 Bootia32.efi,这个程序会指向引导程序对应的执行文件,进而引导系统。
目前来看,UEFI 是主流趋势,BIOS 引导方式已经渐渐淡出了市场。不过由于 BIOS 引导年代流传下来了很多功能强大的工具,仍然有一些用户喜欢用 BIOS 方式引导系统(私人维修店的无良商家居多)。目前市场主流的主板都是符合 UEFI 标准并兼容 BIOS 启动方式的。
对于 Windows 电脑来说,这显然时最常见的引导方式。这种引导方式的主引导记录(MBR)为 Windows NT,直接搜索并启动第一个激活的分区。
电脑启动时,BOOTMGR 会搜索分区中的 bootmgr 内核文件(legacy 下为 ntldr),这个文件会继续按照 BCD 文件设置的系统参数启动系统。
Grub 是开源组织 GNU Project 开发的一个类 Unix 引导系统,通过配置.cfg 文件可以引导多种系统内核。目前大多数 Linux 系统都是用 Grub 作为引导方式。目前 Grub 有以下几个常用的分支:
基于 Grub 的一个魔改版,顾名思义,Grub4Dos 是为了兼容 DOS *** 作而生。因为其强大的图形界面定制和多系统引导功能,在盗版 DVD 年代广为受中国玩家欢迎,那个年代的各种系统修复 PE 工具箱基本都是用 Grub4Dos 编写的。
但是,Grub4Dos 有个致命的缺陷,那就是它不支持 EFI 启动,这也是为什么一些习惯使用 Grub4Dos 工具箱的私人维修店无良奸商在这个 EFI 主流的年代还会把 Windows 装成 BIOS 引导启动。
GNU 团队开发的第二代 Gurb,目前 Github 上很多大神还在日常维护。很多不懂洋文的人总是以为 Grub2 是 2 代,Grub4Dos 是 4 代所以 Grub4Dos 要比 Grub2 强大,显然这种刻板印象是可笑的。事实上,Grub2 是笔者目前见过功能最强大的引导程序。兼容 BIOS 和 EFI 两种启动方式,基本能够引导现在所有的 *** 作系统,非常适合作为 U 盘引导工具。
玩过黑苹果的人一定不会对 Clover 陌生,除了引导 OS X 以外,它支持 BIOS 和 EFI 两种启动模式下引导 Windows、Linux 系统。Clover 的强大之处在于对 OS X 驱动的配置上,针对不同的机型玩家的可 *** 作性很大。不过相比较 Gurb2 而言,Clover 更适合作为电脑系统引导,做 U 盘引导工具就要逊色于 Grub2 了。
syslinux 对于 Linux 系统的引导功能还是很强大的,不过似乎很少有人会去折腾 syslinux 的多系统启动,多是模块化之后在 Grub2 中用命令调用。
除此之外,可能还有 rEFInd、WEE、Plop 等引导程序,因为比较小众,在这里不做介绍了。
目前来说,EFI 引导方式是主流,不管是多系统启动还是引导修复,EFI 都要比 BIOS 简单方便许多。对于有多系统需要的玩家,EFI+Grub2 是一个比较完善的解决方案。
参考链接:
Comparison of boot loaders
: https://en.wikipedia.org/wiki/Comparison_of_boot_loaders
GNU GRUB
: https://www.gnu.org/software/grub/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)