马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
PEI Services
1. PEI Services Table先容
PEI Foundation创建了一个名为PEI Services Table的体系表,该表对体系中的全部Pre-EFI初始化模块(PEIMs)可见。
PEI Foundation在体系初始化时所必要的功能、下令或其他本领,会被抽象然后界说在PEI Services Table中。
由于PEI阶段直到阶段末端才有永世性内存可用,因此PEI阶段创建的服务范围无法像后续阶段那样丰富。
由于PEI Foundation及其暂时RAM的位置在构建时未知,因此在每个PEIM的入口点以及每个PEIM到PEIM接口(PPI)的一部分中转达了PEI Services表的指针。
- 比如下面这个例子,update boot mode的函数:
- //
- // update boot mode
- //
- ...
- ...
- Status = (*PeiServices)->GetBootMode (PeiServices, &BootMode);
- ...
复制代码 当它在调用GetBootMode这个PPI时,也将PeiServices这个指针作为参数一起传入了。
趁便,我们可以看一下GetBootMode是怎样实现的。- /**
- EFI_BOOT_MODE GetBootMode() returns current boot mode. If no boot mode
- information is available, BOOT_WITH_FULL_CONFIGURATION is returned.
- **/
- EFI_BOOT_MODE GetBootMode()
- {
- return GetBootModeHob();
- }
-
- /**
- Get the system boot mode from the HOB list.
- This function returns the system boot mode information from the
- PHIT HOB in HOB list.
- If the pointer to the HOB list is NULL, then ASSERT().
-
- @param VOID
- @return The Boot Mode.
- **/
- EFI_BOOT_MODE
- EFIAPI
- GetBootModeHob (
- VOID
- )
- {
- EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
- HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList ();
- return HandOffHob->BootMode;
- }
复制代码 可以看到,着实GetBootMode这个PPI,终极也是通过读取HOB来获取的BootMode。这里也可以看到HOB的用法。
别的,必要注意的是:在PEI Foundation中,PEI Services表使用EFI_TABLE_HEADER,此中CRC32字段对PEI是特殊的。该值对PEI是可忽略的,应设置为零。
1.1. PEI Services Table内容
- // PI规范版本信息
- #define PI_SPECIFICATION_VERSION ((1 << 16) | 90)
- // PEI服务表
- #define PEI_SERVICES_SIGNATURE 0x5652455320494550
- #define PEI_SERVICES_REVISION PI_SPECIFICATION_VERSION
- typedef struct EFI_PEI_SERVICES {
- EFI_TABLE_HEADER Hdr; // 表头
- // PPI函数
- EFI_PEI_INSTALL_PPI InstallPpi;
- EFI_PEI_REINSTALL_PPI ReInstallPpi;
- EFI_PEI_LOCATE_PPI LocatePpi;
- EFI_PEI_NOTIFY_PPI NotifyPpi;
- // 启动模式函数
- EFI_PEI_GET_BOOT_MODE GetBootMode;
- EFI_PEI_SET_BOOT_MODE SetBootMode;
- // HOB函数
- EFI_PEI_GET_HOB_LIST GetHobList;
- EFI_PEI_CREATE_HOB CreateHob;
- // 固件卷函数
- EFI_PEI_FFS_FIND_NEXT_VOLUME2 FfsFindNextVolume;
- EFI_PEI_FFS_FIND_NEXT_FILE2 FfsFindNextFile;
- EFI_PEI_FFS_FIND_SECTION_DATA2 FfsFindSectionData;
- // PEI内存函数
- EFI_PEI_INSTALL_PEI_MEMORY InstallPeiMemory;
- EFI_PEI_ALLOCATE_PAGES AllocatePages;
- EFI_PEI_ALLOCATE_POOL AllocatePool;
- EFI_PEI_COPY_MEM CopyMem;
- EFI_PEI_SET_MEM SetMem;
- // 状态码
- EFI_PEI_REPORT_STATUS_CODE ReportStatusCode;
- // 重置
- EFI_PEI_RESET_SYSTEM ResetSystem;
- // (由发布PEIM安装的接口)
- // I/O抽象
- EFI_PEI_CPU_IO_PPI *CpuIo;
- EFI_PEI_PCI_CFG2_PPI *PciCfg;
- // 额外的文件系统相关服务
- EFI_PEI_FFS_FIND_BY_NAME FfsFindFileByName;
- EFI_PEI_FFS_GET_FILE_INFO FfsGetFileInfo;
- EFI_PEI_FFS_GET_VOLUME_INFO FfsGetVolumeInfo;
- EFI_PEI_REGISTER_FOR_SHADOW RegisterForShadow;
- EFI_PEI_FFS_FIND_SECTION_DATA3 FindSectionData3;
- EFI_PEI_FFS_GET_FILE_INFO2 FfsGetFileInfo2;
- EFI_PEI_RESET2_SYSTEM ResetSystem2;
- EFI_PEI_FREE_PAGES FreePages;
- } EFI_PEI_SERVICES;
复制代码 EFI_PEI_SERVICES是由PEI Foundation提供的函数聚集。这些服务分为以下几类:
(1)管理启动模式(BootMode)
(2)分配早期和永世内存
(3)支持固件文件体系(FFS)
(4)抽象化PPI数据库
(5)创建交接块(HOBs)
PEI Foundation调用PEIM时都会转达一个指向EFI_PEI_SERVICES表的指针。
因此,每个PEIM都可以访问EFI_PEI_SERVICES中的服务。
而且与UEFI Boot Service差别的是,PEI Services没有调用限定,比方UEFI 2.0使命优先级级别(TPL)限定。
具体来说,服务可以从PEIM或Notification Services中调用。
PEI Services中的一些服务也只是对于平台提供的服务的署理,比方Reset Services、Status Code和I/O Abstraction Service。
这种分区筹划旨在为全部PEIM提供同等的接口,而不使PEI Foundation实现受到特定平台的束缚(高复用性)。
任何此表以外的Service都应通过PPI调用。而且,在PEIM将接口实例复制到EFI_PEI_SERVICES表中之前,PEIM安装的后续服务都将返回EFI_NOT_AVAILABLE_YET。
2.常见的PEI Service
PEI Service是由PEI Foundation在阶段竣事时创建的功能、下令或其他本领。由于PEI阶段直到阶段末端才有永世性内存可用,因此PEI Foundation在PEI阶段创建的服务无法像后续阶段那样丰富。
PEI服务如下表所示:
表8.1:PEI服务
- PPI服务:管理PEIM到PEIM接口(PPIs),以便在PEIM之间举行调用。接口在PEI底子维护的暂时RAM中的数据库中安装和跟踪。
- 启动模式服务:管理体系的启动模式(S3、S5、正常启动、诊断等)。
- HOB服务:创建称为交接块(HOBs)的数据结构,用于向PI架构的下一阶段转达信息。
- 固件卷服务:在固件卷中查找PEIMs和其他固件文件。
- PEI内存服务:提供一组内存管理服务,用于在发现永世性内存之前和之后使用。
- 状态码服务:提供通用的进度和错误码陈诉服务,比方端口080h或用于简单文本输出的串行端口举行调试。
- 重置服务:提供一种通用的重启体系的方法。
PEI服务的调用约定类似于PPI。有关PPI的更多具体信息,请参阅PEIM到PEIM通讯。
2.1 PPI Service
以下服务提供了抽象PPI数据库的接口集:
(1) InstallPpi()
(2) ReinstallPpi()
(3) LocatePpi()
(4) NotifyPpi()
2.1.1 InstallPpi()
这是PEI Foundation提供的第一个服务。该服务的目标是发布可以用来调用额外PEIMs的接口。
该函数通过GUID在PEI PPI Database中安装接口。- typedef EFI_STATUS (EFIAPI *EFI_PEI_INSTALL_PPI) (
- IN CONST EFI_PEI_SERVICES **PeiServices,
- IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList
- );
复制代码 PeiServices:指向PEI底子发布的EFI_PEI_SERVICES表的间接指针。
PpiList:指向调用者要安装的接口列表的指针。范例EFI_PEI_PPI_DESCRIPTOR在“PEIM形貌符”中界说。
返回状态码
EFI_SUCCESS:接口已乐成安装。
EFI_INVALID_PARAMETER:PpiList指针为NULL。
EFI_INVALID_PARAMETER:PPI形貌符列表中的任何一个没有在Flags字段中设置EFI_PEI_PPI_DESCRIPTOR_PPI标记。
EFI_OUT_OF_RESOURCES:PPI数据库中没有额外空间。
该服务允许给定的PEIM向PEI底子注册接口。接口接纳遵照EFI_PEI_PPI_DESCRIPTOR格式的纪录列表的指针。
由于PEI底子维护的是对列表的指针而不是复制列表,因此列表必须位于PEIM主体中,大概从暂时或永世RAM中分配。
列表的长度由EFI_PEI_PPI_DESCRIPTOR中的Flags字段设置了EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST标记的EFI_PEI_PPI_DESCRIPTOR形貌。列表中至少应有一个EFI_PEI_PPI_DESCRIPTOR。
可以安装的EFI_PEI_PPI_DESCRIPTOR范例包罗EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH和EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK。
2.2 Boot Mode Service
2.2.1 GetBootMode()
2.2.2 SetBootMode()
2.3 HOB Services
2.3.1 GetHobList()
2.3.2 CreateHob()
2.4 Firmware Volume Service
固件卷服务抽象了对固件文件体系(FFS)的遍历,包罗以下功能:
FfsFindNextVolume():发现体系中的固件卷实例。
FfsFindNextFile():在固件卷中查找下一个匹配的文件。
FfsFindSectionData():在指定文件中查找下一个匹配的部分。
FfsFindFileByName():通过名称在固件卷中查找文件。
FfsGetFileInfo():获取有关特定文件的信息。
FfsGetVolumeInfo():获取有关特定固件卷的信息
2.5 PEI内存服务
PEI内存服务是一组在发现永世性内存之前和之后都可以使用的内存管理服务,包罗以下功能:
InstallPeiMemory():注册发现的内存设置注册到PEI Foundation中。
AllocatePages():分配内存页。
AllocatePool():分配内存池。
CopyMem():复制内存内容。
SetMem():设置内存内容。
FreePages():开释之前分配的内存页。
这些服务旨在支持PEI阶段的内存管理,无论是在暂时内存还是永世内存情况中
2.6 StatusCode Service
2.7 Reset Service
2.8 IO & PCI Service
|