BIOS PEI Phase涉及模块函数一览

2 篇文章 2 订阅

BootMode

BootMode为启动时的引导方式,uefi和legacy是两种不同的引导方式,uefi是新式的BIOS,legacy是传统BIOS。你在UEFI模式下安装的系统,只能用UEFI模式引导;同理,如果你是在Legacy模式下安装的系统,也只能在legacy模式下进系统。
这个模块提供了确定和更新启动模式的功能:GetBootMode (),SetBootMode ().

PeiGetBootMode()

/**
  该服务使PEIMs能够确定引导模式的当前值。
  @param PeiServices           一个间接指向PEI Foundation发布的EFI_PEI_SERVICES表的指针。
  @param BootMode             一个包含引导模式值的指针。

  @retval EFI_SUCCESS          成功返回启动模式。
  @retval EFI_INVALID_PARAMETER BootMode是NULL。
**/
EFI_STATUS
EFIAPI
PeiGetBootMode (
  IN  CONST EFI_PEI_SERVICES  **PeiServices,
  IN  OUT   EFI_BOOT_MODE     *BootMode
  )

PeiSetBootMode()

/**
  该服务使PEIMs能够更新启动模式变量。
  @param PeiServices      一个间接指向PEI Foundation发布的EFI_PEI_SERVICES表的指针。
  @param BootMode         需要设置的启动模式的值。

  @return EFI_SUCCESS     The value was successfully updated
**/
EFI_STATUS
EFIAPI
PeiSetBootMode (
  IN CONST EFI_PEI_SERVICES  **PeiServices,
  IN EFI_BOOT_MODE           BootMode
  )

CPUIO

PeiServices在PeiCore初始化阶段发布的EFI_PEI_CPU_IO_PPI支持的默认版本。
EFI_PEI_CPU_IO_PPI由某些平台或特定于芯片组的PEIM安装,这些PEIM抽象了处理器可见的I/O操作。当PeiCore启动时,EFI_PEI_CPU_IO_PPI的默认版本将被分配给PeiServices表。
这个默认的EFI_PEI_CPU_IO_PPI安装实例分配给EFI_PEI_SERVICE。PeiCore初始化时的CpuIo。

EFI_PEI_CPU_IO_PPI gPeiDefaultCpuIoPpi = {
  {
    PeiDefaultMemRead,
    PeiDefaultMemWrite
  },
  {
    PeiDefaultIoRead,
    PeiDefaultIoWrite
  },
  PeiDefaultIoRead8,
  PeiDefaultIoRead16,
  PeiDefaultIoRead32,
  PeiDefaultIoRead64,
  PeiDefaultIoWrite8,
  PeiDefaultIoWrite16,
  PeiDefaultIoWrite32,
  PeiDefaultIoWrite64,
  PeiDefaultMemRead8,
  PeiDefaultMemRead16,
  PeiDefaultMemRead32,
  PeiDefaultMemRead64,
  PeiDefaultMemWrite8,
  PeiDefaultMemWrite16,
  PeiDefaultMemWrite32,
  PeiDefaultMemWrite64
};

Dependency

在一个peim 在执行时,有可能会用到其他peim的功能。所以要等其他peim先执行后,并install ppi至 ppi database中,该peim才能使用,该ppi也才能继续执行下去,,这就是dependency。而这些关系记录放在fv的一个特殊的section中,一个peim有可能会需要很多其他peim先执行才能执行,所以表示方法用boolean运算符 and, or, 和sequencing .
此模块包含特定于依赖表达式和局部函数原型的数据。
PEI Dispatcher Dependency Evaluator
这个例程计算一个依赖表达式(DEPENDENCY_EXPRESSION),以确定是否可以计划执行一个驱动程序。可调度性的标准是满足依赖项表达式。

IsPpiInstalled ()

/**
这个例程确定是否安装了PPI。GUID的真值取决于PPI是否已经发布,并且可以从PPI数据库中查询。

  @param PeiServices     An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation
  @param Stack           Reference to EVAL_STACK_ENTRY that contains PPI GUID to check

  @retval TRUE  if the PPI is already installed.
  @retval FALSE if the PPI has yet to be installed.

**/
BOOLEAN
IsPpiInstalled (
  IN EFI_PEI_SERVICES  **PeiServices,
  IN EVAL_STACK_ENTRY  *Stack
  )
  {
  // 判断GUID是否需要计算,如果没有GUID需要计算,只在堆栈上返回当前的结果。
  
  // 将Guid复制到locale变量中,这样在交叉编译环境(如Intel?Itanium(TM))中就不会出现对齐错误。
  
  // 检查PPI是否安装。返回状态值 TRUE or FALSE
  
  }

PeimDispatchReadiness()

/**
 这是依赖求值器的后缀版本。当遇到PUSH [PPI GUID]时,GUID的指针被存储在计算堆栈中。当从评估堆栈中弹出该条目时,将检查PPI是否已安装。这种方法可以节省一些时间,因为并不是所有的PPIs都必须检查特定的操作类型(和,或)。

  @param PeiServices            一个间接指向PEI Foundation发布的EFI_PEI_SERVICES表的指针
  @param DependencyExpression   指向依赖表达式的指针。语法遵循上面描述的BNF,并以后缀表示法存储。

  @retval TRUE      if it is a well-formed Grammar
  @retval FALSE     if the dependency expression overflows the evaluation stack
                    if the dependency expression underflows the evaluation stack
                    if the dependency expression is not a well-formed Grammar.
**/
BOOLEAN
PeimDispatchReadiness (
  IN EFI_PEI_SERVICES   **PeiServices,
  IN VOID               *DependencyExpression
  )
{
  DEPENDENCY_EXPRESSION_OPERAND  *Iterator;//此模块包含特定于依赖表达式和局部函数原型的数据。
  EVAL_STACK_ENTRY               *StackPtr;
  EVAL_STACK_ENTRY               EvalStack[MAX_GRAMMAR_SIZE];
  
  // 检查以确保在推送时依赖语法没有溢出EvalStack

  // 将指针推入推操作符(指向PPI GUID的指针),我们将计算在弹出操作中是否安装了PPI。

  // 检查以确保依赖语法没有在AND操作的两个pop上的EvalStack下溢。不需要检查在推送结果时是否溢出,因为我们已经执行了两次pop。

 // 
}

dispatcher

EFI PEI核心调度服务,pei dispatcher 为pei core 的一部分,用来搜寻和执行peim.
从Windows角度来说,在WPF或WinForm应用程序中,主线程负责接收输入、处理事件、绘制屏幕等工作,为了使主线程及时响应,防止假死,在开发过程中对一些耗时的操作、消耗资源比较多的操作,都会去创建一个或多个子线程去完成操作,比如大数据量的循环操作、后台下载。这样一来,由于UI界面是主线程创建的,所以子线程不能直接更新由主线程维护的UI界面。Dispatcher的作用是用于管理线程工作项队列,类似于Win32中的消息队列,Dispatcher的内部函数,仍然调用了传统的创建窗口类,创建窗口,建立消息泵等操作。Dispatcher本身是一个单例模式,构造函数私有,暴露了一个静态的CurrentDispatcher方法用于获得当前线程的Dispatcher。

DiscoverPeimsAndOrderWithApriori ():在一个FV中发现所有的Peims和可选的Apriori文件。一个FV中最多有一个先验文件。

这是DxeCore初始化所需的最小内存。当LMFA特性启用时,这部分内存仍然需要保留在内存的最顶部,以便DXE内核可以使用这些内存进行数据初始化。这个宏应该与DXE内核中定义的宏同步。
#define MINIMUM_INITIAL_MEMORY_SIZE 0x10000

此函数用于测试resource HOB中描述的内存范围是否可用。
这个函数只有在启用了LMFA(加载固定地址模块)特性时才会被调用。一些平台可能会在调用PeiLoadFixAddressHook之前分配内存。因此,这个函数用于测试输入资源HOB所描述的内存范围是否可用。
PeiLoadFixAddressIsMemoryRangeAvailable ();

用于加载固定地址模块的HOOK函数
这个函数只有在启用了LMFA(加载固定地址模块)特性时才会被调用。当feature被配置为Load Modules at Fix Absolute Address时,此函数将验证用户分配的顶部地址。当feature被配置为固定偏移量的加载模块时,函数将查找通常为TOLM-TSEG的顶部地址。而且该功能还将重新安装PEI 内存。
PeiLoadFixAddressHook();

PeiCoreEntry ( ):这个例程在交换机堆栈中作为PeiCore Entry调用。

PeiCheckAndSwitchStack ():SwitchStackSignal为TRUE时,检查SwitchStackSignal和switchstack。

PeiDispatcher (): Conduct PEIM dispatch.

InitializeDispatcherData ():初始化Dispatcher程序的数据成员

DepexSatisfied (): 这个例程解析依赖表达式(如果可用),并决定模块是否可以执行。

PeiRegisterForShadow ():这个例程使PEIM能够在PEI Foundation发现永久内存时将shadow自己到内存中。

如何dispatch other fv?
不一定所有的peim都在bfv中,有可能在其他的fv,所以要用dispatch other fv的机制。此时需要一个特别的peim来告诉pei core 说其他fv还有peim要dispatch, 所以当pei core dispatch 到这个peim时,会把其他peim的dispatch顺序加到pei core 的搜寻algorithm中。

FwVol

Pei核心固件文件系统服务程序。FV: firmware volume
FV:固件卷,指在FD上一个连续的部分,我们可以把它看成一个逻辑设备,因为我们代码真正操作的是FV,而非FD。我们经常提到的FFS的概念也是以FV的形式存在,它描述了FV中的文件组织方式。FV之于FD,类似于thread之于package。

FfsAttributes2FvFileAttributes ():转换FFS文件属性为FV文件属性。

GetFileState():返回由state字段中最高零位设置的文件状态

CalculateHeaderChecksum ():计算文件头的checksum。Checksum:总和检验码,校验和。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。通常是以十六进制为数制表示的形式。
【作用】就是用于检查文件完整性,检测文件是否被恶意篡改,比如文件传输(如插件、固件升级包等)场景使用。

FileHandleToVolume ():根据FV中的FileHandle找到FV处理程序。

**FindFileEx()😗*给定输入文件指针,搜索SearchType定义的FFS卷中的第一个匹配文件。搜索从FwVolHeader定义的固件卷中的文件头开始。

PeiInitializeFv ():Initialize PeiCore Fv List.

FirmwareVolmeInfoPpiNotifyCallback ():在FvInfoPPI或FvInfo2PPI安装后处理固件卷信息。FV信息将注册到PeiCore私有数据结构中。并且搜索里面的FV图像,如果找到,新的FVINFO(2)PPI将被安装。

VerifyGuidedSectionGuid ():通过检查是否有引导部分GUID HOB记录了GUID本身来验证引导部分GUID。

ProcessSection ():在文件中搜索SectionType部分。递归地在封装部分(压缩和引导)内搜索,直到找到匹配部分。

PeiFfsFindSectionData ():在指定的文件中搜索下一个匹配部分。

PeiFfsFindSectionData3 ():在指定的文件中搜索下一个匹配部分。

PeiFfsFindNextFile ():在固件卷中搜索下一个匹配文件。

PeiFfsFindNextVolume ():通过索引搜索固件卷

PeiFfsFindFileByName ():根据卷的名称查找卷中的文件。

PeiFfsGetFileInfo ():返回关于特定文件的信息。

PeiFfsGetFileInfo2 ():返回关于特定文件的信息。

PeiFfsGetVolumeInfo ():返回指定卷的信息。这个函数返回关于特定固件卷的信息,包括它的名称、类型、属性、起始地址和大小。

ProcessFvFile ():从Fv类型文件中获取Fv图像,然后安装Fv INFO(2) ppi,构建Fv hob。

PeiFfsFvPpiProcessVolume ():处理firmware卷并创建卷句柄。根据缓冲区中的信息创建一个卷句柄。formmemory映射的固件卷、Buffer和BufferSize指的是固件卷的开始和固件卷大小。对于非内存映射的固件卷,它指向一个缓冲区,该缓冲区包含创建固件卷句柄所需的信息。通常,这些值来自EFI_FIRMWARE_VOLUME_INFO_PPI。

PeiFfsFvPpiFindFileByType ():查找指定类型的下一个文件。这项服务使PEI模块能够发现额外的固件文件。文件句柄在系统中必须是唯一的。

PeiFfsFvPpiFindFileByName ();根据卷的名称查找卷中的文件。此服务在指定的固件卷或所有固件卷中搜索具有特定名称的文件。

PeiFfsFvPpiGetFileInfo (): 返回关于特定文件的信息。这个函数返回关于特定文件的信息,包括文件名、类型、属性、起始地址和大小。

PeiFfsFvPpiGetFileInfo2 ():返回关于特定文件的信息。这个函数返回关于特定文件的信息,包括文件名、类型、属性、起始地址、大小和身份验证状态。

PeiFfsFvPpiGetVolumeInfo ():该函数返回有关固件卷的信息。

PeiFfsFvPpiFindSectionByType ():在固件文件中找到下一个匹配部分。该服务使PEI模块能够在有效的文件中发现给定类型的部分。

PeiFfsFvPpiFindSectionByType2 ():在固件文件中找到下一个匹配部分。该服务使PEI模块能够在有效的文件中发现给定实例和类型的部分。

FvHandleToCoreHandle ():将FV的句柄转换为对应的PEI_CORE_FV_HANDLE的指针。

FindNextCoreFvHandle ():根据给定的索引获取下一个卷的PEI_CORE_FV_HANDLE实例。这个程序也将安装FvInfo ppi为FV hob在PI方式。

PeiReinitializeFv ():在PeiCore映像被映射到永久内存中之后,所有内置的FvPpi应该被重新安装到永久内存中,实例应该被安装在PrivateData->Fv[]数组中的所有缓存的FvPpi指针应该被固定为指向永久内存中的FvPpi指针。

AddUnknownFormatFvInfo ():以未知的第三方格式报告新发现的FV的信息。如果没有安装第三方FV格式的EFI_PEI_FIRMWARE_VOLUME_PPI,但是已经发现了这种格式的FV,那么这个FV的信息将缓存在PEI_CORE_INSTANCE的UnknownFvInfo数组中。另外,还会为未知的第三方FV格式guid安装一个通知,如果稍后平台的PEIM安装了EFI_PEI_FIRMWARE_VOLUME_PPI,则将使用新安装的EFI_PEI_FIRMWARE_VOLUME_PPI来处理原始的未知第三方FV。

FindUnknownFormatFvInfo ():根据第三方FV格式guid查找FV信息。这个例程也会从PrivateData->UnknownFvInfo[]中删除给定的FV格式guid找到的FV信息。

ThirdPartyFvPpiNotifyCallback ():EFI_PEI_FIRMWARE_VOLUME_PPI的通知回调函数。当安装EFI_PEI_FIRMWARE_VOLUME_PPI以支持新的FV格式时,将调用这个例程来处理所有发现的以这种格式存在的FV。

HOB

由pei 阶段传送给dxe的信息只能通过hob来传送,所以它包含dxe所需的所有信息,如phit, physical memory,firmware volume ,dxe core, dxe stack/bsp, guid hob, 它是linking list的数据结构,标头为phit,其中包含了boot mode的信息,尾巴是termination.如果搜寻hob时找到termination表示没有些hob,guid hob 是由chipset vendor 提供的信息,有自己的格式,不想被其他人所使用,是属于private information.

PEI生产HOB,DXE消费HOB,在这里需要注意HOB只有在PEI阶段是可修改的,在DXE阶段是只读的,每一个Block都有自己的GUID与Struct。所有的Hob放在一段连续的内存里面,由一个以定义好的头去标识,这个头(header) 叫 Phase Handoff Information Table(PHIT). 我们把PHIT 和当前所有的hob 合在一起叫Hob list.PHIT的位置由GetHobList 这个系统服务区获得。

PeiGetHobList ():获取指向HOB列表的指针。

/**
  向HOB列表中添加一个新的HOB。创建请求类型的HOB数据块,并返回HOB数据块的地址。

  @param PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param Type             Type of the new HOB.
  @param Length           Length of the new HOB to allocate.
  @param Hob              Pointer to the new HOB.
**/
EFI_STATUS
EFIAPI
PeiCreateHob (
  IN CONST EFI_PEI_SERVICES  **PeiServices,
  IN UINT16            Type,
  IN UINT16            Length,
  IN OUT VOID          **Hob
  )
{
  EFI_STATUS                           Status; 
  EFI_HOB_HANDOFF_INFO_TABLE           *HandOffHob;
  EFI_HOB_GENERIC_HEADER               *HobEnd;
  EFI_PHYSICAL_ADDRESS                 FreeMemory;

  // 获得HOB列表的起始地址。
  Status = PeiGetHobList (PeiServices, Hob);
  if (EFI_ERROR(Status)) {
    return Status;
  }
  
  // HOB列表的起始是HandOffHob 数据块,存储当前的系统信息。
  HandOffHob = *Hob;

  //
  // Check Length to avoid data overflow. 
  // 调整新创建HOB长度为8字节对齐,并计算当前可用的HOB数据块的空间。
  //
  if (0x10000 - Length <= 0x7) {
    return EFI_INVALID_PARAMETER;
  }
  Length     = (UINT16)((Length + 0x7) & (~0x7));

  FreeMemory = HandOffHob->EfiFreeMemoryTop -
               HandOffHob->EfiFreeMemoryBottom;

 //  如果可用的空间不足够创建请求的HOB时,则打印出调试信息说明当前系统资源不足够满足系统运行,并返回系统资源不够的状态值。
  if (FreeMemory < Length) {
    DEBUG ((EFI_D_ERROR, "PeiCreateHob fail: Length - 0x%08x\n", (UINTN)Length));
    DEBUG ((EFI_D_ERROR, "  FreeMemoryTop    - 0x%08x\n", (UINTN)HandOffHob->EfiFreeMemoryTop));
    DEBUG ((EFI_D_ERROR, "  FreeMemoryBottom - 0x%08x\n", (UINTN)HandOffHob->EfiFreeMemoryBottom));
    return EFI_OUT_OF_RESOURCES;
  }
  
  // 当空间足够时,追加新的HOB在当前HOB列表的最末端,并记录HOB数据块的地址。
  *Hob = (VOID*) (UINTN) HandOffHob->EfiEndOfHobList;
  ((EFI_HOB_GENERIC_HEADER*) *Hob)->HobType   = Type;
  ((EFI_HOB_GENERIC_HEADER*) *Hob)->HobLength = Length;
  ((EFI_HOB_GENERIC_HEADER*) *Hob)->Reserved  = 0;
  
  HobEnd = (EFI_HOB_GENERIC_HEADER*) ((UINTN) *Hob + Length);
  HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;
 
  // 更新可用空间的末端地址,因为新的HOB占用了一部分空间。
  HobEnd->HobType   = EFI_HOB_TYPE_END_OF_HOB_LIST;
  HobEnd->HobLength = (UINT16) sizeof (EFI_HOB_GENERIC_HEADER);
  HobEnd->Reserved  = 0;
  HobEnd++;
  HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;
  return EFI_SUCCESS;   
}

PeiCoreBuildHobHandoffInfoTable ():构建一个切换信息表HOB

Image

Pei Core Load Image Support.

PeiImageRead ():支持PE/COFF加载器从PE/COFF文件中读取缓冲区的例程。这个函数用于优化XIP代码的内存复制。

PeiImageReadForShadow ():支持PE/COFF加载器从PE/COFF文件中读取缓冲区的例程。为了支持映射shadow,该函数被实现为PIC。

GetImageReadFunction ():支持例程获取图像读取文件的功能。

CheckAndMarkFixLoadingMemoryUsageBitMap ():检查内存使用位映射数组,以确定将加载图像的内存范围是否可用。如果内存范围是可用的,函数将相应的位标记为1,表示使用的内存范围。该函数仅在启用固定地址加载模块特性时才会被调用。

GetPeCoffImageFixLoadingAssignedAddress():从构建工具分配的图像头中获取固定的加载地址。这个函数只在加载固定地址模块时被调用。

LoadAndRelocatePeCoffImage ():将PE/COFF映像加载并重新定位到内存中。如果图像是不可重定位的,它就不会被加载到内存中,而是作为XIP图像加载。

PeiLoadImageLoadImage ():将PEIM加载到内存中以便后续执行。如果由于性能原因需要将压缩图像或图像重新定位到内存中,该服务将执行该转换。

PeiLoadImageLoadImageWrapper ():PeiLoadImageLoadImage()的包装函数。

RelocationIsStrip ():检查输入图像是否有重定位。

PeiLoadImage ():例程加载图像文件,以供后续执行LoadFile Ppi。如果没有找到任何LoadFile Ppi,则使用PE32+/TE XIP图像格式的内置支持函数。

InitializeImageServices ():安装Pei加载文件PPI

Memory

EFI PEI核心内存服务,PEI非常重要的一个就是初始化内存,建立内存信息,然后传给下一个阶段。为了完成PEI 的这些任务,它也需要有内存管理。PEI Core的Image service基于PeiImageRead()从flash的读取BFV内的FFS文件并从中查找PE/TE格式可执行文件,relocates到永久DDR RAM当中以备PEI第二阶段执行,或读取查找其他类型文件。

InitializeMemoryServices ():初始化内存服务。

PeiInstallPeiMemory ():该功能向PEI Foundation注册发现的内存配置。

PeiAllocatePages ():该服务的目的是发布一个接口,允许PEIMs分配由PEI Foundation管理的内存范围。

PeiAllocatePool ():内存池分配服务。在发现永久内存之前,将在临时内存中为池分配堆。通常,临时内存中的堆大小不会超过64K,因此可以分配的最大池大小是64K。

PciCfg2

PeiServices在PeiCore初始化阶段发布的EFI_PEI_PCI_CFG2_PPI支持的默认版本。EFI_PEI_PCI_CFG2_PPI由支持PCI根桥的PEIM安装。当PeiCore启动时,EFI_PEI_PCI_CFG2_PPI的默认版本将被分配给PeiServices表。

//将EFI_PEI_PCI_CFG2_PPI安装的默认实例分配给EFI_PEI_SERVICE。PeiCore初始化时的PciCfg。
EFI_PEI_PCI_CFG2_PPI gPeiDefaultPciCfg2Ppi = {
  PeiDefaultPciCfg2Read,
  PeiDefaultPciCfg2Write,
  PeiDefaultPciCfg2Modify
};

PeiDefaultPciCfg2Read ():从PCI配置空间中的给定位置读取数据。如果平台/芯片组PEIM没有安装EFI_PEI_PCI_CFG2_PPI,则返回EFI_NOT_YET_AVAILABLE。

PeiDefaultPciCfg2Write ():写入PCI配置空间中的给定位置。如果平台/芯片组PEIM没有安装EFI_PEI_PCI_CFG2_PPI,则返回EFI_NOT_YET_AVAILABLE。

PeiDefaultPciCfg2Modify ():此函数对PCI配置空间中给定位置的内容执行读-修改-写操作。如果平台/芯片组PEIM没有安装EFI_PEI_PCI_CFG2_PPI,则返回EFI_NOT_YET_AVAILABLE。

PPI

ppi(PEIM to PEIM Interface)是peim 和peim 的沟通介面,当peim需要提供功能给其他peim使用时,需要先install 一个PPI至ppi database中,或者说一个PEIM通过PEI Service InstallPPI()和ReinstallPPI()来发布一个有效的PPI到PPI Database其他的PEIM通过PEI Service LocatePPI()来找到相关的PPI。 ppi 的标识为guid和interface.guid是128位的数据,它是唯一性的,即使不同的在同一时间建立也不会相同,Interface是一个function pointer, 用来指向ppi 所提供的function.应该说interface 指向一堆数据,可以是一个函数指针,也可以是多个。

InitializePpiServices ():初始化PPI服务。

ConvertSinglePpiPointer ():将单个PPI指针从临时内存迁移到PEI安装的内存中。

ConvertPpiPointers ():将PPI指针从临时内存堆栈迁移到PEI安装的内存中。

PeiInstallPpi ():这个函数通过GUID在PEI PPI数据库中安装一个接口。服务的目的是发布一个接口,其他各方可以使用该接口调用额外的PEIMs。

PeiReInstallPpi ():这个函数通过GUID在PEI PPI数据库中重新安装一个接口。服务的目的是发布一个接口,其他各方可以使用该接口用不同的接口替换协议数据库中同名的接口。

PeiLocatePpi ():Locate一个给定的指定PPI。

PeiNotifyPpi ():此函数安装通知服务,以便在安装或重新安装给定接口时回调该服务。服务的目的是发布一个接口,其他各方可以使用该接口来调用以后可能实现的其他PPIs。

ProcessNotifyList ():在调度级别处理通知列表。

DispatchNotify ():Dispatch notifications.

Reset

PeiResetSystem ():核心版本的复位系统。

PeiResetSystem2 ():重置整个平台。

Security

InitializeSecurityServices ():初始化安全服务。

SecurityPpiNotifyCallback ():在安装安全PPI时提供回调。这个程序将把安装的安全PPI缓存到PeiCore的私人数据中。

VerifyPeim ():提供对安全验证服务的调用。

VerifyFv ():验证固件卷。

StatusCode

PeiReportStatusCode ():状态代码报告程序的核心版本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值