UEFI 中的 Protocol

news2024/11/27 15:45:40

Protocol 在 UEFI 内核中的表示

typedef VOID *EFI_HANDLE;

EFI_HANDLE指向某种对象的指针,UEFI 用它来表示某个对象
UEFI 扫描总线后,会为每个设备建立一个 Controller 对象,用于控制设备,所有该设备的驱动以 Protocol 的形式安装到这个 Controller 中,这个 Controller 就是一个 EFI_HANDLE 对象。当我们将-个.ef文件加载到内存中时,UEFI 也会为该文件建立一个Image对象,这个 Image 对象也是一个EFI_HANDLE对象。在 UEFI内部,EFI_HANDLE 被理解为IHANDLE

每个 IHANDLE 中都有一个Protocols链表,存放属于自己的 Protocol。所有的IHANDLE通过AllHandles链接起来。
IHANDLEProtocols是一个双向链表,链表中每一个元素是PROTOCOL_INTERFACE,通过PROTOCOL_INTERFACEProtocol指针可以得到这个ProtocolGUID,通过Interface指针可以得到这个Protocol的实例。
在这里插入图片描述

使用 Protocol 服务

启动服务提供了丰富的服务供开发者操作 Protocol,操作分两种,一种是使用 Protocol 另一种是产生 Protocol

要使用 Protocol,首先要根据 GUID 找到 Protocol 对象,启动服务提供了 OpenProtocol(...)HandleProtocl(...)LocateProtocol(...) 三种服务用于找出指定的 Protocol
OpenProtocol 用于打开指定句柄上的 ProtocolHandleProtocolOpenProtocol 的简化版;
LocateProtocol 用于找出指定的 Potocol 在系统中的第一个实例。
使用完 Protocol 后还要关闭打开的 Protocol,否则可能会造成内存泄漏。

除了打开和关闭 Protocol,有时还需要找出能支持某个 Protocol 的所有设备,这时就要用到启动服务提供的LocalHandleBuffer 服务。

使用 Protocol 的三个步骤:
1)通过 gBS->OpenProtocol(或 HandleProtocolLocateProtocol)找出 Protocol 对象;
2)使用这个 Protocol 提供的服务;
3)通过 gBS->CloseProtocol 关闭打开的 Protocol

如果想知道某个 Protocol 被哪些设备打开了,那么可以使用OpenProtocolInformation 服务。

OpenProtocol 服务

OpenProtocol 用于查询指定的Handle中是否支持指定的Protocol,如果支持,则打开该Protocol,否则返回错误代码。

Status = gBS->OpenProtocol(…)

HandleProtocol 的提供者,如果 HandleProtocols 链表中有该 Protocol,则 Protocol 对象的指针写到 *Interface,并返回EFI_SUCCESS;否则返回EFI_UNSUPPORTED

在这里插入图片描述

如果在驱动中调用 OpenProtocol(),则 ControllerHandle是拥有该驱动的控制器,也就是请求使用这个 Protocol 的控制器;AgentHandle 是拥有该EFI_DRIVER_BINDING_PROTOCOL对象的 HandIe
EFI_DRIVER_BINDING_PROTOCOLUEFI驱动开发中一定会用到的一个Protocol,它负责驱动的安装与卸载。

如果调用 OpenProtocol 的是应用程序,那么AgentHandle 是该应用程序的 Handle,也就是 UefiMain 函数的第一个参数,ControllerHandle 此时可以忽略。

在这里插入图片描述

Attributes可以取以下 6 种值:

在这里插入图片描述

HandleProtocol 服务

OpenProtocol 功能很强大,但使用起来也比较复杂,除了要提供HandleProtocolGUID,还要提供 AgentHandleControllerHandleAttributes
大部分情况下,开发者只是想通过 ProtocolGUID得到 Protocol对象,并不关心打开方式的细节。
HandleProtocolOpenProtocol的简化版,在调用HandleProtocol时不必再传入AgentHandleControllerHandleAttributes 的值。
AgentHandle 使用gDxeCorelmageHandleControllerHandle 使用NULL值,Attributes 则使用EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL

在这里插入图片描述

在这里插入图片描述

LocateProtocol 服务

LocateProtocol(...)服务,它可以从 UEFI 内核中找出指定 Protocol 的第一个实例。
在这里插入图片描述
在这里插入图片描述
UEFI 内核中某个 Protocol 的实例可能不止一个。LocateProtocol 顺序搜索 HANDLE链表,返回找到的第一个该 Protocol的实例。

LocateHandleBuffer 服务

有时候需要找出支持某个 Protocol 的所有设备,例如找出系统中的所有安装了Blocklo的设备,LocateHandleBufferLocateHandle服务提供了这个功能。
在这里插入图片描述

SearchType 有三种:

在这里插入图片描述
AllHandles 用于找出系统中的所有Handle
ByRegisterNotify用于从 RegisterProtocolNotify 中找出匹配 SearchKeyHandle
ByProtocol 用于从系统 Handle 数据库中找出支持指定ProtocolHANDLE

在这里插入图片描述

LocateHandle 服务与 LocateHandleBuffer的最大区别是需有调用者负责管理 Buffer 数组占用的内存。

其他 Protocol 服务

  1. ProtocolsPerHandle用于获得指定设备所支持的所有Protocol。这些ProtocolGUID通过 ProtocolBuffer返回给调用者,UEFI 负责分配内存给 ProtocolBuffer,调用者负责释放该内存;

  2. OpenProtocollnformation用于获得指定设备上指定Protocol的打开信息;

  3. Protocol 使用完毕后要通过 CloseProtocol 关闭打开的Protocol

    • 通过 HandleProtocolLocateProtocol打开的Protocol因为没有指定 AgentHandle,所以无法关闭。如果一定要关闭它,则要调用OpenProtocolInformation()获得AgentHandleControllerHandle,然后关闭它。

总结

在这里插入图片描述

内容来自于《UEFI 原理与编程》。。。

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

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

相关文章

量子安全与经典密码学:一些现实方面的讨论

量子安全与经典密码学 背景:量子安全与经典密码学量子计算对传统密码学的威胁 安全性分析经典密码学的数学复杂性假设**量子密码学的物理不可克隆性假设** **性能与实现难度**后量子算法在经典计算机上的运行效率**量子通信设备的技术要求与成本** **可扩展性与适用…

【大模型】LLaMA-Factory的环境配置、微调模型与测试

前言 【一些闲扯】 时常和朋友闲聊,时代发展这么快,在时代的洪流下,我们个人能抓住些什么呢。我问了大模型,文心一言是这样回答的: 在快速发展的时代背景下,个人确实面临着诸多挑战,但同时也充满…

PostgreSQL的学习心得和知识总结(一百五十八)|在线调优工具pgtune的实现原理和源码解析

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?

在汽车渲染领域,选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5(Unreal Engine 5)作为两大主流3D软件,各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…

机器学习—迁移学习:使用其他任务中的数据

对于一个没有那么多数据的应用程序,迁移学习是一种奇妙的技术,它允许你使用来自不同任务的数据来帮助你的应用程序,迁移学习是如何工作的? 以下是迁移学习的工作原理,假设你想识别手写的数字0到9,但是你没…

LeetCode 3206.交替组 I:遍历

【LetMeFly】3206.交替组 I:遍历 力扣题目链接:https://leetcode.cn/problems/alternating-groups-i/ 给你一个整数数组 colors ,它表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] : colors[i] …

如何通过高效的缓存策略无缝加速湖仓查询

引言 本文将探讨如何利用开源项目 StarRocks 的缓存策略来加速湖仓查询,为企业提供更快速、更灵活的数据分析能力。作为 StarRocks 社区的主要贡献者和商业化公司,镜舟科技深度参与 StarRocks 项目开发,也为企业着手构建湖仓架构提供更多参考…

25A物联网微型断路器 智慧空开1P 2P 3P 4P-安科瑞黄安南

微型断路器,作为现代电气系统中不可或缺的重要组件,在保障电路安全与稳定运行方面发挥着关键作用。从其工作原理来看,微型断路器通过感知电流的异常变化来迅速作出响应。当电路中的电流超过预设的安全阈值时,其内部的电磁感应装置…

目标检测,图像分割,超分辨率重建

目标检测和图像分割 目标检测和图像分割是计算机视觉中的两个不同任务,它们的输出形式也有所不同。下面我将分别介绍这两个任务的输出。图像分割又可以分为:语义分割、实例分割、全景分割。 语义分割(Semantic Segmentation)&…

16 —— Webpack多页面打包

需求&#xff1a;把 黑马头条登陆页面-内容页面 一起引入打包使用 步骤&#xff1a; 准备源码&#xff08;html、css、js&#xff09;放入相应位置&#xff0c;并改用模块化语法导出 原始content.html代码 <!DOCTYPE html> <html lang"en"><head&…

《PH47 快速开发教程》发布

PDF 教程下载位于CSDN资源栏目&#xff08;网页版本文上方&#xff09; 或Gitee&#xff1a;document ss15/PH47 - 码云 - 开源中国

腾讯云OCR车牌识别实践:从图片上传到车牌识别

在当今智能化和自动化的浪潮中&#xff0c;车牌识别&#xff08;LPR&#xff09;技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力&#xff0c;为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…

C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)

目录 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口&#xff08;同向双指针&#xff09; 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 题目截图&#xff1a; 此题所说的…

[网安靶场] [更新中] UPLOAD LABS —— 靶场笔记合集

GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场一个想帮你总结所有类型的上传漏洞的靶场. Contribute to c0ny1/upload-labs development by creating an account on GitHub.https://github.com/c0ny1/upload-labs 0x01&#xff1a;UPLOAD LABS 靶场初识…

安装python拓展库pyquery相关问题

我采用的是离线whl文件安装, 从官方库地址: https://pypi.org/, 下载whl文件, 然后在本地电脑上执行pip install whl路径文件名.whl 但是在运行时报错如下图 大体看了看, 先是说了说找到了合适的 lxml>2.1, 在我的python库路径中, 然后我去看了看我的lxml版本, 是4.8.0, 对…

春秋云境 CVE 复现

CVE-2022-4230 靶标介绍 WP Statistics WordPress 插件13.2.9之前的版本不会转义参数&#xff0c;这可能允许经过身份验证的用户执行 SQL 注入攻击。默认情况下&#xff0c;具有管理选项功能 (admin) 的用户可以使用受影响的功能&#xff0c;但是该插件有一个设置允许低权限用…

图论入门编程

卡码网刷题链接&#xff1a;98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …

Jackson库中JsonInclude的使用

简介 JsonInclude是 Jackson 库&#xff08;Java 中用于处理 JSON 数据的流行库&#xff09;中的一个注解。它用于控制在序列化 Java 对象为 JSON 时&#xff0c;哪些属性应该被包含在 JSON 输出中。这个注解提供了多种策略来决定属性的包含与否&#xff0c;帮助减少不必要的数…

鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)

文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多&#xff0c;跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时&#xff0c;需要解决设备发现、设备认证、设备连接、数据同步等技术难题&#xff0c;不但开发成本高&#xff0c;还存…

【论文复现】融入模糊规则的宽度神经网络结构

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 融入模糊规则的宽度神经网络结构 论文概述创新点及贡献 算法流程讲解核心代码复现main.py文件FBLS.py文件 使用方法测试结果示例&#xff1a…