UEFI.源码分析.DXE阶段的执行
Posted 木艮氵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UEFI.源码分析.DXE阶段的执行相关的知识,希望对你有一定的参考价值。
- 源码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 Runtime Service Table from EfiRuntimeServicesData
278 // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
279 //
280 gDxeCoreST = AllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE), &mEfiSystemTableTemplate);
281 ASSERT (gDxeCoreST != NULL);
282
283 gDxeCoreRT = AllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES), &mEfiRuntimeServicesTableTemplate);
284 ASSERT (gDxeCoreRT != NULL);
285
286 gDxeCoreST->RuntimeServices = gDxeCoreRT;
调用内存服务,为系统表和运行时服务申请内存空间
288 //
289 // Start the Image Services.
290 //
291 Status = CoreInitializeImageServices (HobStart);
292 ASSERT_EFI_ERROR (Status);
初始化镜像服务
294 //
295 // Initialize the Global Coherency Domain Services
296 //
297 Status = CoreInitializeGcdServices (&HobStart, MemoryBaseAddress, MemoryLength);
298 ASSERT_EFI_ERROR (Status);
初始化全局配置数据库服务
300 //
301 // Call constructor for all libraries
302 //
303 ProcessLibraryConstructorList (gDxeCoreImageHandle, gDxeCoreST);
调用所有库模块的构造函数,该函数由预处理的python脚本生成,位于edk2/Build/$CompiledPkgName/DEBUG_GCC44/$ARCH/MdeModulePkg/Core/Dxe/DxeMain/DEBUG
目录下的AutoGen.c
文件中。
由 inf 文件可知DXE模块所需的库
82 [LibraryClasses]
83 BaseMemoryLib
84 CacheMaintenanceLib
85 UefiDecompressLib
86 PerformanceLib
87 HobLib
88 BaseLib
89 UefiLib
90 DebugLib
91 DxeCoreEntryPoint
92 PeCoffLib
93 PeCoffGetEntryPointLib
94 PeCoffExtraActionLib
95 ExtractGuidedSectionLib
96 MemoryAllocationLib
97 UefiBootServicesTableLib
98 DevicePathLib
99 ReportStatusCodeLib
100 TimerLib
101 DxeServicesLib
102 DebugAgentLib
103 CpuExceptionHandlerLib
104 PcdLib
自动生成的构造函数如下
VOID
EFIAPI
ProcessLibraryConstructorList (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
EFI_STATUS Status;
Status = BaseDebugLibSerialPortConstructor ();
ASSERT_EFI_ERROR (Status);
Status = UefiRuntimeServicesTableLibConstructor (ImageHandle, SystemTable);
ASSERT_EFI_ERROR (Status);
Status = UefiBootServicesTableLibConstructor (ImageHandle, SystemTable);
ASSERT_EFI_ERROR (Status);
Status = UefiLibConstructor (ImageHandle, SystemTable);
ASSERT_EFI_ERROR (Status);
Status = DxeExtractGuidedSectionLibConstructor (ImageHandle, SystemTable);
ASSERT_EFI_ERROR (Status);
Status = LzmaDecompressLibConstructor ();
ASSERT_EFI_ERROR (Status);
424 //
425 // Initialize the Event Services
426 //
427 Status = CoreInitializeEventServices ();
428 ASSERT_EFI_ERROR (Status);
初始化异步事件服务
484 //
485 // Produce Firmware Volume Protocols, one for each FV in the HOB list
486 //
487 Status = FwVolBlockDriverInit (gDxeCoreImageHandle, gDxeCoreST);
488 ASSERT_EFI_ERROR (Status);
489
490 Status = FwVolDriverInit (gDxeCoreImageHandle, gDxeCoreST);
491 ASSERT_EFI_ERROR (Status);
初始化闪存文件服务,针对HOB所描述的每个FlashVolume建立一个协议
499 //
500 // Initialize the DXE Dispatcher
501 //
502 PERF_START (NULL,"CoreInitializeDispatcher", "DxeMain", 0) ;
503 CoreInitializeDispatcher ();
504 PERF_END (NULL,"CoreInitializeDispatcher", "DxeMain", 0) ;
505
506 //
507 // Invoke the DXE Dispatcher
508 //
509 PERF_START (NULL, "CoreDispatcher", "DxeMain", 0);
510 CoreDispatcher ();
511 PERF_END (NULL, "CoreDispatcher", "DxeMain", 0);
初始化调度器,并执行调度
551 //
552 // Transfer control to the BDS Architectural Protocol
553 //
554 gBds->Entry (gBds);
555
556 //
557 // BDS should never return
558 //
559 ASSERT (FALSE);
560 CpuDeadLoop ();
通过全局变量gBds进入BDS阶段
代码详解目录
- 启动服务Boot Services
- 内存服务 Memory
- 异步事件服务 Event Timer TPL
- 镜像服务 Image
- 句柄和协议服务 Handle and Protocol
- 运行时服务 Runtime Services
- 变量服务 Variable
后续详述
参考文献
以上是关于UEFI.源码分析.DXE阶段的执行的主要内容,如果未能解决你的问题,请参考以下文章
UEFI.源码分析.DXE的内存服务.第三部分.HeapGuard
UEFI.源码分析.DXE的异步事件服务.第一部分.事件驱动
UEFI.源码分析.DXE的异步事件服务.第一部分.事件驱动