UEFI Driver Services

news2024/9/30 1:26:47

为UEFI驱动程序提供的UEFI引导服务和UEFI运行时服务一般可分为三个方面:

  • 驱动通常使用
  • 很少使用的服务
  • 不应该使用的服务

UEFI驱动程序通常使用的服务

下表列出了UEFI驱动程序通常使用的UEFI服务。接下来,讨论将简要描述每种服务,它们为什么被普遍使用,或它们有用的特殊情况。代码示例显示了UEFI驱动程序通常如何使用服务,并如何按服务类型进行分组。

ServiceTypeService TypeDescription
AllocatePool()BootMemory AllocationAllocates a memory buffer of a particular type.
AllocatePool()BootMemory AllocationAllocates a memory buffer of a particular type.
FreePool()BootMemory AllocationFrees a previously allocated memory buffer…
AllocatePages()BootMemory AllocationAllocates one memory buffer of a particular type with a 4KB aligned start address and a 4KB aligned length…
FreePages()BootMemory AllocationFrees a memory buffer previously allocated with AllocatePages().
CopyMem()BootMiscellaneousCopies a buffer from one location to another.
SetMem()BootMiscellaneousInitializes the contents of a buffer with a specified value.
InstallMultipleProtocolInterfa()BootProtocol HandlerInstalls one or more protocol interfaces onto a handle. Replaces the InstallProtocolInterface() service…
UninstallMultipleProtocolInter()BootProtocol HandlerUninstalls one or more protocol interfaces from a handle. Replaces the UninstallProtocolInterface() service…
LocateHandleBuffer()BootProtocol Handler从符合搜索条件的句柄数据库中检索句柄的列表。返回的缓冲区将被自动分配。.
LocateProtocol()BootProtocol Handler在支持请求协议的句柄数据库中的第一个句柄。
OpenProtocol()BootProtocol Handler向使用协议接口的代理的列表中添加元素.
OpenProtocolInformation()BootProtocol Handler检索当前正在使用协议接口的代理的列表。
CloseProtocol()BootProtocol Handler从使用协议接口的代理列表中删除元素。
RaiseTPL()BootTask Priority提高了任务的优先级级别。
RestoreTPL()BootTask Priority恢复/降低任务的优先级级别。。
CreateEvent()BootEvent创建一个通用的事件结构。
CreateEventEx()BootEvent创建事件结构作为事件组的一部分
CloseEvent()BootEvent关闭并释放一个事件结构。
SignalEvent()BootEvent触发一个事件。
CheckEvent()BootEvent检查事件是否处于已触发状态。
SetTimer()BootTime-related设置要在特定时间发出信号的事件。
Stall()BootTime-related等待指定数量的微秒。

InstallMultipleProtocolInterfaces() and UninstallMultipleProtocolInterfaces()

这些服务用于执行以下操作:

  • 在句柄数据库中创建新的句柄
  • 从句柄数据库中删除一个句柄
  • 向句柄数据库中的现有句柄添加协议
  • 从句柄数据库中的现有句柄中删除协议
    -如果在将协议添加到句柄时产生了任何错误,那么在返回错误之前添加的任何协议都会被安装多协议接口()自动删除。这意味着句柄数据库中的句柄的状态与调用之前的状态相同。

LocateHandleBuffer()

此服务从句柄数据库中检索符合搜索条件的句柄列表。以下是搜索选项:

  • 检索所有句柄:检索句柄数据库中的所有句柄。
  • 检索ByProtocol:检索句柄数据库中支持指定协议的所有句柄。
  • 检索ByRegisterNotify:检索使用RegisterProtocolNotify()为注册通知配置特定协议的句柄,对于UEFI驱动程序,强烈建议使用此搜索选项

OpenProtocol()

使用OpenProtocol(),以防止在驱动程序使用协议时协议被删除。
如果一个层需要跳过一个层以到达一个较低级别的服务,那么使用EFI_OPEN_PROTOCOL_GET_PROTOCOL是安全的,因为如果删除了较低级别的协议,则将通过这些层通知驱动程序。
在EDK II中,最好的例子是FAT驱动程序。FAT驱动程序使用磁盘I/O协议的服务来访问大容量存储设备的内容。
但是,磁盘I/O协议并没有刷新服务。只有块I/O协议具有刷新服务。磁盘I/O驱动程序会打开块I/O协议EFI_OPEN_PROTOCOL_BY_DRIVER,因此FAT驱动程序也不允许打开块I/O协议EFI_OPEN_PROTOCOL_BY_DRIVER。相反,FAT驱动程序必须使用EFI_OPEN_PROTOCOL_GET_PROTOCOL。此方法是安全的,因为当磁盘I/O协议响应于删除块I/O协议时,当删除块I/O协议时,就会间接通知FAT驱动程序。

事件服务

启动服务中事件相关函数有6个,函数名大部分以Event结尾。提供给事件生产者的函数有CreateEvent/CreateEventEx、SignalEvent及CloseEvent。提供给事件使用者的有WaitForEvent和CheckEvent。
WaitForEvent 是阻塞操作,直到Event数组内任一事件被触发,或任一事件导致错误出现,WaitForEvent才返回,如果所有事件都没被触发,则从头开始重新检查。

事件类型

在这里插入图片描述
还有两种特殊的事件,它们用在操作系统系统加载器从启动期向运行时期转换的过程

  1. EVT_SIGNAL_EXIT_BOOT_SERVICES: 此类事件是一种特殊的EVT_NOTIFY_SIGNAL,实际上它是EVT_NOTIFY_SIGNAL和0x0000001的组合。当ExitBootServices()执行时,事件被触发。EVT_SIGNAL_EXIT_BOOT_SERVICES不能和其它类型混合使用。它的Notification函数和子函数不能使用启动服务中的内存分配服务;在Notification函数执行前所有的定时器都已失效,因而在Notification函数中也不能使用定时器服务。
    2)EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE:它是EVT_RUNTIME_CONTEXT、EVT_RUNTIME、EVT_NOTIFY_SIGNAL和0x0000002的组合。它不能和这4种类型之外的类型组合使用。当SetVirtualAddressMap()被调用时触发此类事件

UEFI驱动程序很少使用的服务

ServiceTypeService TypeDescription
ConnectController()BootProtocol Handler使用一组优先级规则来查找要管理控制器的最佳驱动程序集.
DisconnectController()BootProtocol Handler通知一组驱动程序以停止管理控制器。.
ReinstallProtocolInterface()BootProtocol Handler在设备句柄上重新安装一个协议接口。
LocateDevicePath()BootProtocol Handler定位支持特定协议并具有最近匹配的设备路径的设备句柄
LoadImage()BootImage仅供能够加载、启动和可能卸载存储在总线子设备上其他位置的其他图像中的UEFI驱动程序使用。
StartImage()BootImage仅供能够加载、启动和可能卸载存储在总线子设备上其他位置的其他图像中的UEFI驱动程序使用。.
GetVariable()RuntimeVariable返回一个变量的值.
SetVariable()RuntimeVariable设置一个变量的值.
QueryVariableInfo()RuntimeVariable返回有关EFI变量的信息。…
GetTime()RuntimeTime-related返回当前的时间和日期,以及平台的计时功能。.
CalculateCrc32()BootMiscellaneous维护UEFI系统表、UEFI引导服务表和UEFI运行时服务表的校验和。
ConvertPointer()RuntimeMiscellaneous有时会被UEFI运行时驱动程序使用。UEFI引导服务驱动程序永远不应该使用此服务。
InstallConfigurationTable()BootMiscellaneous从UEFI系统表中添加、更新或删除一个配置表。
WaitForEvent()BootEvent直到发出事件被唤醒才停止执行。
GetNextMonotonicCount()BootSpecial提供了一个64位的单调计数器,并保证会增加。

UEFI驱动程序不使用的服务

下表列出了UEFI驱动程序不应该使用的UEFI服务。这些服务可能被UEFI驱动程序以外的组件使用,或者这些服务可能已经被较新的服务所取代,

ServiceTypeService TypeDescription
InstallProtocolInterface()BootProtocol Handler已替换为InstallMultipleProtocolInterfaces().
UninstallProtocolInterface()BootProtocol Handler替换为UninstallMultipleProtocolInterfaces()
HandleProtocol()BootProtocol Handler查询一个句柄,以确定它是否支持指定的协议,替换为OpenProtocol()。
LocateHandle()BootProtocol Handler定位支持特定协议并具有最近匹配的设备路径的设备句柄
ProtocolsPerHandle()BootProtocol Handler检索安装在句柄上的协议的列表。返回的缓冲区将被自动分配。此服务已被替换为:UEFI驱动程序绑定协议中的启动函数。
RegisterProtocolNotify()BootProtocol Handler注册要在为指定协议安装接口时发出信号的事件。此服务已被替换为:UEFI驱动程序绑定协议中支持的()函数。.
UnloadImage()BootImage用于卸载先前加载的UEFI驱动程序。.
GetNextVariableName()RuntimeVariable用于历通过UEFI变量服务维护的UEFI变量列表。通常不需要使用这项服务。.
SetWatchDogTimer()BootTimerelated返回有关EFI变量的信息。…
SetTime()RuntimeTime-related设置当前的本地时间和日期信息。UEFI驱动程序不应使用此服务;UEFI驱动程序不应修改系统时间或唤醒计时器。.
GetWakeupTime()RuntimeTime-related返回当前的唤醒闹钟设置。UEFI驱动程序不应该使用此服务;从UEFI启动管理器管理来计时。。
SetWakeupTime()RuntimeTime-related设置系统唤醒闹钟的时间。UEFI驱动程序不应该使用此服务;监视器计时器从UEFI引导管理器进行管理
GetMemoryMap()BootMemory Allocation返回当前引导服务的内存映射和内存映射键
ExitBootServices()BootSpecial该服务将平台的控制从UEFI一致性固件传递到操作系统。UEFI驱动程序必须永远不能使用此服务。
SetVirtualAddressMap()RuntimeSpecial对于希望使用虚拟地址调用UEFI运行时服务的操作系统,只有UEFI操作系统加载器或操作系统内核才会使用此服务。UEFI驱动程序必须永远不能使用此服务。
QueryCapsuleCapabilities()RuntimeSpecialTest to see if a capsule or capsules can be updated via UpdateCapsule().
UpdateCapsule()RuntimeSpecial允许操作系统将信息传递给固件。.
ResetSystem()RuntimeSpecial重置并设置在引导服务期间使用的看门狗计时器。UEFI驱动程序不应该使用此服务;从UEFI启动管理器管理来计时.
Exit()BootSpecialUEFI驱动程序不应该使用此服务。此服务通常由应用程序使用。.
GetNextHighMonotonicCount()RuntimeSpecial提供了一个64位的单调计数器,并保证会增加。

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

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

相关文章

scala函数参数

目录 可变参数如果参数列表在存在多个参数,那么可变参数一般放置在最后参数默认值,一般将有默认值的参数放置在参数列表的后面带名参数(一般不使用,除多个参数有默认值且只需给极少个参数赋值的情况) 可变参数 当有不…

无线测温在线监测系统工作原理与产品选型

摘要:本文首先介绍了无线测温在线监测系统的基本工作原理以及软硬件组成,重点介绍了在线监测的无线测温技术特点。在此研究基础上,探讨了无线测温在线监测系统在实际工作场景中的应用案例,证明了其在温度检测方面的重要应用价值。…

浅谈数字化工厂五大核心系统

一、什么是数字化工厂 数字化工厂是将数字技术应用于工厂生产、管理和运营中的一种方式,可以帮助企业提高生产效率和质量,降低成本和风险,提高竞争力和市场份额。数字化工厂是中小制造业企业自主建设制造业信息化的途径。 简道云数字化工厂解…

stm32虚拟串口无法连接,驱动安装,DFU驱动安装

虚拟usb串口设备 插上设备后, COM这里多了一个端口, 但是其用串口调试助手无法打开 在其他设备这里多了一个STM32xx Virtual COM, 更新驱动程序 浏览我的电脑以查找驱动程序让我从计算机上的可用驱动列表中选取端口(COM和LPT)厂商: STMicroelectronics 型号: STMicroelectroni…

倾斜摄影三维模型、激光点云、正射影像、数字高程模型如何实现在线浏览?

四维轻云是成都远石技术团队基于浏览器打造的一款地理空间数据管理云平台,可实现TB级大规模倾斜摄影三维模型发布管理,并支持私有化部署和高阶功能定制化开发。 1、注册登录 首先在四维轻云官网点击「立即试用」按钮,进入登录页面并点击「注…

手写vue(三)模板渲染解析

一、目标 创建一个Vue实例时,我们可以传入el配置项,去指定一个DOM元素作为Vue容器,而这个Vue容器中,可以使用例如插值表达式等Vue框架提供的语法,并且能够渲染到浏览器页面上。 而浏览器并不能解析这些Vue语法&#xf…

Ubuntu20.04软件安装大全

目录 Ubuntu20.04 软件安装大全前言1. Windows和Ubuntu双系统安装1.1 下载Ubuntu系统镜像1.2 磁盘分区1.3 GPT分区安装Ubuntu1.4 系统完成后的一些设置1.5 遇到的一些小bug 2. 换源2.1 apt换源2.2 pip换源 3. 显卡驱动安装3.1 卸载显卡驱动3.2 准备工作3.3 驱动安装3.4 验证 4.…

分享5款小软件,让你打造更舒适的办公电脑

每次发现实用的小工具,都会有种小小的成就感,这也是我喜欢收集和分享高效工具的原因。 图标定制软件——CustomizerGod CustomizerGod是一款强大的电脑图标定制软件,可以让你随心所欲地改变系统中的任何图标。你可以使用CustomizerGod来修改桌面、任务…

Node 01-Buffer

Buffer(缓冲器) 概念 Buffer 是一个类似于数组的 对象 ,用于表示固定长度的字节序列 Buffer 本质是一段内存空间,专门用来处理 二进制数据 。 特点 Buffer 大小固定且无法调整Buffer 性能较好,可以直接对计算机内存…

AI智能课程第一讲:chatgpt介绍

AI应用现状 用AI艺术创作 一个小女孩打折手电筒在侏罗世纪公园找恐龙。 AI用于医疗行业 AI辅助驾驶 AI广告投放上的应用 什么是chatgpt? chatgpt相关技术的发展 为什么用chatgpt写代码会特别的快呢? 因为它集成了GitHub上所有开发者的库公用资源&…

战胜儿童乙肝,早治是关键

在我国实施新生儿乙型肝炎疫苗免疫规划后,母婴传播量明显减少。2014年,中国疾病预防控制中心对全国1-29岁人群乙型肝炎血清流行病学调查结果显示,1-4岁人群HBSAg流行率仅为0.32%,较1992年下降96.7%。然而,仍有6%的新生…

X509证书中的Signature Algorithm

Signature Algorithm在X509中的结构 分别在整个证书结构中Certificate的第二项和 TBSCertificate结构中的第三项: 对于ECC和国密算法 The AlgorithmIdentifier parameters field MUST be absent. 各种签名算法的OID: ECC的: ecdsa-with-SHA256 OBJECT IDENTIFI…

计网第五章.运输层—TCP的三次握手与四次挥手

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录 一、TCP三次握手建立连接为什么TCP客户进程最后还要发送一个普通的TCP确认报文段呢?能不能两次握手?总结: 二、TCP四次挥手释放连接四次挥手过程问题1:TCP客户进程在发送…

【推荐】1657- 灵活可扩展,2023年值得尝试的13款富文本编辑器

作为前端开发人员,我们经常需要为网站和应用程序添加文本内容。与传统的文本编辑器不同,富文本编辑器可让您轻松创建各种类型的文本内容,包括加粗字体、斜体字、框架、列表、图片和视频等。 本文我将向大家推荐 13 款开源的灵活可拓展的富文本…

HTML5的新特性,CSS3的新特性

1.HTML5的新特性 HTML5的新特性主要针对以前的不足,增加了一些新的标签,新的表单,新的表单属性等。 这些新特性都有兼容性问题,基本是IE9以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量使用这些新…

Docker之Dockerfile

Dockerfile 1. Dockerfile 简介2. Dockerfile 构建过程3. Dockerfile 常用指令4. 实战测试 centos5. 实战测试 Tomcat镜像6. 发布自己的镜像6.1 DockerHub6.2 阿里云镜像服务 7. 小结 1. Dockerfile 简介 Dockerfile 是用来构建docker 镜像的文件!是一个命令参数脚本…

MySQL 窗口函数

MySQL的窗口函数是一种特殊类型的聚合函数,使用窗口函数可以使查询更高效,因为它们可以避免在多个聚合阶段中重复扫描相同的行。还可以使用窗口函数来计算一些有趣的结果,例如排名、百分比和移动平均值等。 目录 一、认识窗口函数1、窗口函数…

重入的问题搞清楚

很久很久之前&#xff0c;写入重入问题的文章 如果你在笔试的实际&#xff0c;面试官问——下面这个代码有什么问题&#xff1f; #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #incl…

代码随想录算法训练营第三十四天|1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

文章目录 1005.K次取反后最大化的数组和134. 加油站:star:135. 分发糖果:star::star::star: 1005.K次取反后最大化的数组和 链接:代码随想录解题思路&#xff1a; 遇到负数就去反,k– 当k能遇到正数的是否&#xff0c;如果k % 2 1 必须取一个最小的正数进行取反再加才行 pub…

Vue 计算属性

文章目录 Vue 计算属性computed vs methodscomputed setter Vue 计算属性 计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子&#xff1a; 实例 1 <div id"app">{{ message.split().reverse().join() }}…