BIOS、UEFI、Boot Loader都是些什么
什么是BIOS
基本的输入输出是什么
BIOS的终极目标:
所以:
输入的是:硬件平台的信息
输出的是:硬件的软件抽象
然后将引导文件加载至内存引导操作系统启动
自检程序“检”了什么
每个硬件平台都需要发现IO总线,因为数据的传输离不开总线。
所谓的系统自检,就是Power On Self Test
,也就是图中的POST
过程。在传统BIOS
的上电阶段,通过IO
枚举发现总线,进入到标准描述的平台接口部分。
系统自启动了什么
自启动了操作系统呀~毕竟按下电源只是启动了BIOS
程序。
此外,在传统BIOS
程序中,还不支持文件系统,不像上图的Dell
主板,可以手动的添加引导文件,在传统BIOS
启动之后,BIOS
会自动加载MBR
的主引导记录,使操作系统“自行启动”
所以我们再看什么是BIOS
?
输入:围绕上图进行展开,左边部分刚好是硬件的初始化:CPU
初始化、内存初始化……相当于是上面说的,输入的硬件平台信息。
自检:再经过中间部分的系统自检,控制台初始化、设备初始化、通过枚举发现总线并初始化。
输出&自启动:选择引导设备之后,通过BIOS
将硬件平台的软件接口提供给OS Loader
,以供操作系统运行使用。
BIOS
的脉络就稍微有一些清楚了吧。
什么是UEFI BIOS
UEFI
名字听起来和BIOS
相差较大,但是作为业界的新BIOS
——UEFI BIOS
,毕竟还是BIOS
,所以它的主要目标就还是——初始化硬件,提供硬件的软件抽象,并引导操作系统启动
UEFI和BIOS的区别
效率方面:BIOS
正是因为其闭源、接口混乱才导致其最终不适用于新架构的芯片,那时候刚好赶上开源的浪潮,UEFI
开源且使用规定的标准接口,通过提供接口,也将大部分代码移步到了C
代码,大大降低了开发难度,这也是其快速发展的根本原因。
性能方面:UEFI
舍弃了硬件外部中断的低效方式,只保留了时钟中断,通过异步+事件来实现对外部设备的操作,性能因此得到极大的释放。
扩展性和兼容性:由于规范的模块化设计,在扩展功能时只需要动态链接其模块即可,扩展十分方便。而且传统BIOS
必须运行在16
位的指令模式下,寻址范围也十分有限,而UEFI BIOS
支持64位的程序,兼容32
位,这也是为什么Windows XP
这么久了,稍微改改还可以安装在新设备上。
安全性:UEFI
安装的驱动设备需要经过签名验证才可以,通过一定的加密机制进行验证,其安全性也非常的高。
其他:传统BIOS
只支持容量不超过2TB
的驱动器,原因是:按照常见的512Byte
扇区,其分区表的单个分区的第13-16
字节用来进行LBA
寻址,也就是以扇区为单位进行寻址。
13-16
总共4
个字节,1Byte=8bit
,这样也就是4*8=32
位,总共就是2^32
个单位空间,以扇区为单位进行寻址,也就是每次512Byte
,也就是:
所以传统BIOS
支持的最大容量的驱动器,不超过2TB
。以硬件厂商1000:1024
的计算方式,也就是2.2TB
:
那么UEFI
支持多大的呢?
采用类似的分区表,具体可以看[参考文章]。
UEFI
支持64
位的地址空间,所以其寻址偏移恰好为一个机器长度——64
位,即8Byte
,还是按照LBA
寻址方式,按照上述计算:
但是微软关方和一些其他资料都显示是18EB
(按照硬件厂商1000:1024
计算):
所以可以对微软官网的数据证伪。
GPT分区的结构
既然说到了GPT
分区的大小问题,那就顺便稍微说一说它的结构吧,如上图:
PMBR
是Protective MBR
,就是当作MBR
用,位置在LBA0
,如果是传统引导,就从这个地方寻找引导文件,如果是UEFI
引导,再从后面的GPT HDR
寻找,GPT HDR
是GPT
表头,位置在LBA1
,记录其他表项的位置;
LBA2-LBA33
总共32
个分区表,记录对应分区的信息,比如起始地址和结束地址等,每个分区的信息用128Byte
记录,也叫做分区表项,比较有意思的一点是,由于Windows
只允许最多128
个分区,所以GPT
一般也就只设32
个分区表。那这是为什么呢?
前面介绍,一个扇区一般是512Byte
,按照微软的设定来,128
个分区,也就需要128
个分区表项来记录,一个分区表项128Byte
,也就是总共
32
个512Byte
大小的扇区,是不是刚好:
这里可能只做了解即可。
至于后面的蓝色区域,对应之后,LBA-1
是GPT HDR
的备份表,LBA-2 - LBA-33
是分区表的备份表,如果前面的数据发生错误,就从后面恢复就好啦~
中间的LBA34-LBA-34
也就是除去表头、表项和备份表等信息的分区内容啦
UEFI与硬件初始化
在SEC
安全验证,初始化cpu
和cpu
内部资源,使cache
作为ram
提供堆栈运行C代码(CAR
——Cache As Ram
)
PEI
阶段初始化内存,并将需要传递的信息传递给DXE
DXE
驱动执行环境,内存已经可以完全被使用,初始化核心芯片,并将控制权转交给UEFI
接口
BDS
引导设备选择,负责初始化所有启动OS
所需的设备,负责执行所有符合UEFI
驱动模型的驱动。
选择完引导设备,就加载OS loader
运行OS
OS
启动后,系统的控制权从UEFI转交给OS loader
,UEFI
占用的资源被回收到OS loader
,只保留UEFI
运行是服务。
其实再统观一下上面的流程,是不是就变成了:基本输入>>>PI
>>>UEFI
>>>基本输出
这个过程是不是又像BIOS
了?毕竟UEFI
还是用作BIOS
的。
如果还是觉得UEFI
和BIOS
是两回事,那么可以换种解读:
Rom Stage
:一开始运行在Rom
中,初始化Cache
作为Ram
运行,从而有了初步的C
环境,运行C
代码。
Ram Stage
:初始化一定的硬件之后,BIOS
程序进入到Ram
中,继续初始化芯片组、主板等硬件。
Find something to boot
:最后找到启动设备,把控制权交给操作系统内核,开始操作系统的时代。
什么是Boot Loader
对比一下UEFI
和Boot Loader
的启动方式:
再分析Boot Loader
的启动过程:
首先硬件设备初始化。为加载 Boot Loader
的 stage2
准备 RAM
空间。拷贝 Boot Loader
的 stage2
到 RAM
空间中。设置好堆栈。跳转到 stage2
的 C
入口点。
初始化本阶段要使用到的硬件设备。检测系统内存映射(memory map
)。将kernel
映像和根文件系统映像从 flash
上读到 RAM
空间中。为内核设置启动参数。调用内核。
几个问题:
BIOS
为什么固化到ROM
芯片上?因为掉电不丢失
只读存储器的话,又不能作修改,还有界面干什么?
要作修改,修改内容在
CMOS
中现在的
BIOS
固化到哪了?ROM
->PROM
->EPROM
->EEPROM
->FLASH
。一开始是在
ROM
上,但是只能检验,不能修改,十分的不方便,所以就转到了PROM
PROM
可编程ROM
,但是写入后也不能改,然后就是
EPROM
,可擦除可编程ROM
,但是人们又觉得不方便,于是又有了
EEPROM
,电可擦除可编程ROM
,而且双电压可防毒。Flash
闪存,更方便,只要用专用程序即可修改,
UEFI 引导与 传统BIOS 引导在原理上有什么区别?芯片公司在其中扮演什么角色?
ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别
《gpt_white_paper_1_1》