第一章 UEFI概述(Unified Extensible Firmware Interface 统一的可扩展固件接口)
常见缩写及描述:
缩略词 | 全名 | 描述 |
---|---|---|
UEFI | Unified Extensible Firmware Interface | 统一的可扩展固件接口 |
BS | Boot Services | 启动服务 |
RT | Runtime Service | 运行时服务 |
BIOS | Basic Input Output System | 基本输入输出系统 |
1. UEFI系统的启动过程
1 SEC阶段
SEC(Security Phase)阶段是平台初始化的第一个阶段,计算机系统加电后进入这个阶段。功能上说,它执行以下四种任务:
- 接收并处理系统启动和重启信号
- 初始化临时存储区域
- 作为可信系统的根
- 传递系统参数给下一阶段(即PEI)
如下信息作为参数传递给PEI的入口函数:
- 系统当前状态,PEI 可以根据这些状态判断系统的健康状况。
- 可启动固件(Boot Firmware Volume)的地址和大小。
- 临时RAM区域的地址和大小。
- 栈的地址和大小。
2 PEI阶段
PEI(Pre-EFI Initialization)阶段, 其主要功能是为DXE 准备执行环境,将需要传递到DXE 的信息组成HOB(Handoff Block)列表,最终将控制权转交到DXE 手中。
UEFI 的一个重要特点是其模块化的设计。模块载入内存后生成Image。Image 的入口函数为_ModuleEntryPoint,PEI 也是一个模块。
3 DXE阶段
DXE(Driver Execution Environment)阶段执行大部分系统初始化工作,进入此阶段时,内存已经可以被完全使用,因而此阶段可以进行大量的复杂工作
4 BDS阶段
BDS(Boot Device Selection)的主要功能是执行启动策略,其主要功能包括:
5 TSL阶段
TSL(Transient System Load)是操作系统加载器(OS Loader)执行的第一阶段,
6 RT阶段
系统进入RT(Run Time)阶段后,系统的控制权从UEFI 内核转交到OS Loader 手中,
UEFI 占用的各种资源被回收到OS Loader,仅有UEFI 运行时服务保留给OS Loader 和OS
使用。随着OS Loader 的执行,OS 最终取得对系统的控制权。
7 AL阶段
在RT 阶段,如果系统(硬件或软件)遇到灾难性错误,系统固件需要提供错误处理和
灾难恢复机制,这种机制运行在AL(After Life)阶段。UEFI 和UEFI PI 标准都没有定义此阶段的行为和规范。
第二章 UEFI开发环境搭建
略(主要一些工具安装以及编译EDK2, 后续有机会以现实环境为例描述)
第三章 UEFI工程模块文件
标准应用程序工程模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块。每个工程模块由两部分组成:工程文件和源文件。
1 .inf 文件
.inf(Module Information File)文件(#后面内容为注释)。.inf 文件是模块的工程文件,其作用相当于Makef ile 文件或Visual Studio 的.proj 文件,用于指导EDK2 编译工具自动编译模块。
工程文件分为很多个块,每个块以 “[块名]” 开头, “[块名]” 必须独占一行。
必须块 | 块描述 |
---|---|
[Defines] | 定义本模块的属性及其他变量,这些变量可在工程文件其他块中引用 |
[Sources] | 列出本模块所有的源文件及资源文件 |
[Packages] | 列出本模块引用到的所有包的包声明文件, 可能引用到的资源包括头文件,GUID, Protocol等这些资源都声明在文件 .dec中 |
[LibraryClasses] | 列出本模块要链接的库模块 |
非必须块 | 块描述 |
---|---|
[Protocols] | 列出本模块用到的Protocol |
[Guids] | 列出本模块用到的GUID |
[BuildOptions] | 指定编译和链接选项 |
2 .dec 文件
.dec 文件定义了公开的数据和接口,供其他模块使用。它包含了必需区块[Defines] 以及可选区块[Includes]、[LibraryClasses]、[Guids]、[Protocols]、[Ppis] 和[PCD] 几个部分。
.dec文件需要被调用模块.inf文件所包含。
块编译生成 .efi 文件, shell 中执行 .efi文件时,Shell首先用gBS->LoadImage() 将 .efi 文件加载到内存生成Image 对象。然后调用gBS->StartImage(Image) 启动这个Image对象(efi 设备路径,命令参数,uefi环境变量 详见EFI_STATUS EFIAPI InternalShellExecuteDevicePath ) 。StartImage 主要作用就是找出可执行程序映像(Image)的入口函数并执行。,对应用程序来说,就是_ModuleEntryPoint 函数。进入_ModuleEntryPoint(配置在.inf块中的入口函数 ) 后,控制权才转交给应用程序(此处就是我们的 .efi)。
[Defines]块用于提供Package的名称、GUID、版本号等信息。
## /EDK2/MdePkg/MdePkg.dec
[Defines]DEC_SPECIFICATION = 0x00010005PACKAGE_NAME = MdePkgPACKAGE_UNI_FILE = MdePkg.uniPACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766PACKAGE_VERSION = 1.06
[Includes]块
列出本Package提供的头文件所在的目录
## /EDK2/MdePkg/MdePkg.dec
[Includes]Include[Includes.IA32]Include/Ia32[Includes.X64]Include/X64
3 .dsc文件
.inf 用于编译一个模块, 而.dsc 文件用于编译一个Package,