UEFI基础概念2——Handle和Protocol

news2024/12/27 10:54:36

一、Handle

Handle Database是由Handle和Protocol组成。Handle(句柄)是一个或多个协议的集合,Protocol(协议)是由GUID命名的数据结构。
在平台初始化过程中,系统固件、UEFI兼容驱动程序和UEFI应用程序创建句柄,并将一个或多个协议附加到句柄上。
句柄数据库是UEFI句柄的列表,是维护基于UEFI固件的对象的中央存储库。每个由唯一句柄号标识的UEFI句柄由系统固件维护。句柄号为句柄数据库中的条目提供数据库“键”。句柄数据库中的每个条目都是一个或多个协议的集合。由GUID命名的协议类型附加到UEFI句柄并确定句柄类型。
UEFI句柄可以表示以下组件:

1) 可执行映像(如UEFI驱动程序和UEFI应用程序)

2) 设备(如网络控制器和硬盘分区)

3) 作为驱动程序访问的UEFI服务(如EFI解压缩和EBC解释器)

如上图所示,只有一个Handle Database,所有的Handle 都在其中。值得注意的是Handle database并不区分Hanble的类型。Handle是由相关联的Protocol类型区分的。

使用协议的GUID名称在句柄数据库中注册协议服务,通过使用与协议关联的GUID名称在句柄数据库中查找协议来发现协议服务,以执行查找操作。

二、Protocol

2.1 Protocold的概念

UEFI的可扩展性很大程度上是围绕Protocol建立的。Protocol能够在独立的模块(包括驱动)之间进行通信。

驱动程序创建由两部分组成的protocol。Protocol的主体是一种C风格的数据结构,称为“协议接口结构”,简称为“接口”。接口通常包含一组相关的函数指针和数据结构。每个协议都有一个GUID,GUID作为协议名称,同样可以指示协议的数据结构。但是GUID不是数据结构的一部分。

下图是一个Protocol示例,包含两个函数和一个数据

协议被收集到一个数据库中,数据库将协议分为很多组,每组称为作为一个Handle,Handle也可以看成组的数据类型。句柄是动态分配的,即Handle不是启动时预先分配好的,而是需要的时候由UEFI固件动态创建的。每个句柄中不能有两个相同的GUID的Protocol。 

2.2 Protocol的产生与消耗

 Protocol用于模块之间的通信。为了建立这种通信吗,其中一个模块需要produce Protocol,而另外一个模块需要consume Protocol。

使用Protocol一般分为三个步骤:

1、通过启动服务找到protocol实例

2、使用这个protocol提供的服务

3、关闭打开的protocol

常用过的Protocol接口函数如下所示:

 一般来说,生产者需要利用InstallProtocolInterface()或InstallMutipleProtocolInterface()在设备句柄上安装protocol接口,如果没有这个句柄,将创建这个句柄并添加到系统句柄列表中。InstallMutipleProtocolInterface()会执行更多的检查工作。调用者需要利用LocateProcotol\HandleProtocol\OpenProtocol找到协议实例。但是三者的使用是由区别的。

LocateProcotol():返回第一个与Protocol匹配的Protocol接口的指针,这个函数会查找第一个支持Protocol的设备句柄,并返回该协议的指针。

typedef
EFI_STATUS
(EFIAPI *EFI_LOCATE_PROTOCOL)(
  IN  EFI_GUID  *Protocol, //协议的GUID
  IN  VOID      *Registration  OPTIONAL, //RegisterProtocolNotify()返回的注册码
  OUT VOID      **Interface //On return, a pointer to the first interface that matches Protocol and Registration.输出参数,指向第一个与协议匹配的protocol接口,如果接口没有实例,接口为NULL
  );

HandleProtocol():查询Handle是否支持指定的Protocol,如果支持返回指向protocol 接口的指针。在使用这个函数的时候可以先利用LocateHandle()返回支持指定协议的handle,再去寻找Protocol接口。

typedef
EFI_STATUS
(EFIAPI *EFI_HANDLE_PROTOCOL)(
  IN  EFI_HANDLE               Handle, //要查询的句柄
  IN  EFI_GUID                 *Protocol, //要查询的protocol的GUID
  OUT VOID                     **Interface //输出参数,指向与protocol匹配的接口的指针
  );

OpenProtocol():会查询句柄是否支持指定的protocol。如果支持将会代替调用者打开protocol。它是HandleProtocol的扩展版本,区别在于OpenProtocol打开protocol interface的代理在EFI的句柄数据库中被跟踪。UEFI驱动模型使用跟踪功能,也用于确定卸载或重新安装协议接口是否安全。

typedef
EFI_STATUS
(EFIAPI *EFI_OPEN_PROTOCOL)(
  IN  EFI_HANDLE                Handle, //要查询的句柄
  IN  EFI_GUID                  *Protocol, //指定的协议
  OUT VOID                      **Interface  OPTIONAL,//输出参数,指向protocol
  IN  EFI_HANDLE                AgentHandle,
  IN  EFI_HANDLE                ControllerHandle,
  IN  UINT32                    Attributes
  );

Protocol的简单使用见博客UEFI——Protocol的简单使用

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

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

相关文章

香港科技大学工学2025/2026年度硕士研究生(MSc)项目招生宣讲会

🔔香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会 🕙时间:2024年9月25日(星期三)19:00 🏠地点:华南理工大学五山校区33号楼403室 🎆2024Ti…

重修设计模式-结构型-桥接模式

重修设计模式-结构型-桥接模式 将抽象和实现解耦,让它们可以独立变化 桥接模式(Bridge Pattern)的主要目的是解耦,创建一个抽象层来隔离接口与实现,让它们之间的依赖关系可以通过对象的组合来替代继承,从而…

运维学习————运维日志分析系统es——Elasticsearch

目录 一、简介 1、全文检索 1、数据分类 2、非结构化数据搜索方法 2、什么是 Elasticsearch 3、用途 4、基本概念 二、下载配置,搭建集群 集群规划 解压 配置环境变量 es配置 由于es启动不能直接使用root用户 启动 三、常用集群命令 一、简介 …

可提示 3D 分割研究里程碑!SAM2Point:SAM2加持泛化任意3D场景、任意提示!

郑重声明:本解读已获得论文作者的原创解读授权 文章链接:https://arxiv.org/pdf/2408.16768 在线demo: https://huggingface.co/spaces/ZiyuG/SAM2Point code链接:https://github.com/ZiyuGuo99/SAM2Point 亮点直击 无投影 3D 分割&#xff1…

DAY14信息打点-JS 架构框架识别泄漏提取API 接口枚举FUZZ 爬虫插件项目

本课意义: 1.如何从表现中的JS提取价值信息 2.如何从地址中FUZZ提取未知的JS文件 3.如何从JS开放框架WebPack进行测试 一、JS 前端架构-识别&分析 在JS中寻找更多的URL地址,在JS代码逻辑(加密算法、APIKey配置、验证逻辑)中进…

C语言——静态链表和动态链表

一、静态链表 创建链表中的一个节点,用struct来创建,其中包含两个部分:数据域和指针域。 创建三个结点,node1、node2、node3,分别赋值,初始化为NULL。接着就是将这些节点进行连接,组成链表。连…

干货分享|分享一款完全免费的PDF工具箱 PDF24

PDF 24介绍: PDF 24是一个全面的PDF工具包,旨在简化和优化PDF文件的处理和管理。它提供了广泛的功能和工具,包括创建、编辑、转换、合并、拆分、加密、解密、压缩、优化、签名、水印等。 主要特点:完全免费,轻量便捷,…

现货黄金避险属性是怎么来的?

众所周知,黄金是一种可以规避风险的品种,当地缘局势冲突、经济下行,甚至是出现军事摩擦等等情况,黄金都会受到避险情绪支撑而上涨。典型的例子,我们可以看俄乌冲突,还有中东的地缘局势等,这些事…

TS 常用类型

我们经常说TypeScript是JavaScript的一个超级 TypeScript 常用类型 TypeScript 是 JS 的超集,TS 提供了 JS 的所有功能,并且额外的增加了:类型系统 所有的 JS 代码都是 TS 代码 JS 有类型(比如,number/string 等&…

OPENAIGC开发者大赛企业组AI黑马奖 | 包你面-AI面试助手

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给您…

Linux基础知识之用户和组

Linux基础知识之用户和组 01 1.什么是用户 用户账户为不同人员和运行的程序之间提供安全边界 用户使用 username 进行标识,操作系统为其分配唯一标识号(UID),用户可能含有密码 系统中的每个程序都以一个特定用户运行&#xff…

上/下三角矩阵的压缩存储

1.给自己出题:自己动手创造,画一个5行5列的下三角矩阵 2.画图:按“行优先”压缩存储上述矩阵,画出一维数组的样子 3.简答:写出元素 i,j 与 数组下标之间的对应关系 4.画图:按“列优先”压缩存储上述矩阵…

【卷起来】VUE3.0教程-06-组件详解

各位看官,点波关注和赞吧 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构: 这和我们嵌套 HTML 元素的方式类似,Vue 实现了自己的…

ssrf漏洞利用+CTF实例

引发ssrf漏洞的几个函数 file_get_contents() 把整个文件读入一个字符串中,获取本地或者远程文件内容fsockopen() 获得套接字信息curl_exec() 执行一个curl会话,由curl_init()初始化一个新的会话,返回一个curl句柄fopen() 打开文件或者URLre…

【数据结构与算法 | 灵神题单 | 插入链表篇】力扣2807, LCR 029, 147

1. 力扣2807:在链表中插入最大公约数 1.1 题目: 你一个链表的头 head ,每个结点包含一个整数值。 在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个…

前端开发macbook——NVM环境配置以及git配置流程

本文主要针对前端使用mac电脑时需要安装nvm对应环境,一文解决环境安装问题 主要步骤如下: 安装homebrew 安装nvm 安装git 第一步:安装homebrew /bin/bash -c "$(curl -fsSL https:/raw.githubusercontent.com/Homebrew/install/HE…

C++基础(七):类和对象之深浅拷贝问题(中-3)

在C编程中,拷贝构造函数是对象复制的核心机制,尤其是在处理对象间的值传递时。当一个对象通过拷贝另一个对象来初始化时,浅拷贝只是简单地复制对象的成员变量的值。如果对象包含指针成员,浅拷贝只复制指针地址,这可能会…

基于matlab交通标志识别系统用的APP designer设计的gui界面 交互原理:bp神经网络-训练好图像处理有灰度化-二值化-颜色区域定位识别

基于MATLAB的交通标志识别系统是一个实用的工具,用于识别道路交通标志。该系统结合了图像处理技术和BP神经网络模型,可以在给定的图像中定位并识别交通标志。通过使用MATLAB的App Designer工具,系统还提供了一个交互式的图形用户界面&#xf…

【idea-安装】

JetBrains官⽹ : https://www.jetbrains.com/ 1.下载idea安装包,下载旧一些的版本,避免新版本的不稳定。 下载下来的安装包是exe格式的,直接点击运行。 点击Next 2.选择要下载的位置,点击下一步。 3.选择⽣成快捷⽅式和建⽴⽂件…

从头开始学MyBatis—01搭建基础框架

首先对mybatis进行一个简单的介绍,然后从最基础的准备工作开始搭建一个mybatis的开发 环境,最后通过简单的增删改查来熟悉配置文件和映射文件的编写。 目录 1.Mybaits简介 2.开发环境和准备工作 2.1开发环境 2.2pom文件 2.3数据库和表 2.4对应实体…