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启动阶段


/* 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数据:

  1. 可用内存资源信息,类型为EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,用于初始化内存申请与回收服务,提供申请和回收内存的方法
  2. DXE模块数据,类型为EFI_HOB_MEMORY_ALLOCATION,子类型Name=gEfiHobMemoryAllocModuleGuid,用于初始化镜像服务,提供加载、解析和执行文件的方法
  3. 闪存卷信息,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的内存服务.第一部分.初始化

UEFI.源码分析.DXE的内存服务.第三部分.HeapGuard

UEFI.源码分析.DXE的异步事件服务.第一部分.事件驱动

UEFI.源码分析.DXE的异步事件服务.第一部分.事件驱动

UEFI.源码分析.DXE的异步事件服务.第二部分.任务优先级

UEFI.源码分析.DXE的异步事件服务.第二部分.任务优先级