https://www.jianshu.com/p/73ee37f6b3b9
统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。可扩展固件接口负责加电自检(POST)、联系操作系统以及提供连接操作系统与硬件的接口。
UEFI的前身是Intel在1998年开始开发的Intel Boot Initiative,后来被重命名为可扩展固件接口(Extensible Firmware Interface,缩写EFI)。Intel在2005年将其交由统一可扩展固件接口论坛(Unified EFI Forum)来推广与发展,为了凸显这一点,EFI也更名为UEFI(Unified EFI)。UEFI论坛的创始者是11家知名电脑公司,包括Intel、IBM等硬件厂商,软件厂商Microsoft,及BIOS厂商AMI、Insyde及Phoenix。
UEFI在概念上非常类似于一个低阶的操作系统,并且具有操控所有硬件资源的能力。不少人感觉它的不断发展将有可能代替现代的操作系统。事实上,EFI的缔造者们在第一版规范出台时就将EFI的能力限制于不足以威胁操作系统的统治地位。首先,它只是硬件和预启动软件间的接口规范;其次,UEFI环境下不提供中断的机制,也就是说每个EFI驱动程序必须用轮询(polling)的方式来检查硬件状态,并且需要以解释的方式运行,较操作系统下的机械码驱动效率更低;再则,UEFI系统不提供复杂的缓存器保护功能,它只具备简单的缓存器管理机制,具体来说就是指运行在x64或x86处理器的64位模式或保护模式下,以最大寻址能力为限把缓存器分为一个平坦的段(Segment),所有的程序都有权限访问任何一段位置,并不提供真实的保护服务。当UEFI所有组件加载完毕时,便会启动操作系统的启动程序,如果UEFI固件内置EFI Shell,也可以启动EFI Shell命令提示(部分UEFI固件内置EFI Shell),在这里,用户可以调入执行EFI应用程序,这些EFI程序可以是OEM提供的硬件检测软件,OEM提供的备份软件,引导管理软件,操作系统的启动程序等等,也可以加载EFI分区(ESP)中的EFI驱动程序(如文件系统驱动程序)。EFI应用程序和EFI驱动程序可以是PE格式的.efi文件,可用C语言编写。在UEFI引导模式下,操作系统的启动程序也是EFI应用程序,启动程序的EFI文件存储在EFI系统分区(ESP)上。理论上来说,对于EFI应用程序的功能并没有任何限制,任何人都可以编写这类软件,并且效果较以前MS-DOS下的软件更华丽,功能更强大。一旦引导软件将控制权交给操作系统,所有用于引导的服务代码将全部停止工作,部分运行时,代服务程序还可以继续工作,以便于操作系统一时无法找到特定设备的驱动程序时,该设备还可以继续被使用。
UEFI固件区分架构,在UEFI引导模式下,通常只能运行特定架构的UEFI操作系统和特定架构的EFI应用程序(EBC程序除外)。比如,采用64位UEFI固件的PC,在UEFI引导模式下只能运行64位操作系统启动程序;而在Legacy引导模式(即BIOS兼容引导模式)下,通常不区分操作系统的比特数,既可以运行16位的操作系统(如DOS),也可以运行32位或64位的操作系统,和BIOS一样。 [2]
UEFI 定义了操作系统和平台固件之间的借口,它是 UEFI Forum 发布的一种标准。
UEFI 提供给操作系统的借口包括启动服务(BS)和运行时服务(RT)以及隐藏在 BS 之后丰富的 Protocol。
启动服务:主要服务对象是操作系统加载器以及其他 UEFI 应用程序和 UEFI 驱动。操作系统加载器通过启动服务逐步取得对整个计算机系统资源的控制。当加载器完全控制计算机软硬件资源后,系统结束启动服务,进入运行时。启动服务主要包括:事件服务、内存管理、Protocol 管理、Protocol 使用类服务、驱动管理、Image 管理、ExitBootServices 服务。
运行时服务:主要服务对象是操作系统、操作系统加载器以及 UEFI 应用和 UEFI 驱动。运行时服务主要包括:时间服务、读写 UEFI 系统变量服务、虚拟内存服务、重启系统服务。
UEFI 的优点:
可以使用 C++ 编写,提高开发效率。
驱动的模块化设计和软硬件升级的兼容性,每个表、Protocol 都有版本号,易于升级。
基于事件的异步操作,提高 CPU 利用率;舍弃中断,仅保留时钟中断。
先检测程序和驱动的证书,提高安全性。
UEFI 系统从加电到关机可分为七个阶段:
SEC(安全验证)->PEI(EFI前期初始化)->DXE(驱动执行环境)->BDS(启动设备选择)->TSL(操作系统加载前期)->RT(Run Time)->AL(系统灾难恢复期)
其中前三个阶段是 UEFI 初始化阶段,DXE 阶段结束后 UEFI 环境已经准备完毕。BDS 和 TSL 是操作系统加载器作为 UEFI 应用程序运行阶段。
SEC 阶段
SEC(Security Phase)阶段是平台初始化的第一个阶段。
SEC 阶段功能
UEFI 系统开机或重启进入 SEC 阶段,它执行以下四种任务:
接收并处理系统启动和重启信号:系统加电信号、系统重启信号、系统运行过程中的严重异常信号。
初始化临时存储区域:在 SEC 阶段时,仅 CPU 和其内部(SOC)资源被初始化,外围设备和内存均为初始化,因此需要临时 RAM 区域。临时 RAM 初始化之后才能进入 SEC 的入口函数。
作为可信系统的根:SEC 能被系统信任,之后的各个阶段才有被信任的基础。
传递系统参数给下一阶段(PEI):需将如下信息作为参数传递给 PEI 的入口函数:系统当前状态、可启动固件的地址和大小、临时 RAM 区域的地址和大小、栈的地址和大小。
SEC 阶段执行流程
以临时 RAM 初始化为界,SEC 的执行有分为两大部分:临时 RAM 生效之前称为 Reset Vector 阶段,临时 RAM 生效后调用 SEC 入口函数从而进入 SEC 功能区。
其中 Reset Vector 的执行流程如下:1.进入固件入口。2.从实模式转换到32位平坦模式。3.定位固件中的 BFV(Boot Firmware Volume)。4.定位 BFV 中的 SEC 映像。5.若是64位系统,从32位模式转换到64位模式。6.调用 SEC 入口函数。
PEI 阶段
PEI(Pre-EFI Initialization)主要功能是为 DXE 准备执行环境,将需要传递到 DXE 的信息组成 HOB(Handoff Block)列表,最终将控制权转交给 DXE。
从功能上讲,PEI 可分为以下两部分:
PEI 内核:负责 PEI 基础服务和流程。
PEIM 派遣器:找出系统中所有 PEIM,并根据 PEIM 之间的依赖关系按顺序执行 PEIM。
PEI 执行流程.jpg
PEIM 之间的通信通过 PPI(PEIM-to-PEIM Interfaces)完成。PPI 与 DXE 阶段的 Protocol 类似,每个 PPI 是一个结构体,包含了函数指针和变量。
UEFI 的一个重要特点是其模块化设计。模块载入内存后生成 Image。PEI 也是一个模块,PEI Image 的入口函数为 _ModuleEntryPoint,它最终调用 PEI 模块的入口函数 PeiCore。进入 PeiCore 后,首先根据从 SEC 阶段传入的信息设置 Pei Core Services,然后调用 PeiDispatcher 执行系统中的 PEIM,当内存初始化后,系统立即进行栈切换并重新进入 PeiCore。
DXE 阶段
DXE(Driver Execution Environment)阶段执行大部分系统初始化工作,执行流程如下图所示:
DXE 执行流程.jpg
从功能上讲,DXE 可分为以下两部分:
DXE 内核:负责 DXE 基础服务和执行流程。
DXE 派遣器:负责调度执行 DXE 驱动,初始化系统设备。
DXE 提供的基础服务包括系统表、启动服务、Run Time Services。
DXE 驱动之间通过 Protocol 通信。Protocol 是一种特殊的结构体,每个 Protocol 对应一个 GUID,利用系统 BootServices 的 OpenProtocol,并根据 GUID 来打开对应的 Protocol,进而使用这个 Protocol 提供服务。
BDS 阶段
BDS(Boot Device Selection)的主要功能是执行启动策略,主要功能包括:
初始化控制台设备。
加载必要的设备驱动。
根据系统设置加载和执行启动项。
如果加载启动项失败,系统将重新执行 DXE dispatcher 来加载更多的驱动,然后重新尝试加载启动项。
TSL 阶段
TSL(Transient System Load)是操作系统加载器(OS Loader)执行的第一阶段。该阶段内 OS Loader 作为 UEFI 的应用程序运行,系统资源仍由 UEFI 内核控制。
TSL 阶段的目的是为 OS Loader 准备执行环境,具备操作系统的雏形,UEFI Shell 是这个檩式系统的人机交互界面,正常情况下不会进入。
RT 阶段
RT(Run Time)阶段,系统的控制权从 UEFI 内核转到 OS Loader,UEFI 占用的各种资源被回收到 OS Loader。
AL 阶段
AL(After Life)阶段,如果系统在 RT 阶段遇到灾难性错误,就会进入 AL 阶段,系统固件提供错误处理和灾难恢复机制。