第一章 UEFI 概述

版权声明:未经作者允许,禁止转载本文任何内容。如需转载请留言。 https://blog.csdn.net/liyuenan93/article/details/82183568

作者:Maxwell Li
日期:2017/12/05
未经作者允许,禁止转载本文任何内容。如需转载请留言。


BIOS 是存储在主板ROM里的一组程序代码,包括:

  • 加电自检程序,用于开机时对硬件的检测。
  • 系统初始化代码,包括硬件设备的初始化、创建 BIOS 中断向量等。
  • 基本的外围 I/O 处理的子程序代码。
  • CMOS 设置程序

BIOS 程序运行在16位实模式下,实模式下最大的寻址范围是 1MB(实模式)。

UEFI 定义了操作系统和平台固件之间的借口,它是 UEFI Forum 发布的一种标准。

UEFI 提供给操作系统的借口包括启动服务(BS)和运行时服务(RT)以及隐藏在 BS 之后丰富的 Protocol。

启动服务:主要服务对象是操作系统加载器以及其他 UEFI 应用程序和 UEFI 驱动。操作系统加载器通过启动服务逐步取得对整个计算机系统资源的控制。当加载器完全控制计算机软硬件资源后,系统结束启动服务,进入运行时。启动服务主要包括:事件服务、内存管理、Protocol 管理、Protocol 使用类服务、驱动管理、Image 管理、ExitBootServices 服务。

运行时服务:主要服务对象是操作系统、操作系统加载器以及 UEFI 应用和 UEFI 驱动。运行时服务主要包括:时间服务、读写 UEFI 系统变量服务、虚拟内存服务、重启系统服务。

UEFI 的优点:

  • 可以使用 C++ 编写,提高开发效率。
  • 驱动的模块化设计和软硬件升级的兼容性,每个表、Protocol 都有版本号,易于升级。
  • 基于事件的异步操作,提高 CPU 利用率;舍弃中断,仅保留时钟中断。
  • 先检测程序和驱动的证书,提高安全性。

UEFI 系统从加电到关机可分为七个阶段:

UEFI 系统启动的7个阶段.jpg

SEC(安全验证)->PEI(EFI前期初始化)->DXE(驱动执行环境)->BDS(启动设备选择)->TSL(操作系统加载前期)->RT(Run Time)->AL(系统灾难恢复期)

其中前三个阶段是 UEFI 初始化阶段,DXE 阶段结束后 UEFI 环境已经准备完毕。BDS 和 TSL 是操作系统加载器作为 UEFI 应用程序运行阶段。

SEC 阶段

SEC(Security Phase)阶段是平台初始化的第一个阶段。

SEC 阶段功能

UEFI 系统开机或重启进入 SEC 阶段,它执行以下四种任务:

  1. 接收并处理系统启动和重启信号:系统加电信号、系统重启信号、系统运行过程中的严重异常信号。
  2. 初始化临时存储区域:在 SEC 阶段时,仅 CPU 和其内部(SOC)资源被初始化,外围设备和内存均为初始化,因此需要临时 RAM 区域。临时 RAM 初始化之后才能进入 SEC 的入口函数。
  3. **作为可信系统的根:**SEC 能被系统信任,之后的各个阶段才有被信任的基础。
  4. 传递系统参数给下一阶段(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-27.2kB

从功能上讲,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 阶段,系统固件提供错误处理和灾难恢复机制。

猜你喜欢

转载自blog.csdn.net/liyuenan93/article/details/82183568