首页 > Bios实习 思考篇- 1.PEI阶段和DXE阶段传递自定义信息的区别
头像
SorenKim
编辑于 04-26 22:55 天津
+ 关注

Bios实习 思考篇- 1.PEI阶段和DXE阶段传递自定义信息的区别

一、PEI阶段如何传递自定义信息

PEI阶段资源非常受限(无完整内存、无驱动模型),传递自定义信息主要靠两种方式:PPI(内部即时用) 和 HOB(留给DXE用)

1. PPI —— PEI模块间传接口/数据

PPI是PEI内部的“函数调用接口”。任何PEIM都可以把一个包含GUID和函数指针的结构体安装到PEI的全局数据库中。

  • 如何自定义:你定义一个GUID和一个包含你所需数据的接口结构体(或直接是一个返回数据地址的接口),然后用InstallPpi安装。
  • 如何访问:另一个PEIM用LocatePpi根据GUID找到它,立刻调用其函数来获取数据或服务。
  • 局限性:只在PEI阶段存活,DXE一进来PPI数据库就销毁了。而且通常用于传递功能接口,而不是纯数据块。

2. HOB —— 从PEI向DXE移交数据的核心方式

HOB是PEI留给DXE的“遗产清单”,是一块连续内存里的链表,DXE启动后只读。

  • 如何传递自定义数据:使用GUID Extension HOB (EFI_HOB_TYPE_GUID_EXTENSION)。你只要定义一个GUID,再把你要传的任意数据(如结构体)跟在HOB头部后面,然后调用BuildGuidDataHob就行了。
  • DXE如何接收:DXE驱动通过GetFirstGuidHob和GetNextGuidHob并传入同一个GUID,就能定位到这块数据。注意:DXE只能读取,严禁修改。
  • 典型场景:传递内存布局、Firmware Volume位置、启动模式、平台特殊配置信息等。

二、DXE阶段如何传递自定义信息

DXE阶段UEFI基础服务完全就绪,传递信息的方式更高级、更动态。

1. Protocol —— DXE驱动间的双向交互核心

Protocol是真正意义上的“生产-消费”双向全局数据库。任何DXE驱动都可以安装协议,也可以查找协议。

  • 如何自定义:定义一个GUID,并定义好协议接口结构体(可包含函数,也可只包含数据)。生产者调用InstallProtocolInterface把它注册到系统。
  • 如何访问:消费者通过LocateProtocol找到它,然后直接调用其函数或读取其数据。数据可读可写,完全取决于你的设计。
  • 生命周期:可贯穿DXE、BDS,甚至如果安装成Runtime协议,OS下还能用。

2. 继续接收PEI的“遗物” —— HOB (只读)

DXE阶段同样能解析HOB列表,来获得PEI留下的所有自定义GUID Extension HOB。这是PEI->DXE单向传递的延续,但在DXE内部,HOB不会被用来驱动间传新数据。

3. UEFI变量 —— 持久化,甚至跨启动

如果你想让自定义信息在重启后依然存在,或者要供多个启动阶段(包括OS)使用,就用UEFI变量。这已经可以看作广义的“传递”了。

  • 用法:通过gRT->SetVariable写入一个带有GUID的变量,任何其它代码只要知道GUID和变量名就能用GetVariable读取。
  • 特点:可读写,可持久化,但有大小和更新次数限制,且不适合大数据块。

三、核心区别

1. 机制与模型完全不同

  • PEI内:PPI是轻量级、一对一或一对多的函数接口库,查出来就调。
  • PEI→DXE:HOB是单向、只读的数据块链表,生产者(PEI)写,消费者(DXE)读。
  • DXE内:Protocol是双向、动态的服务数据库,大家都可以当生产者和消费者。

2. 数据流向与读写权限

  • PPI/HOB:HOB有严格的只读限制,PEI给什么,DXE就只能读什么,不能反馈修改。
  • Protocol:DXE驱动间可以通过协议互相调用、修改共享状态,数据流向是网络状的。

3. 传递内容的抽象层次

  • PEI手段:基本就是内存块。PPI传接口指针,HOB传数据块,都是底层二进制。
  • DXE手段:Protocol可以定义完整的服务接口(带函数),是面向对象的思想;UEFI变量则直接提供了命名空间和属性(如NV、BS、RT)。

4. 生命周期

  • PEI的PPI和HOB,在PEI结束或DXE极早期就完成使命。HOB列表本身虽在内存中可能一直存在,但DXE启动后就变为只读历史数据。
  • DXE的Protocol可以存在到SMM、BDS,甚至Runtime。UEFI变量则能永久保存。

简单一句话区分:

  • 想在PEI内部快速共享功能,用PPI。
  • 想把配置/结果交给DXE,在PEI里建GUID HOB。
  • 在DXE里想和别的驱动交互,定义并安装Protocol。
  • 想永久保存,用UEFI变量。

全部评论

(1) 回帖
加载中...
话题 回帖

近期热帖

热门推荐