Bootstrap

UEFI原理与编程(一)

第一章 UEFI概述(Unified Extensible Firmware Interface 统一的可扩展固件接口)

常见缩写及描述:

缩略词全名描述
UEFIUnified Extensible Firmware Interface统一的可扩展固件接口
BSBoot Services启动服务
RTRuntime Service运行时服务
BIOSBasic Input Output System基本输入输出系统

1.2.3 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              = 0x00010005
  PACKAGE_NAME                   = MdePkg
  PACKAGE_UNI_FILE               = MdePkg.uni
  PACKAGE_GUID                   = 1E73767F-8F52-4603-AEB4-F29B510B6766
  PACKAGE_VERSION                = 1.06

[Includes]块
列出本Package提供的头文件所在的目录

## /EDK2/MdePkg/MdePkg.dec
[Includes]
  Include

[Includes.IA32]
  Include/Ia32

[Includes.X64]
  Include/X64

3 .dsc文件

.inf 用于编译一个模块, 而.dsc 文件用于编译一个Package,


参考文档: UEFI原理与编程 戴正华 机械工业出版社

;