uefi协议设计目的

news2025/6/6 13:22:25

在EDK2的术语体系中,GUID定义的是协议的标识符,而具体实现的函数集合称为协议的实现。它们是同一协议的不同抽象层次,以下是详细解释:

1. 协议(Protocol)的两层含义

(1) 协议规范(接口定义)
  • 用GUID标识:每个协议有唯一的GUID,如gEfiSimpleTextOutProtocolGuid
  • 定义接口函数:通过结构体定义一组函数指针,规定协议的功能。
// 协议规范定义(示例)
typedef struct _EFI_SIMPLE_TEXT_OUT_PROTOCOL {
  EFI_STATUS (*Reset)(EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, BOOLEAN ExtendedVerification);
  EFI_STATUS (*OutputString)(EFI_SIMPLE_TEXT_OUT_PROTOCOL *This, CHAR16 *String);
  // 其他函数...
} EFI_SIMPLE_TEXT_OUT_PROTOCOL;
(2) 协议实现(具体代码)
  • 实现接口函数:驱动开发者编写具体的函数实现。
  • 通过GUID注册:将实现绑定到对应的GUID上。
// 协议实现示例
EFI_STATUS
EFIAPI
MyOutputString (
  IN EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,
  IN CHAR16                         *String
  )
{
  // 实际输出字符串的代码
  return EFI_SUCCESS;
}

// 协议实例
EFI_SIMPLE_TEXT_OUT_PROTOCOL gMySimpleTextOut = {
  .Reset       = MyReset,
  .OutputString = MyOutputString,
  // 其他函数实现...
};

2. 关键区别

概念描述关联
协议GUID唯一标识符,用于在运行时查找协议接口。一个GUID对应一个协议规范
协议规范定义协议的函数接口(结构体),不包含具体实现。由GUID和结构体共同定义
协议实现具体的函数代码,实现协议规范中定义的接口。多个实现可共享同一GUID

3. 同一GUID的多实现示例

同一个GUID的协议可以有多个实现:

// 协议规范(唯一GUID)
#define EFI_MY_PROTOCOL_GUID \
  { 0x12345678, 0x9abc, 0xdef0, { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 } }

typedef struct _EFI_MY_PROTOCOL {
  EFI_STATUS (*DoWork)(VOID);
} EFI_MY_PROTOCOL;

// 实现1:控制台输出
EFI_STATUS EFIAPI ConsoleDoWork(VOID) { Print(L"Console Implementation\n"); return EFI_SUCCESS; }
EFI_MY_PROTOCOL gConsoleImpl = { .DoWork = ConsoleDoWork };

// 实现2:文件输出
EFI_STATUS EFIAPI FileDoWork(VOID) { WriteFile(L"output.txt", L"File Implementation\n"); return EFI_SUCCESS; }
EFI_MY_PROTOCOL gFileImpl = { .DoWork = FileDoWork };

// 注册两个实现(使用相同GUID)
gBS->InstallProtocolInterface(&h1, &gEfiMyProtocolGuid, EFI_NATIVE_INTERFACE, &gConsoleImpl);
gBS->InstallProtocolInterface(&h2, &gEfiMyProtocolGuid, EFI_NATIVE_INTERFACE, &gFileImpl);

4. 如何调用特定实现

通过句柄(Handle)区分同一协议的不同实现:

// 获取所有实现的句柄
EFI_HANDLE *Handles;
UINTN HandleCount;
gBS->LocateHandleBuffer(ByProtocol, &gEfiMyProtocolGuid, NULL, &HandleCount, &Handles);

// 遍历并调用每个实现
for (UINTN i = 0; i < HandleCount; i++) {
  EFI_MY_PROTOCOL *Protocol;
  gBS->HandleProtocol(Handles[i], &gEfiMyProtocolGuid, (VOID**)&Protocol);
  Protocol->DoWork();  // 调用不同实现的函数
}

总结

  • GUID和协议:GUID是协议的唯一标识符,协议规范定义了接口。
  • 实现:具体的函数代码称为协议的实现,多个实现可共享同一GUID。
  • 调用方式:通过GUID查找协议,通过句柄区分不同实现。

这种设计使得EDK2能够实现灵活的插件架构和多态机制。

在EDK2(UEFI开发工具包)中,.dec.dsc.inf是三种核心配置文件,分别用于不同层次的组件定义和构建配置。以下是它们的主要区别和作用:

1. DEC文件(定义文件,.dec)

作用
  • 声明全局可用的元数据(如GUID、PPI、Protocol、PCD等)
  • 定义跨模块共享的常量和类型
  • 不包含具体实现代码
关键内容
  • GUID定义:唯一标识协议、PPI、驱动等
  • PPI/Protocol声明:定义接口规范
  • PCD(平台配置数据)声明:定义可配置参数
  • 库类声明:定义库接口
示例
[Defines]
  DEC_SPECIFICATION_VERSION = 0x00010005  # DEC文件规范版本

[Guids]
  gEfiSimpleTextOutProtocolGuid = { 0x387477c2, 0x69c7, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }

[Ppis]
  gEfiPeiReadOnlyVariable2PpiGuid
    gEfiPeiServicesTablePointerPpiGuid

[Protocols]
  gEfiDevicePathProtocolGuid
    gEfiSimpleNetworkProtocolGuid

[PcdsFeatureFlag]
  gEfiMdeModulePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000FFFF

2. DSC文件(描述文件,.dsc)

作用
  • 定义完整的UEFI固件或应用程序
  • 指定要构建的组件(驱动、应用、库)
  • 配置构建选项和平台特性
  • 控制模块之间的依赖关系
关键内容
  • 平台定义:描述目标平台特性
  • 组件列表:指定要包含的模块(.inf文件)
  • PCD值设置:为特定平台定制PCD参数
  • 构建选项:编译器、链接器参数等
示例
[Defines]
  PLATFORM_NAME           = MyPlatform
  PLATFORM_GUID           = { 0x12345678, 0x9abc, 0xdef0, { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 } }
  PLATFORM_VERSION        = 1.0
  DSC_SPECIFICATION       = 0x00010005

[Components]
  # 包含的驱动组件
  MdeModulePkg/Bus/Usb/Host/UsbUhciDxe/UsbUhciDxe.inf
  MdeModulePkg/Bus/Usb/Host/UsbEhcxDxe/UsbEhcxDxe.inf
  
  # 包含的应用组件
  MdeModulePkg/Application/HelloWorld/HelloWorld.inf

[PcdsFixedAtBuild]
  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor|L"Contoso"
  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersion|0x10000

3. INF文件(信息文件,.inf)

作用
  • 描述单个模块(驱动、应用、库)的元数据
  • 指定源文件、依赖项、库类和构建选项
  • 是构建系统的最小单元
关键内容
  • 模块基本信息:类型(驱动/应用/库)、名称、GUID
  • 源文件列表:包含的C/ASM等源文件
  • 库依赖:使用的库类
  • 协议/PPI依赖:模块需要的接口
  • 构建选项:特定于模块的编译参数
示例
[Defines]
  INF_VERSION             = 0x00010005
  BASE_NAME               = MyDriver
  FILE_GUID               = { 0x12345678, 0x9abc, 0xdef0, { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 } }
  MODULE_TYPE             = UEFI_DRIVER
  VERSION_STRING          = 1.0

[Sources]
  MyDriver.c
  MyHelper.c

[Packages]
  MdePkg/MdePkg.dec
  MdeModulePkg/MdeModulePkg.dec

[LibraryClasses]
  UefiDriverEntryPoint
  UefiLib
  DebugLib

[Protocols]
  gEfiDevicePathProtocolGuid
  gEfiSimpleTextOutProtocolGuid

4. 三者关系总结

文件类型作用核心内容示例用途
DEC全局声明元数据GUID、PPI、Protocol、PCD定义定义标准UEFI协议的GUID
DSC定义整个平台或应用组件列表、平台PCD值、构建选项配置UEFI固件包含的所有驱动
INF描述单个模块源文件、库依赖、模块特性定义一个USB驱动的构建参数

5. 构建流程中的协作

  1. DEC文件:提供全局符号和类型定义,被DSC和INF引用
  2. DSC文件:指定要构建的INF列表,并为它们提供平台级配置
  3. INF文件:指导具体模块的编译和链接,依赖DEC中定义的符号

例如,当构建一个UEFI驱动时:

  • INF文件列出驱动的源文件和依赖库
  • DSC文件决定该驱动是否被包含在最终固件中
  • DEC文件提供驱动所需的协议和PPI定义

6. 最佳实践

  • 模块化设计:每个组件应有独立的INF,避免过大的模块
  • 避免重复:公共定义放在DEC中,避免在多个INF/DSC中重复
  • 配置分离:通过PCD在DSC中定制平台特性,避免硬编码
  • 版本控制:保持DEC/DSC/INF版本同步,避免兼容性问题

理解这三种文件的区别和协作方式,是EDK2开发的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer实战——词嵌入技术详解

Transformer实战——词嵌入技术详解 0. 前言1. 词嵌入基础2. 分布式表示3. 静态嵌入3.1 Word2Vec3.2 GloVe 4. 使用 Gensim 构建词嵌入5. 使用 Gensim 探索嵌入空间6. 动态嵌入小结系列链接 0. 前言 在本节中&#xff0c;我们首先介绍词嵌入的概念&#xff0c;然后介绍两种实现…

[pdf、epub]300道《软件方法》强化自测题业务建模需求分析共257页(202505更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 在本账号CSDN资源下载&#xff0c;或者访问链接&#xff1a; http://www.umlchina.com/url/quizad.html 如果需要提取码&#xff1a;umlc 文件夹中的“300道软件方法强化自测题2025…

Vue3入门指南:从零到精通的快速上手

齐爷学vue3 一、Vue3入门 vite&#xff1a;前端构架工具&#xff0c;构建速度快于webpack。轻量快速、对TS&#xff0c;JSX&#xff0c;CSS开箱即用、按需编译。 创建Vue3工程 1.在想要创建Vue3的位置打开cmd&#xff0c;执行如下命令。 npm create vuelatest 2.功能只选择…

吴恩达MCP课程(5):mcp_chatbot_prompt_resource.py

前提条件&#xff1a; 1、吴恩达MCP课程&#xff08;5&#xff09;&#xff1a;research_server_prompt_resource.py 2、server_config_prompt_resource.json文件 {"mcpServers": {"filesystem": {"command": "npx","args"…

设计模式——抽象工厂设计模式(创建型)

摘要 抽象工厂设计模式是一种创建型设计模式&#xff0c;旨在提供一个接口&#xff0c;用于创建一系列相关或依赖的对象&#xff0c;无需指定具体类。它通过抽象工厂、具体工厂、抽象产品和具体产品等组件构建&#xff0c;相比工厂方法模式&#xff0c;能创建一个产品族。该模…

基于LocalAI与cpolar技术协同的本地化AI模型部署与远程访问方案解析

文章目录 前言1. Docker部署2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址前言 各位极客朋友们!今天要向大家推荐一套创新性的本地部署方案——LocalAI技术架构。这款开源工具包能够将普通配置的笔记本电脑转化为具备强大算力的AI工作站,轻松实现…

霍尔效应传感器的革新突破:铟化铟晶体与结构演进驱动汽车点火系统升级

一、半导体材料革新&#xff1a;铟化铟晶体的电压放大机制 铟化铟&#xff08;InSb&#xff09;晶体因其独特的能带结构&#xff0c;成为提升霍尔电压的关键材料。相较于传统硅基材料&#xff0c;其载流子迁移率高出3-5倍&#xff0c;在相同磁场强度下可显著放大霍尔电压。其作…

无法运用pytorch环境、改环境路径、隔离环境

一.未建虚拟环境时 1.创建新项目后&#xff0c;直接运行是这样的。 2.设置中Virtualenv找不到pytorch环境&#xff1f;因为此时没有创建新虚拟环境。 3.选择conda环境&#xff08;全局环境&#xff09;时&#xff0c;是可以下载环境的。 运行结果如下&#xff1a; 是全局环境…

从0开始学vue:pnpm怎么安装

一、什么是 pnpm&#xff1f; pnpm&#xff08;Performant npm&#xff09;是新一代 JavaScript 包管理器&#xff0c;优势包括&#xff1a; 节省磁盘空间&#xff1a;通过硬链接和符号链接实现高效存储安装速度更快&#xff1a;比 npm/yarn 快 2-3 倍内置工作区支持&#xf…

Python 网络编程 -- WebSocket编程

作者主要是为了用python构建实时网络通信程序。 概念性的东西越简单越好理解,因此,下面我从晚上摘抄的概念 我的理解。 什么是网络通信? 更确切地说&#xff0c;网络通信是两台计算机上的两个进程之间的通信。比如&#xff0c;浏览器进程和新浪服务器上的某个Web服务进程在通…

边缘计算应用实践心得

当数据中心的光纤开始承载不了爆炸式增长的物联网数据流时&#xff0c;边缘计算就像毛细血管般渗透进现代数字肌理的末梢。这种将算力下沉到数据源头的技术范式&#xff0c;本质上是对传统云计算中心化架构的叛逆与补充——在智能制造车间里&#xff0c;实时质检算法直接在工业…

EXCEL如何快速批量给两字姓名中间加空格

EXCEL如何快速批量给姓名中间加空格 优点&#xff1a;不会导致排版混乱 缺点&#xff1a;无法输出在原有单元格上&#xff0c;若需要保留原始数据&#xff0c;可将公式结果复制后“选择性粘贴为值” 使用场景&#xff1a;在EXCEL中想要快速批量给两字姓名中间加入空格使姓名对…

Jenkins | Linux环境部署Jenkins与部署java项目

1. 部署jenkins 1.1 下载war包 依赖环境 jdk 11 下载地址: https://www.jenkins.io/ 依赖环境 1.2 启动服务 启动命令 需要注意使用jdk11以上的版本 直接启动 # httpPort 指定端口 #-Xms2048m -Xmx4096m 指定java 堆内存初始大小 与最大大小 /usr/java/jdk17/bin/java…

react私有样式处理

react私有样式处理 Nav.jsx Menu.jsx vue中通过scoped来实现样式私有化。加上scoped&#xff0c;就属于当前组件的私有样式。 给视图中的元素都加了一个属性data-v-xxx&#xff0c;然后给这些样式都加上属性选择器。&#xff08;deep就是不加属性也不加属性选择器&#xff09; …

UDP/TCP协议全解

目录 一. UDP协议 1.UDP协议概念 2.UDP数据报格式 3.UDP协议差错控制 二. TCP协议 1.TCP协议概念 2.三次握手与四次挥手 3.TCP报文段格式&#xff08;重点&#xff09; 4.流量控制 5.拥塞控制 一. UDP协议 1.UDP协议概念 当应用层的进程1要向进程2传输报文&#xff…

Duix.HeyGem:以“离线+开源”重构数字人创作生态

在AI技术快速演进的今天,虚拟数字人正从高成本、高门槛的专业领域走向大众化应用。Duix.HeyGem 数字人项目正是这一趋势下的杰出代表。该项目由一支拥有七年AI研发经验的团队打造,通过放弃传统3D建模路径,转向真人视频驱动的AI训练模型,成功实现了低成本、高质量、本地化的…

ubuntu22.04安装megaton

前置 sudo apt-get install git cmake ninja-build generate-ninja安装devkitPro https://blog.csdn.net/qq_39942341/article/details/148388639?spm1001.2014.3001.5502 安装cargo https://blog.csdn.net/qq_39942341/article/details/148387783?spm1001.2014.3001.5501 …

Windows应用-GUID工具

下载本应用 我们在DirectShow和媒体基础程序的调试中&#xff0c;将会遇到大量的GUID&#xff0c;调试窗口大部分情况下只给出GUID字符串&#xff0c;此GUID代表什么&#xff0c;我们无从得知。这时&#xff0c;就需要此“GUID工具”&#xff0c;将GUID字符串翻译为GUID定义&am…

vue+element-ui一个页面有多个子组件组成。子组件里面有各种表单,实现点击enter实现跳转到下一个表单元素的功能。

一个父组件里面是有各个子组件的form表单组成的。 我想实现点击enter。焦点直接跳转到下一个表单元素。 父组件就是由各个子组件构成 子组件就像下图一样的都有个el-form的表单。 enterToTab.js let enterToTab {}; (function() {// 返回随机数enterToTab.addEnterListener …

Vehicle HAL(5)--vhal 实现设置属性的流程

目录 1. ard11 vhal 设置属性的时序图 CarService > vhal > CarService 2. EmulatedVehicleHal::set(xxx) 的实现 本文介绍ard11的vhal属性设置流程图。 1. ard11 vhal 设置属性的时序图 CarService > vhal > CarService 2. EmulatedVehicleHal::set(xxx) 的实现…