UEFI PI PEI(2. PEI Services and Table)

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 ServicesStatus CodeI/O Abstraction Service
这种分区设计旨在为所有PEIM提供一致的接口,而不使PEI Foundation实现受到特定平台的束缚(高复用性)。

任何此表以外的Service都应通过PPI调用。并且,在PEIM将接口实例复制到EFI_PEI_SERVICES表中之前,PEIM安装的后续服务都将返回EFI_NOT_AVAILABLE_YET

2.常见的PEI Service

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.2.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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/969012.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2025常用的SEO工具有哪些?

在互联网时代&#xff0c;如何让自己的网站或内容脱颖而出&#xff0c;成为许多企业和个人站长们最关注的问题。而在这个过程中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;作为一种有效的提升网站曝光度和吸引流量的手段&#xff0c;已经成为了网站运营的核心之一。对…

Winform自定义控件与案例 - 一款功能丰富的自定义文本按钮(TextButton)控件

深入解析:TextButton —— 一款功能丰富的自定义文本按钮控件 在 WinForms 开发中,标准的按钮控件虽然能够满足基本需求,但在现代 UI 设计中显得过于简单。为了提升用户体验和界面美观度,我们开发了 TextButton,一个基于 WWControlBase 的自定义文本按钮控件。它不仅支持…

安卓自我学习

纯粹三分钟热度, 这里 我百度查询资料, 按步骤创建了emtry 项目, 这里选择apk 12 , java 别问我kotlin, 啥都不会, …… 至于是叫小林学习,最初是在csdn 那里看到小林博主的文章, 激起一点点热度, 想学习一下 找了一圈 我先右上角选择 trouble ,, ,,看图1-1 图1-1 点运行…

【SpringBoot3.x+】slf4j-log4j12依赖引入打印日志报错的两种解决方法

最开始引入了1.7.5版本的slf4j-log4j依赖包&#xff0c;但是控制台不报错也不显示日志 在https://mvnrepository.com/找到最新的2.0.16版本之后出现报错&#xff1a; 进入提示的slf4j网站中可以找到从2.0.0版本开始&#xff0c;slf4j-log4j已经被slf4j-reload4j取代&#xff1…

LabVIEW袜品压力测试系统

开发了一种基于LabVIEW开发的袜品压力测试系统。该系统利用LabVIEW并结合灵敏的传感器和高精度的处理模块&#xff0c;实现了对袜品压力的精确测量和分析。系统不同于传统的服装压力测试方法&#xff0c;为研究和评价袜子的舒适性提供了新的测试手段。 ​ 项目背景 该系统的…

【Unity Shader编程】之顶点着色器

来一张AI提供的资料 一&#xff0c;坐标空间转换 空间转换中&#xff0c;一般有五个空间转换&#xff0c;模型空间→世界空间→视图空间→裁剪空间→NDC空间&#xff08;其次坐标空间&#xff0c;执行其次坐标后的空间)→屏幕空间 核心原则 1&#xff0c;数据依赖原则 当逻…

咸鱼换绑手机号能换ip属地吗?深入探讨

随着移动互联网的普及&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。而在各种网络应用中&#xff0c;手机号码往往扮演着重要的角色&#xff0c;它不仅是身份验证的关键&#xff0c;还关联着用户的地理位置信息。在二手交易平台如闲鱼上&#xff0c;用户的手机号和…

历史性突破!DeepSeek双模型GitHub热度超OpenAI,展现中国AI力量

在2025年2月7日&#xff0c;中国AI领域传来了一则振奋人心的消息&#xff1a;DeepSeek旗下的两大开源项目在GitHub平台上实现了历史性突破&#xff0c;其Star数成功超越了OpenAI的明星项目。这一成就不仅标志着DeepSeek在技术研发和市场影响力上的重大飞跃&#xff0c;也为中国…

【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计

spann3r是利用dust3r做了增量式的点云重建&#xff0c;这里zeroGS在前者的基础上&#xff0c;进行了增量式的GS重建以及进行了pose的联合优化&#xff0c;这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而&#xff0c;…

【CLIP系列】4:目标检测(ViLD、GLIP)

目录 1 ViLD2 GLIP2.1 前言2.2 损失计算2.3 模型框架 1 ViLD OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION 从标题就能看出来&#xff0c;作者是把CLIP模型当成一个Teacher&#xff0c;去蒸馏他自己的网络&#xff0c;从而能Zero Shot去…

基于Docker-compose的禅道部署实践:自建MySQL与Redis集成及故障排查指南

基于Docker-compose的禅道部署实践&#xff1a;自建MySQL与Redis集成及故障排查指南 禅道镜像版本&#xff1a;easysoft/zentao:21.4 Redis版本&#xff1a;redis:6.2.0 Mysql版本&#xff1a;mysql:8.0.35 文章目录 **基于Docker-compose的禅道部署实践&#xff1a;自建MySQL与…

Elasticsearch:同义词在 RAG 中重要吗?

作者&#xff1a;来自 Elastic Jeffrey Rengifo 及 Toms Mura 探索 RAG 应用程序中 Elasticsearch 同义词的功能。 同义词允许我们使用具有相同含义的不同词语在文档中搜索&#xff0c;以确保用户无论使用什么确切的词语都能找到他们所寻找的内容。你可能会认为&#xff0c;由于…

0基础学LabVIEW

对于零基础的朋友来说&#xff0c;学习LabVIEW需要一个科学的学习路径和方法。通过观看优质的B站教程打好基础&#xff0c;再结合实际项目进行实践操作&#xff0c;能够快速提升LabVIEW的应用能力。以下是从入门到进阶的学习建议。 ​ 一、利用B站入门教程打基础 筛选优质教程…

7. Docker 容器数据卷的使用(超详细的讲解说明)

7. Docker 容器数据卷的使用(超详细的讲解说明) 文章目录 7. Docker 容器数据卷的使用(超详细的讲解说明)1. Docker容器数据卷概述2. Docker 容器数据卷的使用演示&#xff1a;2.1 宿主 和 容器之间映射添加容器卷2.2 容器数据卷 读写规则映射添加说明2.3 容器数据卷的继承和共…

零售行业线下门店的AI知识库应用实践

在竞争激烈的零售行业&#xff0c;线下门店的运营效率和服务质量是企业成功的关键因素之一。随着AI技术的不断发展&#xff0c;越来越多的零售企业开始探索如何利用AI知识库提升线下门店的运营效率和员工服务水平。 1. AI知识库在零售行业的应用背景 零售行业面临着诸多挑战&…

Unity Behavior Designer - Behavior Trees for Everyone(行为树)为什么称作AI 的“基石”之一

Behavior Designer 是 Unity 中一个用于创建行为树的插件&#xff0c;主要用于 AI 和 NPC&#xff08;非玩家角色&#xff09;的行为管理。行为树&#xff08;Behavior Trees&#xff09;是一种基于树形结构的决策树模型&#xff0c;广泛应用于游戏开发中&#xff0c;特别是在控…

八大排序——简单选择排序

目录 1.1基本操作&#xff1a; 1.2动态图&#xff1a; 1.3代码&#xff1a; 代码解释 1. main 方法 2. selectSort 方法 示例运行过程 初始数组 每轮排序后的数组 最终排序结果 代码总结 1.1基本操作&#xff1a; 选择排序&#xff08;select sorting&#xff09;也…

Jenkins 新建配置 Freestyle project 任务 六

Jenkins 新建配置 Freestyle project 任务 六 一、新建任务 在 Jenkins 界面 点击 New Item 点击 Apply 点击 Save 回到任务主界面 二、General 点击左侧 Configure Description&#xff1a;任务描述 勾选 Discard old builds Discard old builds&#xff1a;控制何时…

使用 Dockerfile 构建自定义 Nginx 镜像并集成 nginx_upstream_check_module

目录 1. 为什么需要自定义 Nginx 镜像&#xff1f; 2. Dockerfile 解析 2.1 基础镜像选择 2.2 安装依赖 2.3 下载并解压 Nginx 源码 2.4 应用补丁并编译 Nginx 2.5 暴露端口并设置启动命令 3. 构建并运行自定义 Nginx 镜像 3.1 构建镜像 3.2 运行容器 3.3 健康检测配…

【论文笔记】Are Self-Attentions Effective for Time Series Forecasting? (NeurIPS 2024)

官方代码https://github.com/dongbeank/CATS Abstract 时间序列预测在多领域极为关键&#xff0c;Transformer 虽推进了该领域发展&#xff0c;但有效性尚存争议&#xff0c;有研究表明简单线性模型有时表现更优。本文聚焦于自注意力机制在时间序列预测中的作用&#xff0c;提…