EFI基本概念之Event

UEFI开发学习7 - Event相关服务 UEFI提供了异步操作,Event是异步操作的基础,有了Event的支持,才可以在UEFI系统内执行并发操作,基于Event的异步操作,提高了CPU利用率,减少了总的等待时间。 阅读详情

1 基本概念及函数

    最近在帮公司弄一个ALPHA架构的EFI BIOS,在调DXE_CORE的时候,发现必须要装几个CPU架构相关的协议。如果这几个协议不去安装,代码就不会执行BDS阶段。代码侦测协议有没有安装,是通过CoreRegisterProtocolNotify()函数实现的,这个函数在未安装协议之前,便先建立PROTOCOL_ENTRY变量,然后将其链接到mProtocolDatabase链表中,并将已经有的Event链接到自己的Notify链表中。等到代码真正安装Protocol实例后,这个Event便会被调用,代码有Event NotifyFunction中便知道某个CPU架构类协议有没有建立起来。开始时代码中没加装载这几个协议的驱动,所以代码跑不到BDS阶段,只是打印出架构协议未安装的调试信息。这个设计很巧妙,也展现了EFIEvent强大的一角。

    新闻联播上总是说,北京时间XX点,发生了XX事件。这句话有两个重点,时间和事情。EFI的Event同样也有这两个特性:一,Event是个可发生(执行)的函数;二,Event需要在某个时间点发生。在EFI里,实现第一个特性是用CreateEvent()或CreateEventEx(),实现第二个特性需要使用SignalEvent()。Event除了这几个函数外,也包括关闭事件函数CloseEvent(),等待事件函数WaitForEvent(),检查事件函数CheckEvent()。下面分别介绍一下他们的基本用法。

1.1 创建事件

EFI_STATUS

EFIAPI

CoreCreateEvent (

  IN UINT32                   Type,

  IN EFI_TPL                  NotifyTpl,

  INEFI_EVENT_NOTIFY         NotifyFunction,OPTIONAL

  IN VOID                     *NotifyContext, OPTIONAL

  OUTEFI_EVENT               *Event

  )

这个函数创建了一个Type类别的,NotifyTpl级别的,拥有NotifyFunction函数的Event事件。NotifyFunction是可选的,如果NotifyTpl拥有EVT_NOTIFY_SIGNAL或EVT_NOTIFY_WAIT级别,则其作为有效参数被使用。

 

EFI_STATUS

EFIAPI

CoreCreateEventEx (

  IN UINT32                   Type,

  IN EFI_TPL                  NotifyTpl,

  INEFI_EVENT_NOTIFY         NotifyFunction,OPTIONAL

  IN CONSTVOID               *NotifyContext,OPTIONAL

  IN CONSTEFI_GUID           *EventGroup,    OPTIONAL

  OUTEFI_EVENT               *Event

  )

    此函数比CreateEvent()多了一个EventGroup函数,与CreateEvent创造的事件不同的是,BootServcies函数无法单独触发。

 

1.2 销毁事件

EFI_STATUS

EFIAPI

CoreCloseEvent (

  IN EFI_EVENT    UserEvent

  )

    此函数将UserEvent销毁,从链表中摘除,并释放占有的内存空间。

 

1.3 触发事件

EFI_STATUS

EFIAPI

CoreSignalEvent (

  IN EFI_EVENT    UserEvent

  )

    触发UserEvent事件。

 

1.4 等待事件

EFI_STATUS

EFIAPI

CoreWaitForEvent (

  IN UINTN        NumberOfEvents,

  IN EFI_EVENT    *UserEvents,

  OUT UINTN       *UserIndex

  )

    此函数停止当前的任务,等待NumberOfEvents个事件发生,若其中一个事件发生,则退出并反馈给用户这个信息:第userIndex个事件发生了。

 

1.5 检查事件

EFI_STATUS

EFIAPI

CoreCheckEvent (

  IN EFI_EVENT        UserEvent

  )

    此函数检查UserEvent的现在状态。

 

1.6 其它事件相关函数

1.6.1 CoreSetTimer()

    为Timer事件设置类型和触发时间,Timer那一章介绍过了,此处略过。

1.6.2 CoreRaiseTpl ()

    为当前任务升权。

1.6.3 CoreRestoreTpl ()

    恢复任务权限级别,所有Event级别比新的任务权限级别高的,都会得到执行。

 

 

2 Event相关结构

2.1 Event真身

typedef struct {

  UINTN                   Signature;

  UINT32                  Type;

  UINT32                  SignalCount;

  LIST_ENTRY              SignalLink;

  EFI_TPL                 NotifyTpl;

 EFI_EVENT_NOTIFY       NotifyFunction;

  VOID                    *NotifyContext;

  EFI_GUID                EventGroup;

  LIST_ENTRY              NotifyLink;

  BOOLEAN                 ExFlag;

 EFI_RUNTIME_EVENT_ENTRY RuntimeData;

 TIMER_EVENT_INFO        Timer;

} IEVENT;

    CreateEvent()函数最后一个参数是输出参数EVENT,它的真身就是IEVENT结构体。其它输入参数,都被赋于了这个结构体的成员。

 

2.2 gEfiCurrentTpl

    当前任务级别。可以将其看为Legacy BIOS中的当前中断优先级。

 

2.3 gEventQueue[]

    一个专门链接处于触发态的事件的双向链表,其有32个元素,当前只用了4个。分别是: TPL_APPLICATION,TPL_CALLBACK,TPL_NOTIFY,TPL_HIGH_LEVEL。

    Event事件被SignalEvent()后,便会将其塞入到gEventQueue[Event-> NotifyTpl]链表里。当CoreRestoreTpl()函数执行时,如果Event-> NotifyTpl大于恢复后的任务权限级别,gEventQueue [Event-> NotifyTpl]所链接的所有Event都会被执行,执行完后,Event从gEventQueue [Event-> NotifyTpl]中移除。

 

2.4 gEventPending

    该全局变量为一指示型变量。其每一位指示gEventQueue[]的每一个元素是否链接有相应的Event,若有则为1,没有值为0。因其类型为UINTN,但是gEvent[]的元素有32个。所以如果某一类型CPU的数据宽度小于32位,我们要强制将其类型设为大于或等于32位的。

 

2.5 gEventSignalQueue

    这是一个双向链表。当我们创造一个EVENT时,要将EVENT链入该链表中。当CloseEvent()时,从该链表中移除。

 

2.6 mEventTable[]

    有效的Event类型。EVENT类型不在此数组元素内,创建EVENT时不会成功。



(完,附上一张EVENT相关结构图,是2014年,小明刚学BIOS时,画的一张图。RuntimeData的直接忽略吧,毕竟代码还未支持,而且也没有支持的必要)


EFI Event 事件机制详解 EFI(Extensible Firmware Interface,可扩展固件接口)是由英特尔推出的、用于替代传统BIOS的固件接口标准。在EFI架构中,事件机制取代了传统BIOS的中断机制,成为系统POST(上电自检)及运行阶段任务调度的核心手段。 阅读详情

相关推荐

UEFI源码解析之EVENT

UEFI-EDK2是单核单线程的架构,除了时钟中断外,没有其他中断机制,Event在UEFI中实现了异步执行的能力;

wangadi057612的博客 2978

UEFI EVENT的疑惑

UEFI CreateEvent RegisterProtocolNotify

菠菜的专栏 5467

Uefi中的Event

将Event当作32开发中的中断来看,主要作用还是在于提高系统性能,不用把CPU资源浪费在等待上,当事件触发后,再让CPU过来处理。

Wuxin的博客 764

UEFI学习——事件函数WaitForEvent和CreateEvent/CreateEventEx

本文参考戴正华《UEFI原理与编程》 1.等待事件的服务WaitForEvent 启动服务中的WaitForEvent服务的函数原型: /**等待Event数组内任一事件被触发 @retval EFI_SUCCESS 下表为*index的事件被触发 @retval EFI_UNSUPPORTED 当前的TPL不是TPL_APPLICATION @retval EFI_INVALID_PARAMETER 下标为*index的事件类型为EVT_

吴立赛的博客 5721

【ROS2】Arduino系列之机器人底盘实现

介绍ros中提供的一个已经封装了的模块: ros_arduino_bridge,该模块由下位机驱动和上位机控制两部分组成,通过该模块可以更为快捷、方便的实现自己的机器人平台

guilin 1485

Rockchip RK3566 Buildroot SDK构建与内核编译实战指南

嵌入式Linux开发中,交叉编译环境是系统启动的基础支撑。Buildroot作为轻量级嵌入式构建框架,通过配置驱动、自动化下载和分层编译机制,显著降低定制化Linux发行版的集成门槛。其核心价值在于将内核、根文件系统与工具链统一管理,兼顾资源约束下的确定性构建与工程可复现性。典型应用场景涵盖ARM64平台(如RK3566)的固件开发、IoT设备量产镜像生成及硬件Bring-up阶段的快速验证。本文围绕Buildroot SDK全流程实践,深入解析环境搭建、Repo源码同步、离线DL库预置及内核编译等关键环节

weixin_36047538的博客 136

【UEFI基础】UEFI事件介绍

【UEFI基础】UEFI事件介绍。

jiangwei0512的博客 3629

Python 逆向解析知乎盐选反爬字体,实现内容精准还原

本文详细解析了知乎盐选内容的反爬字体机制,并提供了使用Python逆向解析WOFF字体文件的完整方案。通过fontTools库构建解码字典,实现乱码文本的精准还原,帮助开发者应对动态字体策略,同时强调法律与道德风险。

weixin_29268385的博客 1296

UEFI BIOS之Event(事件)

1.Event, Timer, and Task Priority Functions 2.Function Introduction(函数介绍)3.Event Types(事件类型) 4.Task Priority Levels(TPLs)

weixin_43072680的博客 1264

【算法】—前缀和与差分详解

前缀和指一个数组的某下标之前的所有数组元素的和(即数列的前n项求和),前缀和是一种重要的预处理,能够降低算法的时间复杂度,可以快速地求出某一段的和,对于处理区间之间的问题是往往十分高效相比较其他算法而言,前缀和更像是一种解题的技巧,一种优化方式输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和5 32 1 3 6 41 21 32 4123453610。

DAY I 的成长之路 6022

【智能体】零代码实战:Coze多智能体协作开发全流程解析

本文详细解析了Coze平台的多智能体协作开发全流程,从入门指南到实战技巧,帮助用户零代码构建高效AI团队。通过模块化设计和专业分工,多智能体系统能显著提升任务处理速度和准确率,适用于客服、内容创作、教育培训等多个场景。文章还提供了性能优化和常见问题解决方案,助力开发者快速掌握Multi-Agent技术。

weixin_29239279的博客 336

EFI基本概念之Timer

1 基本概念及用法     在LegacyBIOS中,设备采用中断方式来和CPU交互。但现在已过渡到了EFI时代,中断方式已成往事随风飘。那设备如何和CPU交换信息呢? EFI使用了查询的方式。不同的设备,查询也有快慢之分,所以EFI保留了Timer中断。利用Timer中断,CPU可以在规定的时间点,去查询设备有没有数据要传输。     在Intel平台中,Timer使用的是8254和Time

zhao_longwei的专栏 2072

【具身算法】VLA算法-Diffusion Policy

《扩散策略:多模态机器人控制的新方法》摘要 本文提出了一种基于扩散模型的机器人控制策略(DiffusionPolicy),用于解决视觉运动控制中的多模态行为、高维动作空间和训练稳定性问题。该方法利用去噪扩散概率模型(DDPM)生成动作序列,通过迭代优化处理复杂动作分布,显著提升了性能。实验表明,在15项机器人操作任务中,扩散策略平均性能提升46.9%,有效解决了传统显式/隐式策略的局限性。其核心优势在于:1)优雅建模多模态动作分布;2)适应高维动作空间;3)训练过程稳定。未来工作将探索与强化学习的结合及计算

puzhinan7781的博客 1391

UEFI——Event(事件)简单使用

在UEFI中所有的异步操作都要通过事件(Event)来实现。事件通常用于通知某个事件的发生,例如设备插入、硬件错误、系统启动等等。UEFI事件可以被不同组件监听,并根据事件类型执行相应的操作。启动服务为开发者提供了一些函数,用于操作事件、定时器以及TPL(任务优先级),这些函数可以分为三类:事件相关函数、定时器相关函数及TPL相关函数。

蟹蟹泥的博客 1306

光耦继电器电路分析

光耦电路的分析笔记

MingYue_SSS的博客 6881

给STM32F4装上耳朵:用麦克风模块和Keil MDK实现你的第一个语音指令(附完整代码)

本文详细介绍了如何使用STM32F4开发板和麦克风模块实现简单的语音指令识别系统。通过Keil MDK开发环境配置、ADC音频采样、语音活动检测和模板匹配算法,开发者可以快速构建响应'开灯'、'关灯'等基础指令的语音交互方案。文章包含完整代码实现和调试技巧,特别适合STM32初学者入门语音识别领域。

weixin_29171087的博客 435

UEFI BIOS 之 Event 详细介绍

中断:CPU执行程序时,由于发生了某种随机的事件,引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断传统的中断模式硬件中断- 敲键盘→键盘信号传输给EC→EC产生硬件中断 (IRQ)到CPU→中断信号输入到CPU的中断控制器→OS执行对应的软件代码来获取键盘按键。

qq_43561214的博客 2166

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【UEFI基础】Event(一)

从头梳理一下UEFI Event

humanof的专栏 1599

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

EFI & UEFI

** EFI & UEFI ** 1.定义 PC BIOS有一个限制(支援16 bit 的处理器模式,1MB 位址空间与AT 硬件架构),而这个限制使的他无法支援大型服务器平台的系统 EFI(Extensible Firmware Interface):可延伸韧体界面,他规范了一个 面,界于OS与 (Platform firmware)之间的一个桥梁。 EFI的改进被用 取代传统BIOS的界面(这个传统的界面被称之为IBM PC compatible PC 的BIOS或称之为Legacy B

weixin_45177645的博客 2479

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

UEFI —— Event详解

UEFI中Event详解

学习记录 3647

UEFI Dxe foundation--event

gEventQueue[Index] TPL分4个等级:Application=4 callback=8 Notify=16 High_level=31 Index为0~31 每个Entry为Event->NotifyLink gEventSignalQueue:每个Entry为IEvent->Sig...

sunna346867721的专栏 455

UEFI event

VOID PrintA (EFI_EVENT Event, VOID *Context) { Print( L"A" ); } VOID PrintB (EFI_EVENT Event, VOID *Context) { Print( L"B" ); } VOID PrintC (EFI_EVENT Event, VOID *Context) { Print( L"C" ); } VOID PrintD (EFI_EVENT Event, VOID *...

262

UEFI架构解读系列之EVENT

在UEFI 开机过程中,我们会有这样的需求,某个特定的条件满足的时候,去运行一段代码,在legacy BIOS 里面,我们是用中断去做的,在UEFI 里面,我们是用EVENT 去实现的。 1. EVENT 数据结构: typedef struct { UINTN Signature; UINT32 Type; U

Helping BIOSer become Awesome! 5724

event 情景分析

在进biossetup之前,我们可以在屏幕上显示“Entering BIOS Setup BIOS以一秒为步长周期性的打印到屏幕上。 这个就是用event来实现的。 相关代码如下: // // Create a timer to indicate "Entering Setup". // IndicatorMessage = NULL; IndicatorMessage = HiiGetString (mStringHiiHandle, STRING...

Helping BIOSer become Awesome! 3612

DXE-Event和Timer练习

UEFI内部只使用时钟中断,摒弃了其他中断,所以异步操作通过Event实现。至于使用event替代中断的优点,个人认为在于,使用中断不方便代码在不同平台的移植。

C学习 876

UEFI EVENT 全解

Event和Timer在UEFI当中是怎么实现的以及原理,我们先从Timer开始,然后细细的拨开隐藏在底层的实现。 先说Timer,那什么是Timer呢?其实在中文里面我们把它叫做定时/计数器,但是我的理解它不仅仅是一个定时/计数器硬件而是一个被程序设计者设定为工作在特殊模式下的 做定时/计数器,仅仅是一个硬件的定时器还不能算是Timer。定时/计数器在几乎所有的数字处理器系统当中都是一个必备的设备,没有它我们的各种运行在cpu上的系统软件都会瘫痪,他们就会变成生活在桃花源当中的世外人一样,完全没有时间.

子曰小玖的博客 1941
上一篇: EFI基本概念之Timer
下一篇: 吕小敏Legend
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值