04_PEI之InstallPpi演算法

本文详细介绍了UEFI环境中PPI(PEIM to PEIM Interface)的安装与使用机制,包括InstallPpi、LocatePpi及NotifyPpi的功能与交互方式,并通过图表直观展示这些操作的具体流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.yam.com/wttmama/article/33762035

m,這部份是第一個理解的東西

但,說真的,它對BIOS 真的沒幫助,只能幫你瞭解 PEI 的 IntallPpi 是怎麼做的而已。
這個內容可以套用在
InstallPpi
LocatePpi
NotifyPpi



在 PEI Foundation 中。有提供一個 叫 InstallPpi 的 function 。
現在要描述的是,它的結構。

懂結構者,得天下!!~(自己亂掰的! )

以下是自畫圖


m,簡單的說~紅色那一塊就是 PEIM 應該提供的 Function
是以 PPI DESCRIPTOR 的方式開放。
在 InstallPpi 時,會加到一個結構,由頭往後加
而 NotifyPpi 則是由後面往前加。
LocatePpi 是會從頭開始找。

m,什麼是PPI
PPI : PEIM to PEIM Interface
 
在應用上,InstallPpi 是搭配 LocatePpi ,(加入後拿出來用 )
而 NotifyPpi 則是用來指定某個 Ppi  Install 時,馬上執行 NotifyPpi 的callback function。

m,說真的,這邊只是為了 熱身而已,不說 source code 是因為,懂意義後,其實很容易看懂它在做啥
目前來說,這邊還真是不常改,不常用。

下面用別種圖示來說明它們。

當你 Install一個 Ppi 時,就如前面說的,會安裝一個 PPI Descriptor 至一個結構之中,如上圖
而 Locate 其實就是從這個結構找 Match 的 GUID 。再把 ppi 交給你而已

同理 NotifyPPi 也是,如下圖所示,但它是從結構尾巴往上放。
使用場合則是像之前說的,當上面各有一個 Match 的時候,就會執行 Notify 的 callback function
下圖是情境說明
1. 已存在 紅色 ppi 及綠色 notifyPpi
2. Install 紫色 PPI 
3. 內部演算法去判斷 NotifyPpi 有沒有和 紫色 PPI 相符 的 GUID
4. 有的話,就執行 Notify Function。
5. 沒有的話,InstallPpi結束。

note: NotifyPpi 時,也會檢查,裝了 Notify 檢查 Ppi那一群 的。


說真的,為什麼要寫這一個…因為,它是我在 UEFI 追的第一個有成就感的 code 
因為我覺得我說的很生動~~哈~所以,這一定要記錄一下的啦!~~
圖文說明說真的有點差~但~現場很生動的呢!!~~不過,這將只會是個記憶
因為,懂這個又沒用,bios 知識又沒增加,只是更懂 EFI 而已。
<think>好的,我现在需要详细解答用户关于EFI_PEI_PPI_DESCRIPTOR的问题,包括它的定义、结构解析、使用场景以及相关开发文档的内容。首先,我需要回忆和查阅相关的UEFI和PEI阶段的知识,确保信息的准确性。 根据用户提供的引用内容,特别是引用[1]和[2],PEI阶段的核心是PEI Foundation和PEIM模块。EFI_PEI_PPI_DESCRIPTORPEI初始化过程中用于描述PPI(PEIM-to-PEIM Interfaces),这些接口允许不同模块之间进行通信。接下来,我需要明确这个描述符的结构定义。 查阅UEFI开发文档,EFI_PEI_PPI_DESCRIPTOR通常包含几个关键字段:Flags、GUID和Ppi。Flags用于指示PPI的类型,比如是否自动安装。GUID是全局唯一标识符,用于识别不同的接口。Ppi则是指向实际接口的指针。需要详细说明每个字段的作用和可能的值。 使用场景方面,PEIM在初始化时会通过InstallPpi函数注册自己的服务,其他模块则通过LocatePpi来查找并使用这些服务。比如,内存初始化模块可能提供一个PPI供其他模块调用。这里需要结合具体例子,让用户更容易理解。 结构解析部分,需要逐字段解释,比如Flags的EFI_PEI_PPI_DESCRIPTOR_PPI或EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK等值的含义。GUID的结构和使用方法,以及Ppi指针的类型转换注意事项。 开发文档方面,用户可能需要参考《UEFI Platform Initialization (PI) Specifications》和EDK2的代码库,特别是PeiServices.h头文件。同时,引用中的示例代码和函数原型(如PEI入口点函数)需要联系起来,说明EFI_PEI_PPI_DESCRIPTOR如何被传递和使用。 最后,生成相关问题时要考虑用户可能的后续疑问,比如与其他描述符的区别、动态注册方法、错误处理等。确保问题覆盖结构、使用和实际开发中的常见情况。</think>### EFI_PEI_PPI_DESCRIPTOR 详解 #### **1. 定义与作用** `EFI_PEI_PPI_DESCRIPTOR` 是 UEFI **PEI 阶段**(Pre-EFI Initialization)中用于描述 **PPI**(PEIM-to-PEIM Interfaces)的核心数据结构。PPI 是 PEIM(PEI 模块)之间通信的接口协议,类似于 DXE 阶段的 Protocol,但作用范围仅限于 PEI 阶段[^2]。 #### **2. 结构解析** 其标准定义如下(以 EDK2 代码为例): ```c typedef struct { UINTN Flags; // 描述符类型标识 EFI_GUID *Guid; // PPI 的唯一标识(GUID) VOID *Ppi; // 指向 PPI 实例的指针 } EFI_PEI_PPI_DESCRIPTOR; ``` - **Flags**:控制描述符行为的标志,常见值: - `EFI_PEI_PPI_DESCRIPTOR_PPI`:表示这是一个普通 PPI。 - `EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK`:表示这是一个回调通知类型的 PPI。 - **Guid**:全局唯一标识符(如 `gEfiPeiCpuIoPpiGuid`),用于标识 PPI 的类型。 - **Ppi**:指向具体 PPI 实例的指针,需通过类型转换(如 `(EFI_PEI_CPU_IO_PPI*)`)访问。 #### **3. 使用场景** - **注册 PPI**:PEIM 在初始化时通过 `InstallPpi()` 注册自己的服务。 ```c EFI_PEI_PPI_DESCRIPTOR mPpiList = { EFI_PEI_PPI_DESCRIPTOR_PPI, &gExamplePpiGuid, &mExamplePpiInstance }; PeiServicesInstallPpi(&mPpiList); ``` - **查找 PPI**:其他 PEIM 通过 `LocatePpi()` 获取已注册的 PPI: ```c ExamplePpi* Ppi; PeiServicesLocatePpi(&gExamplePpiGuid, 0, NULL, (VOID**)&Ppi); ``` #### **4. 典型应用示例** - **内存初始化**:内存控制器 PEIM 可能通过 PPI 提供 `MemInitPpi`,供其他模块调用。 - **硬件抽象**:如 `EFI_PEI_CPU_IO_PPI` 提供 CPU 级别的 I/O 操作接口[^1]。 #### **5. 开发文档参考** - **UEFI PI 规范**:详细定义 PEI 阶段的所有数据结构和流程(Volume 1: Pre-EFI Initialization)。 - **EDK2 源码**:`MdePkg/Include/Ppi/` 目录包含标准 PPI 的定义,例如 `CpuIoPpi.h`。 - **调试技巧**:使用 `DEBUG((EFI_D_INFO, "PPI GUID: %g\n", Guid))` 输出 GUID 信息以验证注册状态。 --- §§ 相关问题 §§ 1. **PPI 与 DXE 阶段的 Protocol 有何本质区别?** 2. **如何动态注册一个支持回调通知的 PPI?** 3. **在 PEI 阶段,若 `LocatePpi` 失败应如何处理?** 4. **EFI_GUID 的结构定义是什么?如何生成自定义 GUID?** 5. **哪些常见 PPI 必须由 PEI Foundation 预先提供?** [^1]: PEI Foundation 入口函数通过 `PpiList` 参数传递初始 PPI。 : PEI 阶段的模块交互依赖 PPI,而 DXE 阶段使用 Protocol 实现更复杂的服务。 [^3]: BDS 阶段的入口函数通过类似机制管理启动流程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值