目录
UEFI系统从上电到关机可以分成七个阶段:
SEC(安全验证) → PEI(EFI前期初始化) → DXE(驱动执行环境) → BDS(启动设备选择) → TSL(操作系统加载前期) → RT(Run Time) → AL(系统灾难恢复期)
EFI Boot Overview
1.SEC阶段
从功能上讲主要执行4个任务
- 接受并处理系统上电或重启。系统加电信号、系统重启信号、系统运行过程中的严重异常信号。
- 创建临时存储。系统运行在SEC阶段时,仅CPU和CPU内部资源被初始化,各种外部设备和内存都没有被初始化,因而系统需要一些临时RAM区域,用于代码和数据的存取,称之为临时RAM,以示与内存的区别。这些临时RAM只能位于CPU内部。最常用的RAM时Cache,当Cache被配置为no-eviction模式时,可以作为内存使用,读命中时返回Cache中的数据,读缺失时不会向主存发出缺失事件;写命中时将数据写入Cache,写缺失时不会向主存发出缺失事件,这种技术称为CAR(Cache As Ram)。
- 提供安全信任链的根。SEC阶段是整个可信系统的根基,为保证执行代码是可信的,通常会在改阶段对PEI加载映像进行HASH校验。
- 传送系统参数到下一阶段(即PEI)移交控制权并将现阶段成果汇报给PEI。将以下信息作为参数传递给PEI的入口函数。
▷ 系统当前状态,PEI可以根据这些状态判断系统的健康状况。
▷ 可启动固件(BFV:Boot Firmware Volume)的地址和大小。
▷ 临时RAM区域的地址和大小。
▷ 栈的地址和大小。
在SEC Core中需要汇编做一些C语言无法处理的工作
– C语言无法处理CPU的特殊寄存器
– C语言需要Memory来作为变数缓冲区
以下为SEC阶段的执行流程
这里的Reset Vector意指重启向量。X86 架构CPU在启动后,将从地址0xFFFFFFF0处开始执行(此地址并非内存地址。因为这时内存还远没有进行初始化)
上电 → 上电时序 → 第一条指令 → Reset Vector → SEC 入口 → PEI 入口
这里 90 90就是CPU上电后执行的第一条指令,这两个字节表示两条指令NOP NOP意思是CPU什么都不做,等待两个指令周期。
EFI_SEC_PEI_HAND_OFF结构包含SEC->PEI交接时所需要的信息。
///
/// EFI_SEC_PEI_HAND_OFF structure holds information about
/// PEI core's operating environment, such as the size of location of
/// temporary RAM, the stack location and BFV location.
///
typedef struct _EFI_SEC_PEI_HAND_OFF {
///
/// Size of the data structure.
///
UINT16 DataSize;
///
/// Points to the first byte of the boot firmware volume,
/// which the PEI Dispatcher should search for
/// PEI modules.
///
VOID *BootFirmwareVolumeBase;
///
/// Size of the boot firmware volume, in bytes.
///
UINTN BootFirmwareVolumeSize;
///
/// Points to the first byte of the temporary RAM.
///
VOID *TemporaryRamBase;
///
/// Size of the temporary RAM, in bytes.
///
UINTN TemporaryRamSize;
///
/// Points to the first byte of the temporary RAM
/// available for use by the PEI Foundation. The area
/// described by PeiTemporaryRamBase and PeiTemporaryRamSize
/// must not extend outside beyond the area described by
/// TemporaryRamBase & TemporaryRamSize. This area should not
/// overlap with the area reported by StackBase and
/// StackSize.
///
VOID *PeiTemporaryRamBase;
///
/// The size of the available temporary RAM available for
/// use by the PEI Foundation, in bytes.
///
UINTN PeiTemporaryRamSize;
///
/// Points to the first byte of the stack.
/// This are may be part of the memory described by
/// TemporaryRamBase and TemporaryRamSize
/// or may be an entirely separate area.
///
VOID *StackBase;
///
/// Size of the stack, in bytes.
///
UINTN StackSize;
} EFI_SEC_PEI_HAND_OFF;
2.PEI阶段
内存到PEI后期才被初始化,主要功能是为DXE准备执行环境,将需要传递到DXE的信息组成HOB List,并将控制权移交给下一阶段。包含:
- 基本的Chipset初始化
- Memory Sizing
- BIOS Recovery
- ACPI S3 Resume
- 切换 Stack to Memory
- 启动DxeIpl (DXE Initial Program Loader)
PEI阶段一些重要的概念:
1)PEIM (Pre-EFI Initialization Module):
• 初始化一些永久内存补充
• 描述切换块(HOB)中的内存
• 描述HOB中的固件卷位置
• 将控制权传递到驱动程序执行环境(DXE)阶段
2) PEI Services: PEI Foundation 建立一个名为PEI Services的系统表,该表对系统中的所有 PEIM 可见。
• InstallPpi() : 此函数按 GUID 在 PEI PPI数据库中安装一个接口。该服务的目的是发布一个接口,其他方可以使用该接口来调用其他 PEIMs
• ReinstallPpi() : 此函数按GUID在PEI PPI数据库中重新安装接口。该服务的目的是发布一个接口,其他方可以使用该接口将协议数据库中的同名接口替换为不同的接口。
• LocatePpi() : 此函数通过GUID在PEI PPI数据库中定位接口。
• NotifyPpi() : 此函数安装通知服务,以便在已安装或重新安装给定接口时调用该服务。该服务的目的是发布一个接口,供其他各方用来调用以后可能出现的其他 PPI
3)PEI Foundation 负责的事项有:
①成功调度PEIMs
②维护引导模式(boot mode)
③初始化永久内存
④调用DXE加载程序
PEI Foundation 以PEI Dispatcher为中心。Dispatcher的工作是以有序的方式将控制权交给PEIM。PEI Foundation 还协助PEIM与PEIM的沟通。模块间通信的中心资源涉及PPI。PPI引用的编组可以使用可安装接口或通知接口进行。
4)PEI Dispatcher :PEI Dispatcher的工作是以有序的方式将控制权交给PEIM
5)PEIM-to-PEIM Interface (PPI) :PEIMs之间的相互通信叫做 PEIM-to-PEIM Interface (PPI).
包含GUID/Pointer
6)PEI to DXE HandOff :PEI Foundation使用一个名为DXE初始程序加载(IPL)PPI的特殊PPI来发现和调度DXE Foundation以及运行DXE Foundation所需的组件。PEI Foundation的最终操作是定位并将控制权传递给DXE IPL PPI。为了实现这一点,PEI Foundation通过GUID扫描所有PPI,寻找与DXE IPL PPI匹配的GUID。此PPI的GUID在EFI_DXE_IPL_PPI中定义。
当DXE IPL PPI调用DXE Foundation时,它将切换块(HOB)列表从PEI传递给DXE Foundation。切换状态以HOB列表中的HOB的形式来描述。HOB列表必须至少包含HOB列表中所需HOB类型中列出的HOB。
3.DXE阶段
DXE 阶段是执行大部分系统初始化的阶段,进入此阶段时,内存已经可以被完全使用,因而此阶段可以进行大量的复杂工作。
DXE阶段包含:
• DXE Foundation (Produces a set of Boot Services, Runtime Services, and DXE Services)
• DXE Dispatcher (负责按正确顺序查找和执行DXE驱动程序)
• 一套 DXE 驱动程序 (DXE驱动程序负责初始化处理器、芯片组和平台组件,并为系统服务、控制台设备和引导设备提供软件抽象)
DXE阶段不需要执行PEI阶段。执行DXE阶段的唯一要求是存在有效的HOB列表。
4.BDS阶段
主要功能是执行启动策略,主要功能包括
▷ 初始化控制台设备
▷ 加载必要的设备驱动
▷ 根据系统设置加载和执行启动项
在DXE阶段加载的各个驱动,将在此阶段誉系统中的硬件进行匹配连接,使各个启动设备可以进行读写。若加载启动项失败,系统将重新执行DXE Dispatcher以加载更多的驱动,然后重新尝试加载启动项。
5.TSL阶段
TSL (Transient System Load)阶段被称为临时系统,是UEFI将系统控制权转移给操作系统的一个中间时段。这一阶段的OS Loader是作为UEFI应用程序在执行的,当启动服务的ExitBootServices()被调用后,系统进入RT阶段。
6.RT阶段
该阶段,OS的控制权从UEFI内核移交给OS Loader手中,UEFI的各种系统资源也被转移,启动服务不能再使用,仅保留运行时服务供OS Loader和OS使用。
7.AL阶段
遇到灾难性错误,系统固件需要提供错误处理和灾难恢复机制。这种机制在AL(After Life)阶段。同样一些异步事件(SMI中断或NMI中断)的处罚也可进入该阶段。
本文参考资料:
《UEFI内核导读》《UEFI原理与编程》《PI Spec》