BIOS、UEFI、MBR、GPT都是啥呢

装系统时难免会接触到BIOS、UEFI、MBR、GPT等概念,一下子有些混淆不清,本文就这些概念进行总结

启动模式

BIOS(Basic Input/Output System)是存储在BIOS芯片中的程序,现在的新式电脑用的基本都是UEFI(Unified Extensible Firmware Interface)(基本见于09年以后的主板),早期的过渡电脑用的都是EFI启动。EFI或UEFI的一部分是存储在EFI/UEFI BIOS芯片。EFI/UEFI也叫做EFI/UEFI BIOS,但在实际上它们和BIOS是不一样的,所以一般把后面的“BIOS”尾巴去掉,下面就来具体谈一下BIOS、EFI和UEFI。

BIOS

BIOS只认识设备,不认识分区、不认识文件

BIOS启动的时候,按照CMOS设置里的顺序,挨个查存储设备的前512字节,若是以0x55 0xAA结尾,则这个磁盘可以启动,加载这512字节里的代码并执行,执行后事几乎就跟BIOS关系了,若不是,那就跳过找下一个设备。

这512字节里存了决定启动什么系统的相应代码。这个代码是系统安装程序写进去的,目的是启动自身系统。512字节还包含了MBR分区表的信息,而BIOS并不认识分区表,所以就算是磁盘上没有分区表也没有分区,只要前512字节有0x55 0xAA的结尾,有引导代码,也是能启动系统

BIOS本身是汇编语言代码,是在16位实模式下调用INT 13H中断执行的,16位实模式直接能访问的内存只有1MB,就算装了4G、8G或者16G还是32G内存,到了BIOS上一律只先认前1MB。在这1MB内存中,前640K称为基本内存,后面384K内存留给开机必要硬件和各类BIOS本身使用

BIOS用于计算机硬件自检和初始化、CMOS设置、引导操作系统启动、提供硬件I/O、硬件中断等主要功能

BIOS启动计算机的具体过程

UEFI

EFI

EFI(Extensible Firmware Interface,可扩展固件接口),是用模块化、高级语言(主要是C语言)构建的一个小型化系统,和BIOS一样,主要在启动过程中完成硬件初始化,但它是直接利用加载EFI驱动的方式,识别系统硬件并完成硬件初始化,彻底摒弃读各种中断执行。EFI驱动并不是直接面向CPU的代码,而是由EFI字节码编写成,EFI字节码是专用于EFI的虚拟机器指令,需要在EFI驱动运行环境DXE下解释运行,这样EFI既可以实现通配,又提供了良好的兼容,因此与BIOS不同的是CMOS设置程序在EFI上是作为一个个EFI程序来执行的,硬件设置是硬件设置程序、而启动管理则是另一个程序,保存CMOS又是另一个程序。此外,EFI完全是32位或64位,摒弃16位实模式,在EFI中就可以实现处理器的最大寻址,因此可以在任何内存地址存放任何信息。

EFI在功能上完全等同于一个轻量化的OS(操作系统),但EFI在制定时就定位到不足以成为专业OS的地位上,它只是一个硬件和操作系统间的一个接口;不提供中断访问机制,EFI必须用轮询的方式检查并解释硬件,较OS下的驱动执行效率较低;EFI只有简单的存储器管理机制,在段保护模式下只将存储器分段,所有程序都可以存取任何一段位置,不提供真实的保护服务。伴随着EFI,一种全新的GUID磁盘分区系统(GPT)被引入支持。

在EFI发展到1.1的时候,英特尔把EFI公之于众,后续的2.0吸引了众多公司加入,EFI也不再属于英特尔,而是属于了Unified EFI Form的国际组织,EFI在2.0后也改称为UEFI,EFI和原来是一个意思,U则是Unified(一元化、统一)的缩写,所以UEFI的意思就是“统一的可扩展固件接口”

UEFI

UEFI认识设备,还认识设备ROM,还认识分区表、认识文件系统以及文件

UEFI启动的时候,经过一系列初始化,然后按照设置的顺序,找启动项。启动项分设备启动项和文件启动项两种:

UEFI启动后,进入DXE(Driver eXecution Environment,驱动程序执行环境)阶段,开始加载设备驱动,然后获得设备列表。对于磁盘,UEFI会加载对应的驱动解析其中的分区表(GPT和MBR)。然后UEFI就会用内置的文件系统驱动,解析每个分区从中认识出启动文件,比如\EFI\Boot\bootX64.efi

UEFI启动计算机的具体过程

UEFI标准里,在GPT分区表的基础上,规定了一个EFI系统分区(EFI System Partition,ESP),ESP要格式化成FAT32,EFI启动文件要放在“\EFI<厂商>”文件夹下面

作为UEFI标准里,钦定的文件系统,FAT32.efi是每个主板都会带的。所有UEFI的主板都认识FAT32分区

BIOS只能在16位模式下运行,而UEFI可以在32位或64位模式下运行,具有比BIOS更多的可寻址地址空间

UEFI还包含了其他功能,它支持安全引导(SecureBoot),开启后,主板会验证即将加载的efi文件的签名,如果是不是受信任的,就会拒绝加载,以确保没有恶意软件篡改引导过程

磁盘分区要格式化之后才能存文件,格式化成不同的文件系统,文件才能被不同的操作系统识别
如Win10可以选FAT32、NTFS、exFAT、ReFS等;Linux可以选ext2、ext3、ext4、FAT32等;macOS可以选FAT32、HFS+、APFS、exFAT等

其实每个操作系统都带有文件系统驱动才能读取文件系统中的文件
比如Windows带了FAT32、NTFS、exFAT、ReFS四种文件系统等驱动,Linux带了FAT32、ext等文件系统等驱动,macOS带了FAT32、HFS+、APFS、exFAT四种驱动以及NTFS只读驱动。
设备也是一样的。
原版的WinXP只带了IDE驱动,没有SATA驱动;原版Win7只带了IDE和SATA驱动,没带NVMe驱动;Win8/Win10则带了IDE/SATA和NVMe三种驱动;macOS10.12带了SATA驱动以及苹果专用NVMe磁盘的驱动;macOS10.13带了SATA和标准NVMe驱动。

UEFI模糊了固件和操作系统界限,设计之初就考虑到了扩展性,也是有驱动程序的。启动过程中的DXE阶段加载驱动用的

UEFI和BIOS比较。

二者显著的区别就是EFI是用模块化,C语言风格的参数堆栈传递方式,动态链接的形式构建的系统,较BIOS而言更易于实现,容错和纠错特性更强,缩短了系统研发的时间。

BIOS UEFI
16位实模式下运行,只有1M的寻址空间 运行于32位或64位模式,具有更多的可寻址地址空间
BIOS利用挂载真实模式中断的方式增加硬件功能 将一段类似于驱动的16位代码,放置在固定的0x000C0000至0x000DFFFF之间存储区中,运行这段代码的初始化部分,它将挂载实模式下约定的中断矢量向其他程序提供服务
BIOS提供的服务在现实中只能提供给操作系统引导程序或MS-DOS类操作系统使用 具有良好的向下兼容性和被外部访问的特性
不支持secure boot 支持secure boot

磁盘分区

直接比较,需要细细了解的可以继续看,不想细细了读完彩色部分大概知道有什么不同就行,直接跳过前两小节即可。

传统MBR磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器),MBR硬盘分区最大仅支持2T容量。

GPT磁盘分区样式支持最大为128个分割,一个分割最大18 EB,只受到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标准规定的分区表的最小尺寸)。 与MBR分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT分区磁盘有备份分区表来提高分区数据结构的完整性。在UEFI系统上,通常是通过ESP分区中的EFI应用程序文件引导GPT硬盘上的操作系统,而不是活动主分区上的引导程序。

MBR(Master Boot Record,主引导记录)

主引导记录(Master Boot Record,MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。有时将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。

主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。

**DPT(Disk Partition Table,硬盘分区表 )**占据主引导扇区的64个字节(偏移01BEH--偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。

结束标志字55,AA(偏移1FEH-偏移1FFH)最后两个字节,是检验主引导记录是否有效的标志

主引导扇区记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息,是数据信息的重要入口。如果它受到破坏,硬盘上的基本数据结构信息将会丢失,需要用繁琐的方式试探性的重建数据结构信息后才可能重新访问原先的数据。主引导扇区内的信息可以通过任何一种基于某种操作系统的分区工具软件写入,但和某种操作系统没有特定的关系,即只要创建了有效的主引导记录就可以引导任意一种操作系统。

主引导记录仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘,最多只能识别4个主要分区(Primary partition)。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。从而引出了扩展分区。扩展分区也是主要分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。

扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到。

GPT(GUID Partition Table,全局唯一标识分区表)

**全局唯一标识分区表(GUID Partition Table,GPT)**是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(UEFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。对于那些扇区为512字节的磁盘,MBR分区表不支持容量大于2.2TB的分区,然而,一些硬盘制造商(诸如希捷和西部数据)注意到这个局限性,并且将他们的容量较大的磁盘升级到4KB的扇区,这意味着MBR的有效容量上限提升到16 TiB。

在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。

传统MBR

在GPT分区表的最开头,出于兼容性考虑仍然存储了一份传统的MBR,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做保护MBR。在支持从GPT启动的操作系统中,这里也用于存储第一阶段的启动代码。在这个MBR中,只有一个标识为0xEE的分区,以此来表示这块硬盘使用GPT分区表。不能识别GPT硬盘的操作系统通常会识别出一个未知类型的分区,并且拒绝对硬盘进行操作,除非用户特别要求删除这个分区。这就避免了意外删除分区的危险。另外,能够识别GPT分区表的操作系统会检查保护MBR中的分区表,如果分区类型不是0xEE或者MBR分区表中有多个项,也会拒绝对硬盘进行操作。

在使用MBR/GPT混合分区表的硬盘中,这部分存储了GPT分区表的一部分分区(通常是前四个分区),可以使不支持从GPT启动的操作系统从这个MBR启动,启动后只能操作MBR分区表中的分区。

分区表头

分区表头定义了硬盘的可用空间以及组成分区表的项的大小和数量。分区表头还记录了这块硬盘的GUID,记录了分区表头本身的位置(LBA 1)和大小以及备份分区表头和分区表的位置(硬盘的最后)和大小。还储存着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错了,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。所以GPT硬盘的分区表不可以直接使用16进制编辑器修改

分区表项

GPT分区表使用简单而直接的方式表示分区。一个分区表项的前16字节是分区类型GUID(如,EFI系统分区的GUID类型是:``C12A7328-F81F-11D2-BA4B-00A0C93EC93B`)。接下来的16字节是该分区唯一的GUID(这个GUID指的是该分区本身,而之前的GUID指的是该分区的类型)。再接下来是分区起始和末尾的64位LBA编号,以及分区的名字和属性。

操作系统支持

1:读写支持

2:启动支持

3:启动支持(需要UEFI)

4:在MBR/GPT混合硬盘中优先使用MBR

XP 2003 vista 2008 7 2012 8 8.1 10 2016
32位 1(SP1) 1/4 1/4 1/4 - 1/3/4 1/3/4 1/3/4 -
64位 1/4 1/2/3/4 1/3/4 1/2/3/4 1/3/4 1/3/4 1/3/4 1/3/4 13/4 1/3/4

注意:64位2003在x64平台为3,在IA-64平台上为2;64位2008在x64平台上为3,在IA-64平台上为2

计算机启动过程

BIOS启动计算机的过程

当按下电源,主板等设备开始供电,这时电压还不稳定。在早期的南北桥主板上,由主板北桥向CPU发复位信号,对CPU初始化;稳定电压后复位信号便撤掉。现在的单南桥主板,则由CPU自身调整稳定电压达到初始化的目的,当电压稳定后,CPU便在系统BIOS保留的内存地址处执行跳转BIOS起始处指令,开始执行POST自检。

在POST自检中,BIOS只检查系统的必要核心硬件(CPU、640K基本内存、显卡)是否有问题,PS/2键盘控制器、系统时钟是否有错误等等。由于POST检查在显卡初始化以前,因此在这个阶段如发生错误,无法在屏幕上显示,不过主板上有个报警扬声器,如果主板的8255外围可编程接口芯片没有损坏的话,POST报警声音一定是会出来的。一般情况下,一声短“嘀”声基本代表正常启动,不同的错误则是不同的短“嘀”声和长“嘀”声组合。POST自检结束后,BIOS开始调用中断完成各种硬件初始化工作。

硬件初始化工作主要有两点,首先POST检测后,电脑出现了开机启动画面,这就是已经检测到了显卡并完成了初始化,但由于BIOS是在16位实模式运行,因此画面是以VGA分辨率(640*480,纵横比4:3)显示的。第二,BIOS只识别到由主引导记录(MBR)初始化的硬盘,而EFI或UEFI采用了一种新的GUID磁盘分区系统(GPT)格式,这种硬盘在BIOS下是无法识别的。硬件全部初始化完毕后进入更新ESCD阶段。

在ESCD更新阶段中,BIOS将对存储在CMOS中和操作系统交换的硬件配置数据进行检测,如果系统硬件发生变动,则会更新该数据,否则不更新保持原状不变,ESCD检测或更新结束后,BIOS将完成最后一项工作,就是启动操作系统。

最后这一步中,BIOS根据CMOS中用户指定的硬件启动顺序,读取相应设备的启动或引导记录,引导相应设备上的操作系统启动,进入操作系统,此后便由操作系统接替BIOS负责硬件和软件间的相互通信。如果发现所有硬件都没有能引导操作系统的记录,则会在屏幕上显示相应错误信息,并将电脑维持在16位实模式。

UEFI启动计算机的过程

打开电源开关时,电脑的主要部件都开始有了供电,与BIOS不同的是,UEFI预加载环境首先开始执行,负责CPU和内存(全部容量)的初始化工作,这里如出现重要问题,电脑即使有报警喇叭也不会响,因为UEFI没有去驱动8255发声,不过预加载环境只检查CPU和内存,如果这两个主要硬件出问题,屏幕没显示可以立即确定,另外一些主板会有提供LED提示,可根据CPU或内存亮灯大致判断故障。

CPU和内存初始化成功后,DXE(Driver eXecution Environment,驱动程序执行环境)载入,当DXE载入后,UEFI就具有了枚举并加载UEFI驱动程序的能力,在此阶段,UEFI会枚举搜索各个硬件的UEFI驱动并相继加载,完成硬件初始化工作,这相比BIOS的读中断加载速度会快的多,同样如加载显卡的UEFI驱动成功,电脑也会出现启动画面,硬件驱动全部加载完毕后,最后同BIOS一样,也得去启动操作系统。

在启动操作系统的阶段,同样是根据启动记录的启动顺序,转到相应设备(仅限GPT设备,如果启动传统MBR设备,则需要打开CSM支持)的引导记录,引导操作系统并进入,注意,UEFI在检测到无任何操作系统启动设备时,会直接进入UEFI设置页面,而不是像BIOS那样黑屏显示相关信息。

概括:

参考,扩展

电脑基础知识普及:BIOS、EFI与UEFI详解

科普贴:BIOS和UEFI的启动项

聊聊 BIOS、UEFI、MBR、GPT、GRUB……

分区表