news 2026/10/20 15:49:50

UEFI基础知识学习2

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UEFI基础知识学习2

一、 UEFI Driver Binding 模型

1、简要描述

UEFI Driver Binding 是 UEFI Driver 管理设备的标准模型。

UEFI Driver 加载后,通过安装EFI_DRIVER_BINDING_PROTOCOL到Driver Image Handle上,向系统声明自己可以识别、启动和停止某类设备Controller。

2、核心函数

EFI_DRIVER_BINDING_PROTOCOL包含三个核心函数:Support、Start和Stop。

typedefstruct_EFI_DRIVER_BINDING_PROTOCOL{EFI_DRIVER_BINDING_SUPPORTED Supported;//判断该Driver是否支持某个 Controller。EFI_DRIVER_BINDING_START Start;//启动 Controller,打开 Protocol,安装 Protocol。EFI_DRIVER_BINDING_STOP Stop;//停止 Controller,关闭 Protocol,卸载 Protocol。UINT32 Version;//驱动优先级,版本高的优先尝试EFI_HANDLE ImageHandle;//当前Driver镜像的HandleEFI_HANDLE DriverBindingHandle;//安装Driver Binding Protocol的Handle}EFI_DRIVER_BINDING_PROTOCOL;

3、运作流程

DXE Dispatcher 加载 Driver Image | v DriverEntryPoint 执行 //UEFI DXE Driver被加载后最先执行的入口函数 | v 安装 EFI_DRIVER_BINDING_PROTOCOL | v 系统调用 ConnectController() //触发 Driver Binding 流程的 Boot Services 接口 | v 遍历可用 Driver Binding Protocol | v 调用 Supported() | v 如果支持,调用 Start() | v Driver 打开底层 Protocol,初始化设备 | v Driver 安装新的 Protocol | v 需要断开时调用 DisconnectController() | v 触发 Stop()

4、ControllerHandle、DriverBindingHandle 和 ChildHandle

Handle说明
DriverBindingHandle驱动自身的Handle
ControllerHandle被驱动管理的设备对象
ChildHandleBus Driver枚举出的子设备对象

例如:

USB Bus Driver | |DriverBindingHandle v USB Controller | |ControllerHandle v USB Device 1: U盘 --> ChildHandle USB Device 2: 键盘 --> ChildHandle USB Device 3: 鼠标 --> ChildHandle

5、Driver 类型

类型作用是否创建ChildHandle
Device Driver直接驱动某个设备通常不会创建
Bus Driver枚举总线上的子设备通常会创建
Hybrid Driver同时具备设备驱动和总线驱动能力执行总线时会创建

6、OpenProtocol

在Driver Binding模型中,OpenProtocol()起到获取接口、记录驱动和设备之间的管理关系的作用。
三个重要的Attributes参数:

EFI_OPEN_PROTOCOL_BY_DRIVER //获取接口,不表示接管设备。 EFI_OPEN_PROTOCOL_GET_PROTOCOL //表示这个 Driver 正式接管这个 Controller。 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER //Bus Driver 创建 Child Handle 时使用。
  • ChildHandle创建流程:
Bus Driver 在 Start() 里枚举到子设备 创建 ChildHandle 安装 Device Path Protocol 安装描述这个子设备的 Protocol 用 OpenProtocol BY_CHILD_CONTROLLER 建立父子关系

7、常见案例——USB U盘出现fs0:

(1)DXE Dispatcher 加载 USB Bus Driver (2)USB Bus Driver 安装 Driver Binding Protocol (3)ConnectController() 尝试连接 USB Controller (4)调用 USB Bus Driver 的 Supported() (5)Supported() 判断 Controller 支持 USB (6)调用 Start() (7)Start() 初始化 USB Controller (8)枚举 USB 设备 (9)为 U 盘创建 ChildHandle (10)安装相关 USB Protocol (11)后续 Mass Storage Driver 连接这个 ChildHandle (12)安装 Block IO Protocol (13)文件系统 Driver 发现 Block IO Protocol (14)安装 Simple File System Protocol (15)Shell 看到 fs0:

8、常见源码位置

MdePkg/Include/Protocol/DriverBinding.h MdeModulePkg/Bus/Pci/PciBusDxe/ MdeModulePkg/Bus/Usb/UsbBusDxe/ MdeModulePkg/Universal/Disk/

9、Q&A

(1)Driver Binding 是什么?
  • UEFI Driver Binding 是 UEFI 驱动管理设备的标准模型,用来判断、启动和停止某个设备 Controller。

(2)Supported / Start / Stop 分别做什么?
  • Supported()判断驱动是否支持这个设备。Start()真正启动设备,打开底层 Protocol,初始化设备,并安装新的 Protocol。Stop()停止设备,关闭 Protocol,卸载 Protocol,释放资源。

(3)Device Driver 和 Bus Driver 有什么区别?
  • Device Driver直接驱动某个具体设备。Bus Driver管理一条总线,并枚举出子设备,也就是ChildHandle。

(4)OpenProtocol BY_DRIVER是什么意思?
  • 表示这个 Driver 要以驱动身份打开某个 Protocol,并正式接管这个 Controller。

二、Event 与 Timer 机制

1、简要描述

Event 是 UEFI 中的事件通知机制,Timer 是一种可以按时间触发的 Event。

它们用于异步通知、定时任务、等待用户输入、阶段退出回调等场景。

2、Event

(1)Event 常见用途

在DXE阶段常用:

  • 等待某个事件发生,如键盘输入或某个 Protocol 被安装。

  • 定时触发回调。

  • 在某个阶段发生时收到通知,如ExitBootServices时通知驱动清理资源。

  • VirtualAddressChange 时通知 Runtime Driver 转换地址。

  • Protocol 安装后触发 notify。

(2)Event接口
类型详细作用
创建 EventCreateEvent()&CreateEventEx()创建一个 Event,等待事件、通知事件或 Timer 事件
触发 EventSignalEvent()主动触发一个 Event,让它变成“已发生”状态
等待 EventWaitForEvent()等待一个或多个 Event 发生,常用于等待键盘输入等
检查 EventCheckEvent()检查某个 Event 是否已经发生,不阻塞等待
关闭 EventCloseEvent()关闭 Event,释放相关资源
设置 TimerSetTimer()给 Event 设置定时触发方式

实例:
(1)自己创建、触发、等待、释放 Event。

gBS->CreateEvent(Type,NotifyTpl,NotifyFunction,NotifyContext,&Event);gBS->SignalEvent(Event);gBS->WaitForEvent(1,&Event,&Index);gBS->CloseEvent(Event);

(2)等待键盘输入

gBS->WaitForEvent(1,&gST->ConIn->WaitForKey,&Index);
(3)Event类型
EVT_NOTIFY_SIGNAL //Event 被 Signal 时,执行回调函数。 EVT_NOTIFY_WAIT //当有人等待或检查这个 Event 时,执行回调函数。 EVT_TIMER //表示这个 Event 可以被 Timer 触发,和 SetTimer() 配合使用。
(4)NotifyFunction

Event 发生后,系统调用 NotifyFunction,Context 用来告诉回调函数该处理什么对象。

VOID EFIAPINotifyFunction(IN EFI_EVENT Event,IN VOID*Context//创建 Event 时传进去的上下文数据。);

3、Timer

Timer 不是单独一套机制,而是挂在 Event 上的定时触发能力。

(1)TPL

TPL 是 Task Priority Level,表示事件回调执行时的任务优先级。
常见 TPL:

TPL说明
TPL_APPLICATION普通应用级别
TPL_CALLBACK普通回调常用
TPL_NOTIFY较高优先级通知回调
TPL_HIGH_LEVEL最高级别,通常不应随意使用
(2)Timer类型
类型作用
TimerCancel取消定时器
TimerPeriodic周期性触发
TimerRelative延迟一次触发
  • 注意:UEFI Timer 的时间单位是:100ns,
    gBS->SetTimer(Event, TimerPeriodic, 10000000);的意思是大约每 1 秒触发一次。
(3)通用流程
CreateEvent 创建带 EVT_TIMER 的 Event | SetTimer 设置定时方式 | 时间到 | Event 被触发 | 执行 NotifyFunction | CloseEvent 关闭 Event

4、源码位置

MdeModulePkg/Core/Dxe/Event/ MdePkg/Include/Uefi/UefiSpec.h MdePkg/Include/Guid/EventGroup.h

三、Variable Services 与 NVRAM 存储

1、简要描述

  • UEFI Variable 是BIOS/UEFI 提供的一套键值存储机制。

  • 数据通常保存在NVRAM中,掉电后依然存在。

  • Variable Services 属于 Runtime Services,所以部分变量在 OS runtime 阶段仍可访问。

2、Variable 的组成

要素含义
VariableName变量名,Unicode 字符串
VendorGUID变量命名空间,避免不同厂商变量重名
Data变量数据
Attributes变量属性,决定变量能在哪些阶段访问、是否掉电保存等

3、Variable Services常用接口

主要都在Runtime Services中:

gRT->GetVariable()//读取变量gRT->SetVariable()//创建、修改或删除变量gRT->GetNextVariableName()//枚举变量gRT->QueryVariableInfo()//查询变量存储空间信息

4、NVRAM

  • 非易失性存储区域,Non-Volatile RAM,保存于SPI Flash的某个变量存储区域中。
  • 典型实现中,Variable Runtime DXE 负责变量服务逻辑,Fault Tolerant Write 负责可靠写 Flash,Variable Store 负责组织变量数据结构。厂商 BIOS 可能会在此基础上加入权限、锁定、安全启动、恢复机制等。

5、Variable Attributes

属性说明
EFI_VARIABLE_NON_VOLATILE掉电保留
EFI_VARIABLE_BOOTSERVICE_ACCESSBoot Services 阶段可访问
EFI_VARIABLE_RUNTIME_ACCESSOS Runtime 阶段可访问
EFI_VARIABLE_HARDWARE_ERROR_RECORD硬件错误记录
EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS基于时间的认证写入
EFI_VARIABLE_APPEND_WRITE追加写入

6、GetVariable和SetVariable

GetVariable读取流程:

DataSize = 0,Data = NULL | v 第一次调用 GetVariable() | v 返回 EFI_BUFFER_TOO_SMALL | v UEFI 把真正需要的大小写回 DataSize | v AllocatePool(DataSize) 分配缓冲区 | v 第二次调用 GetVariable() | v 变量数据被读取到 Data 中 | v 使用变量数据 | v FreePool(Data) 释放缓冲区

SetVariable会修改 NVRAM,以下变量不能随意修改:

BootOrder Boot#### Setup PK / KEK / db / dbx Secure Boot 相关变量

7、GetNextVariableName

GetNextVariableName用于枚举所有变量。

gRT->GetNextVariableName()|VariableName+VendorGuid//返回值|gRT->GetVariable()//读取变量的数据和属性

8、源码位置

MdeModulePkg/Universal/Variable/RuntimeDxe/ MdeModulePkg/Universal/FaultTolerantWriteDxe/ MdePkg/Include/Uefi/UefiSpec.h MdePkg/Include/Guid/GlobalVariable.h

四、 Boot Option 与启动项管理

1、简要描述

Boot Option 是 UEFI 用 Variable 保存和管理启动项的机制。

2、关键变量

变量作用
BootOrder启动项顺序,UINT16数组,
Boot####具体启动项,####是四位十六进制编号
BootCurrent本次启动所使用的启动项
BootNext下一次启动优先生效的启动项,只生效一次

3、Boot####

Boot####的数据通常是EFI_LOAD_OPTION格式:

UINT32 Attributes //启动项属性,是否启用 UINT16 FilePathListLength //Device Path 长度 CHAR16 Description[] //启动项显示名称 FilePathList[] //启动设备/启动文件路径 UINT8 OptionalData[] //可选参数

4、BDS 阶段如何使用 Boot Option

BDS 阶段下的流程:

读取 BootNext | 如果 BootNext 存在,优先尝试它,并清除 BootNext | 否则读取 BootOrder | 按照顺序读取 Boot#### | 检查启动项是否启用 | 解析 Device Path //EFI_DEVICE_PATH_PROTOCOL | 加载对应 EFI Image | StartImage 启动 | 如果失败,尝试下一个启动项

5、启动项解析步骤

读取 BootOrder 遍历每个 UINT16 编号 拼接 Boot0001 变量名 读取 Boot#### 解析 Attributes 解析 FilePathListLength 解析 Description 解析 Device Path 输出启动项信息

6、推荐源码位置

MdePkg/Include/Uefi/UefiSpec.h MdePkg/Include/Guid/GlobalVariable.h MdePkg/Include/Protocol/DevicePath.h MdePkg/Library/UefiDevicePathLib/ MdeModulePkg/Universal/BdsDxe/ MdeModulePkg/Library/UefiBootManagerLib/

7、Q&A

(1)Boot Option 是什么?

Boot Option 是 UEFI 用来描述和管理启动项的机制,通常保存在 NVRAM Variable 中。


(2)BootOrder 是什么?

BootOrder 是启动顺序列表,里面保存的是一组 Boot#### 编号。


(3)Boot#### 是什么?

Boot#### 是具体启动项,比如 Windows Boot Manager、USB 启动项、PXE 启动项等。


(4)BootNext 是什么?

BootNext 是下一次启动临时使用的启动项,只生效一次。


(5)Boot#### 里面保存什么?

保存 EFI_LOAD_OPTION,包括启动项属性、显示名称、Device Path 和可选参数。


(6)Boot Option 和 Variable Services 有什么关系?

Boot Option 本质上就是一组 UEFI Variables。

五、Boot Services 与 Runtime Services 区别与应用

1、简要内容

  • Boot Services:启动阶段用的服务,ExitBootServices 后失效。
  • Runtime Services:运行时服务,进入 OS 后仍可用。

2、Boot Services

Boot Services 是 UEFI 在启动阶段提供的大量服务。

作用:

内存分配 Protocol 管理 Handle 管理 Event / Timer 加载和启动 Image Device Path 操作 驱动连接 等待输入

常见接口:

gBS->AllocatePool() gBS->FreePool() gBS->LocateProtocol() gBS->OpenProtocol() gBS->InstallProtocolInterface() gBS->CreateEvent() gBS->SetTimer() gBS->LoadImage() gBS->StartImage() gBS->ConnectController() gBS->ExitBootServices() //Boot Services 只在 ExitBootServices 之前有效,OS Loader 调用 ExitBootServices() 后,系统控制权交给 OS,Boot Services 就不能再使用了。

3、Runtime Services

Runtime Services 是 UEFI 在 OS 阶段仍然可能保留的服务。

作用:

时间服务 变量服务 系统复位 Capsule Update 虚拟地址转换

常见接口:

gRT->GetTime() gRT->SetTime() gRT->GetVariable() gRT->SetVariable() gRT->GetNextVariableName() gRT->ResetSystem() gRT->UpdateCapsule() gRT->SetVirtualAddressMap() gRT->ConvertPointer() ## Runtime Services 在 ExitBootServices 后仍可能可用。

4、生命周期区别

对比项Boot ServicesRuntime Services
有效期ExitBootServices()前ExitBootServices()后仍可用
主要使用者UEFI Driver、UEFI App、BootloaderOS runtime
典型功能Protocol、Event、Memory、ImageVariable、Time、Reset
内存要求Boot Service Code/DataRuntime Code/Data 必须保留

使用场景:

场景服务
枚举 ProtocolBoot Services
安装 ProtocolBoot Services
分配 Boot 阶段内存Boot Services
加载 EFI 文件Boot Services
启动 EFI ImageBoot Services
Event / TimerBoot Services
读写 UEFI VariableRuntime Services
获取系统时间Runtime Services
重启/关机Runtime Services
Capsule UpdateRuntime Services

5、源码位置

MdePkg/Include/Uefi/UefiSpec.h MdeModulePkg/Core/Dxe/ MdeModulePkg/Core/RuntimeDxe/ MdeModulePkg/Universal/Variable/RuntimeDxe/

6、Q&A

(1)Boot Services和Runtime Services的区别是什么?

ExitBootServices()后 Boot Services 失效,Runtime Services 仍可用。


(2)Protocol 相关接口属于哪类?

属于 Boot Services。

(3)Variable Services 属于哪类?

属于 Runtime Services.


(4)LoadImage / StartImage 属于哪类?

属于 Boot Services。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 6:18:44

2026年猫山郎榴莲冰皮月饼测评:究竟值不值得买?

在消费升级的大背景下,月饼市场也迎来了新的变革。消费者不再满足于传统口味的月饼,对具有独特风味和高品质的月饼需求日益增长。榴莲冰皮月饼作为近年来的热门品类,受到了众多消费者的关注。然而,市场上榴莲冰皮月饼品牌众多&…

作者头像 李华
网站建设 2026/9/24 4:13:15

音视频分离、画质受损?如何无损下载4K/8K超清视频?

在日常搞创作、找素材或者单纯想离线追剧时,你一定遇到过这些让人抓狂的坑: 好不容易下载下来的 4K 视频,结果只有画面没有声音(音视频分离)? 在网站上明明看的是超清,用普通视频下载工具存到…

作者头像 李华
网站建设 2026/10/20 15:49:19

知识库文档清洗:垃圾进垃圾出

先把结论甩在前面:RAG 检索答不准,八成不是模型菜,是你喂进去的文档脏。页眉页脚、PDF 抽出来的乱码、同一段话复制了三遍——这些垃圾不清掉,召回的 chunk 里全是噪声,模型再聪明也是在垃圾堆里翻东西。下面是我这两个…

作者头像 李华
网站建设 2026/10/20 7:28:54

Rockwell Automation工厂获世界经济论坛“全球灯塔工厂”认定

这一殊荣充分彰显了Rockwell新加坡工厂在先进制造领域的卓越实力,以及公司在推动人工智能驱动的数字化转型规模化落地方面发挥的引领作用 Rockwell Automation, Inc.(NYSE:ROK)——全球最大的专注于工业自动化与数字化转型的企业…

作者头像 李华
网站建设 2026/10/19 17:23:13

内存计算与CNN加速:IMCE平台与LBLP算法实践

1. 内存计算与CNN加速的现状与挑战在边缘计算和物联网设备爆炸式增长的今天,人工智能模型的部署面临着前所未有的效率挑战。作为一名长期从事AI加速器设计的工程师,我见证了传统数字加速器(如GPU、TPU)在能效比上遇到的瓶颈。数据…

作者头像 李华
网站建设 2026/10/7 4:35:25

写手使用AI生成短篇小说该选什么写作软件?

当前市面上AI写作软件众多,但普遍存在模型单一、创作质量不稳定、长文逻辑断裂、AI痕迹浓重等问题。写手选择时,需关注软件能否解决这些痛点,提升写作效率与质量。aiset就是一款可作为参考的软件。多模型聚合,突破单一局限aiset是…

作者头像 李华