前言

安装系统是计算机专业的日经操作,然而就算你是身经百战,也可能会遇到各种各样棘手的问题,对系统的启动流程也是似懂非懂(俺也一样),每次碰到问题都会花去大量的时间去查询解决方案,最后很多时候都免不了进PE,清硬盘,再重装。也没有看到一个系统、全面讲解这方面知识的博客或者书籍,从网上各个地方搜集的资料都太零散,不成系统,因此这里开一篇博文记录和分析平时系统安装的心得经验和里面的计算机基础知识,并保存一些很有价值的博文资料链接,文中或许有很多理解错误或者不当之处,请读者批评指正,或者读者对安装系统过程中的什么问题存在疑问,也可以留言大家一起解答。

系统的启动过程

BIOS Legacy和UEFI是大家安装系统时经常见到的两个名词,这代表着两种不同的系统引导技术,前者旧,后者新,且BIOS Legacy在不断被淘汰中,新的主板几乎全是UEFI启动了。他们是干什么的,区别在哪里呢?请往后看。
众所周知,系统的启动流程是

BIOS

\Rightarrow

主引导记录

\Rightarrow

Boot Loader

\Rightarrow

系统运行

由于各种翻译和技术名称的区别,名词可能会存在各种各样的差异,这里搜集解释一下,,并搜集各类不同的翻译:
BIOS(基本输入输出系统, Basic Input Output System)
BIOS是固化在主板上的程序,你按下电源开关后,BIOS首先就进行工作,检查插在主板上的硬件工作正常不正常,你购买台式机的主板的话去官网可以看到主板固件,这就是BIOS程序。现在的主板上经常会有一些Debug用的灯,叫什么ezdebug这种,如果你主板上什么硬件坏掉了,相应的灯就亮起来,这就是BIOS做的工作之一。如果你的电脑正常的话,开机的时候会显示你主板的Logo,然后让你按某个键就可以进入BIOS的设置,根据你的主板厂商不同,按键也会不一样,通常是F2、F12、F8、DEL什么的,这个用到的时候需要自己上网查,需要注意的是在Win10下面如果开启了快速启动,则一般不会出现主板Logo,即没有给你进入BIOS的操作,因此如果要进BIOS,需要关闭Win10的快速启动,更多BIOS的知识查看引用[1][2],[2]中说BIOS的主要程序段如下所示:

1.自诊断程序 通过读取CMOSRAM中的内容,识别硬件配置,并对其进行自检和初始化。
2.CMOS设置程序 引导过程中,用特殊热键启动,进行设置后,存入CMOS RAM中。
3.系统自检装载程序 在自检成功后,将磁盘0磁道0扇区上的引导程序装入内存,运行加载操作系统。
4.主要l/0设备驱动程序和中断服务

其中的3,系统自检装载过程就与我们的系统安装有关,BIOS只认识设备(硬盘),不认识分区,也不认识文件,因此他的作用仅仅是按照CMOS设置里面的顺序,挨个存储设备看,查看这个存储设备的前512字节是不是以0x55 0xAA结尾(查看引用[3]),,不是,就跳过,是,就加载这里的前512字节的代码执行,注意这里查找的顺序,就是你在进入BIOS后设置的启动项顺序,这些设置保存在CMOS芯片中,所以你每次进入BIOS改动后,都会问你要不要保存后退出。后面的启动过程就和BIOS没什么关系了,至于第4点中的主要I/O设备驱动程序和中断服务,我想应该是系统启动以后BIOS向系统提供的对硬件的操作服务,见引用[4]。所以问题的关键就在于这512字节干了什么,(注意我们这里说的都是BIOS Legacy的方式,才会有512字节的说法,UEFI启动方式中直接分了一个几百兆的ESP分区用来做BIOS Legacy中这512字节的事情)。
MBR:Main Boot Record,主引导记录,主启动记录,主引导分区,主引导扇区
从标题可以看见,MBR的翻译很多,MBR其实就是第一个可开机设备(我理解就是前面BIOS找的时候前512字节末尾是不是0x55 0xAA的设备)的第一个扇区内的主引导分区块,见引用[5],磁盘的一个扇区有512字节,设备第一个扇区的前446字节就叫做MBR。
接下来64字节就记录硬盘的分区情况,也就是保存硬盘的分区表(因为每个分区的信息的保存规定需要16个字节,因此MBR类型的磁盘最多分4个分区,这里说的分区是主分区,而规定扩展分区最多有一个,扩展分区下面的分区就叫做逻辑分区,存在扩展分区的情况下,扩展分区的表项记录了第一个逻辑分区的EBR的起始扇区地址和第一个逻辑分区的扇区数量。逻辑分区的扇区记录保存在逻辑分区的EBR中,每个逻辑分区都有一个类似于MBR+分区表一样的东西,叫做EBR(512字节)。但这个EBR有用的地方只有DPT中的前两项见引用[9],第一项16个字节表示该逻辑分区的起始地址(相对地址,即数值较小,偏移基址为该逻辑分区EBR扇区的实际地址)和扇区数量,第二项表示下一个逻辑分区的EBR扇区的起始扇区地址和扇区总数量,第三项第四项无效,如下图所示。见引用[7][8][9])。
在这里插入图片描述
分区表中每个分区信息的格式见引用[7],从[7]可以看出,每个分区的信息都是16个字节,其中第一个字节就表示了该分区是否是活动分区,活动分区就是说该分区有系统,可以引导。
最后两个字节从前文可以看出,就可以用来记录这个硬盘是不是保存了系统,可以用来启动的磁盘。注意我们这里所说的都是MBR类型的磁盘,这类型的磁盘和BIOS Legacy启动方式(就是前面所说的查找启动磁盘的方式)的结合是UEFI+GPT出现以前的主流方式,很多老电脑都是通过这种方式查找系统所在分区的。
上一节讲BIOS时说BIOS会加载结尾为0x55 0xAA的512字节代码内容执行,其实主要就是执行的MBR的446字节的内容,这446字节的内容是什么呢?就是最基本的引导加载程序(很多时候也叫引导程序,英文名boot loader,见引用[5]),将这446字节的引导加载程序放入内存开始执行后,BIOS就功德圆满退场了,后面就是这个引导加载程序工作了,这个引导加载程序的目的在于加载(load)内核文件,而引导加载程序是操作系统安装时所提供的,也就是你装系统的时候,把系统装到了哪个盘,哪个盘的MBR就会被改写,引导加载程序就放到MBR里面去了(这里就要说一下MBR磁盘的双系统安装了,如果你在MBR磁盘上先安装了Windows,再安装Linux,也就是Linux的引导加载程序覆盖了Windows的引导加载程序,OK没问题,一般来说Linux会再开机时的GRUB选项里面放上Windows启动项,而如果你先安装Linux,再安装Window,不好意思,Windows的引导安装程序没那么好心,不会为你添加Linux启动项,因此你就无法进入Linux系统了,这是个人理解,如果出现了这个问题,那么就需要修复引导加载程序,这就很麻烦了,涉及到GRUB文件的配置,我现在也不懂)。
由于这个引导加载程序时操作系统安装时所提供的,所以它可以识别文件系统格式(就是说它可以读取这个磁盘的分区上的文件,而不是像BIOS程序一样只懂得多少字节到多少字节,如果你学过操作系统就知道,一个文件可能分布在磁盘的各个扇区,而不是连续地聚在一起,BIOS程序应该就只能读取连续一起的字节,个人理解),因此就可以读取硬盘上的文件,首先它会进行内核文件的读取,内核文件(比如windows中的)读取之后,引导加载程序也就功德圆满了,接下来就进入操作系统的任务了。
引导加载程序的主要任务有(引用[5])

1.提供菜单:让用户可以选择不同的开机选项
2.载入内核文件:直接指向可开机的程序段开始操作系统
3.转交其他loader:将引导加载功能转交给其他loader负责

第一点提供菜单,Windows双系统,win7,win10,win8等多Windows系统开机时会有选项让你选择开机的系统,Linux中的GRUB也是一个引导加载程序,安装双系统时会让你选择进入哪个系统,这就是bootloader的第一个功能,GRUB中可以进行手动配置然后更新,我猜想应该是引导加载程序运行时会读取安装Linux分区的配置文件,所以引导加载程序的功能不是在安装系统时固定了,在安装系统后也可以改变,这里我想到EasyBCD等软件是否也就是在修改Window分区的引导加载程序的配置文件,从而使其可以对windows开机时的开机项进行修改。
第二点,载入内核文件,这个容易理解,就是选择开机项之后,载入相应分区的操作系统文件到操作系统内存空间(就是操作系统原理里面的内核空间,内存地址的高位处)。
第三点,转交其他loader,这里鸟哥说,引导加载程序除了可以安装在MBR外,还可以安装在每个分区的引导扇区(boot sector,一般是该分区的第一个扇区),如前文所述,每个分区都有一个类似MBR的扇区,扇区的前446字节就放着引导加载程序,Linux的GRUB里面,在配置文件里面就可以根据分区名如(hd0, msdos1)选取该分区引导启动。
上面就是MBR+BIOS Legacy的启动过程。
可以看到系统的启动和磁盘的分区管理是密切相关的,毕竟系统是保存在磁盘上面的。然而MBR分区的磁盘限制太大,MBR分区方式允许磁盘的最大容量是2T(和分区表中起始扇面编号的最大值有关),显然难以满足现今的发展需求,于是GPT分区方式的磁盘出现了,GPT是GUID Partition Table的缩写,中文翻译叫做全局唯一标识符分区表,GPT是UEFI(统一可扩展固件接口)的一部分,UEFI(Unified Extensible Firmware)是一个描述类型接口的标准,传统的BIOS大多采用汇编语言进行编写,没有图形化界面,只能通过键盘进行操作,而且各家BIOS不统一,难以添加新功能。因此英特尔与其他很多家硬件厂商、软件厂商、BIOS厂商和操作系统厂商合计合计,搞出一个UEFI用来更好地接合硬件和操作系统,见引用[12],GPT就是这个标准的一部分,因此BIOS Legacy和MBR磁盘分区是一起的,UEFI和GPT是一起的。
但是大量的传统的BIOS启动方式的主板不可能立即淘汰,因此使用GPT分区的磁盘也能在BIOS Legacy上启动,因为GPT为了兼容性保留了一份传统的MBR,用于防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR叫做保护MBR,仍然保留在硬盘的第一个扇区,在这个MBR中,分区表项中的第5个字节为0xEE,见引用[13],表示这是一个GPT磁盘分区,从而在不支持GPT的硬盘管理工具中被识别为未知类型磁盘。

接下来的GPT表头(LBA1区域)定义了硬盘的可用空间以及组成分区表的项的数量和大小。接下来的4个分区,由于保护MBR的存在,因此可以使用BIOS Legacy方式进行启动和引导,因此GPT磁盘可以用于BIOS Legacy的主板中,所以BIOS+GPT和UEFI+GPT是一脉相同的,只要你能引导到正确的分区区域,找到引导加载程序,启动都是没问题的。下图是GPT磁盘的分区表项

GPT磁盘中一个分区表项大小通常是128字节。GPT磁盘就说到这里,其实和MBR类似,都是要规划好分区表,然后根据分区表中的起止位置得到分区。
UEFI的启动流程见引用[14],由于我也不是专业人士,因此结合我的理解尽量保证易懂和正确。
待更:
1.GPT的ESP分区是怎么回事?
2.UEFI是如何查找分区中的系统的?
3.系统安装盘、引导盘、启动盘等等的区别?
4.如何将一个大容量U盘上制作为同时可以进入PE系统盘、Ubuntu安装盘、Deepin安装盘的系统启动盘?

[1]如何进入BIOS? - 知乎 (zhihu.com)
[2]BIOS到底是什么 - 知乎 (zhihu.com)
[3]科普贴:BIOS和UEFI的启动项 - 知乎 (zhihu.com)
[4]BIOS INT中断整理_rhxznp的博客-CSDN博客_bios中断服务程序详解
[5]鸟哥的Linux私房菜基础学习篇第三版P73页,人民邮电出版社
[6]分区表GPT和MBR有什么区别 - 知乎 (zhihu.com)
[7]【Linux】MBR磁盘分区表只能有四个分区?_remo0x的博客-CSDN博客_mbr为什么只能建四个主分区
[8]鸟哥的Linux私房菜基础学习篇第三版P70页,人民邮电出版社
[9]MBR、EBR与DBR详解_我是NeroZhang的博客-CSDN博客_ebr和mbr记录区别
[10]GPT分区表详解 - 唸安。 - 博客园 (cnblogs.com)
[11]了解 UEFI与Legacy、硬盘分区MBR和GPT - 知乎 (zhihu.com)
[12]统一可扩展固件接口_百度百科 (baidu.com)
[13]Partition types: List of partition identifiers for PCs (tue.nl)
[14]GUID Partition Table (GPT) - NTFS.com
[15]UEFI启动流程概览 - 知乎 (zhihu.com)