- 源码EDK2 : Tianocore
- UEFI源码分析系列第一篇,DXE阶段的初始化与执行流程
源码结构
- MdeModulePkg/
- Core/
- Dxe/
- Dispatcher/ DXE调度器
- DxeMain/ DXE阶段入口函数
- Event/ 异步事件机制
- FwVol/ 闪存文件系统FFS
- FwVolBlock/ 闪存的块操作
- Gcd/ 全局配置数据库
- Hand/ 句柄Handle
- Image/ 镜像文件服务,加载、解析和执行
- Library/ 库函数,三个与lock相关的操作
- Mem/ 内存服务,申请和释放
- Misc/ 其他内容,看门狗、
- SectionExtrantion/
- DxeCore.uni 字符串数据
- DxeCoreExtra.uni 字符串数据
- DxeMain.h 头文件
- DxeMain.inf 模块信息文件
- Dxe/
- Core/
DXE启动阶段
/* Dxe/DxeMain/DxeMain.c */
237 VOID
238 EFIAPI
239 DxeMain (
240 IN VOID *HobStart
241 )
242 {
563 }
DXE入口函数接收PEI阶段构建的HOB数据,HOB数据格式的定义位于/MdePkg/Include/Pi/PiHob.h
PEI阶段通过构建HOB数据,把系统相关的信息传递给DXE阶段,包括但不限于:PEI阶段的内存申请记录、闪存卷(FV)信息、可用内存资源信息、DXE模块数据。
DXE阶段主要使用的几类HOB数据:
- 可用内存资源信息,类型为
EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
,用于初始化内存申请与回收服务,提供申请和回收内存的方法 - DXE模块数据,类型为
EFI_HOB_MEMORY_ALLOCATION
,子类型Name=gEfiHobMemoryAllocModuleGuid
,用于初始化镜像服务,提供加载、解析和执行文件的方法 - 闪存卷信息,FlashVolume,类型为
EFI_HOB_TYPE_FV
,对每个闪存卷建立一个PROTOCOL
用于读取数据。所有的驱动数据从这里面读取,然后调度执行。
269 //
270 // Initialize Memory Services
271 //
272 CoreInitializeMemoryServices (&HobStart, &MemoryBaseAddress, &MemoryLength);
初始化内存服务
276 //
277 // Allocate the EFI System Table and EFI