UEFI.源码分析.DXE的异步事件服务.第一部分.事件驱动

UEFI源码解析之调试环境搭建 UEFI-Edk2源码复杂且BIOS运行依赖主板硬件,学习阶段可通过编译edk2源码包中的模拟器调式edk2的代码结构和运行流程。 1. 依赖环境的安装:Win10下edk2编译环境搭建 Visual Studio community 2017(注册微软账号,避免VS社区版试用阶段过期) EDK2-stable-202002 下载地址:https://github.com/tianocore/edk2/releases/tag/edk2-stable202002 下载源码到本地目录如D:\ 阅读详情
  • 源代码:EDK2
  • 版本:UDK2017
  • UEFI源码分析第二篇,异步事件服务
  • 第一部分,事件驱动
  • 优先级的讨论将在另一篇,即第二部分。
  • 定时器类型EVT_TIMER将在第三部分

事件

每一个事件都是一个IEvent类型

/** /Dxe/Event/Event.h **/
 45 #define EVENT_SIGNATURE         SIGNATURE_32('e','v','n','t')
 46 typedef struct {                                             
 47   UINTN                   Signature;                         
 48   UINT32                  Type;                              
 49   UINT32                  SignalCount;                       
 53   LIST_ENTRY              SignalLink;                       
 57   EFI_TPL                 NotifyTpl;                         
 58   EFI_EVENT_NOTIFY        NotifyFunction;                    
 59   VOID                    *NotifyContext;                    
 60   EFI_GUID                EventGroup;                        
 61   LIST_ENTRY              NotifyLink;                        
 62   UINT8                   ExFlag;                             
 66   EFI_RUNTIME_EVENT_ENTRY RuntimeData;                       
 67   TIMER_EVENT_INFO        Timer;                             
 68 } IEVENT;                                                    

可以看到有多个链表

  • SignalLink
  • NotifyLink

这是提供给不同事件类型所使用。事件有以下几种类型。

/** MdePkg/Include/Uefi/UefiSpec.h **/
 384 //                                                          
 385 // These types can be ORed together as needed - for example,
 386 // EVT_TIMER might be Ored with EVT_NOTIFY_WAIT or          
 387 // EVT_NOTIFY_SIGNAL.                                       
 388 //                                                          
 389 #define EVT_TIMER                         0x80000000        
 390 #define EVT_RUNTIME                       0x40000000        
 391 #define EVT_NOTIFY_WAIT                   0x00000100        
 392 #define EVT_NOTIFY_SIGNAL                 0x00000200        
 393                                                             
 394 #define EVT_SIGNAL_EXIT_BOOT_SERVICES     0x00000201        
 395 #define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202        

大致有如下特性
- Notify意味着有NotifyFunction在事件发生的时候被调用,也就是回调函数
- Wait意味着可以使用WaitForEvent来等待事件的发生,其阻塞直到事件被Signal
- Signal意味着事件可以被唤醒
- Timer意味着该事件是一个定时器,IEvent的Timer域会被填充,其中包含一个Link来链接所有的定时器
- 这些特性是可以被OR来组合到一起的,即运算符|

两个类型只在此提一下,不详述
- EVT_SIGNAL_EXIT_BOOT_SERVICES是在UEFI系统退出(ExitBootServices())的时候调用,通常用来回收资源
- EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE在操作系统加载器调用运行时服务RuntimeServices的虚拟地址服务来进行虚拟地址转换的时候调用。

主要关注两个类型
- EVT_NOTIFY_WAIT可等待事件
- EVT_NOTIFY_SIGNAL可唤醒事件


重要的全局变量

  • gEventSignalQueue保存所有未被唤醒、类型为EVT_NOTIFY_SIGNAL的事件
  • gEventQueue保存已经被唤醒、需要执行回调函数的事件,根据优先级分为多个链表
  • gEventPending使用位图来保存gEventQueue是否含有某个优先级的链表
  • mEventTable包含了所有合法的事件类型

相关接口

创建事件CreateEvent
/** /Dxe/Event/Event.c **/
 378 EFI_STATUS                                              
 379 EFIAPI                                                  
 380 CoreCreateEventInternal (                               
 381   IN UINT32                   Type,                     
 382   IN EFI_TPL                  NotifyTpl,                
 383   IN EFI_EVENT_NOTIFY         NotifyFunction, OPTIONAL  
 384   IN CONST VOID               *NotifyContext, OPTIONAL  
 385   IN CONST EFI_GUID           *EventGroup,    OPTIONAL  
 386   OUT EFI_EVENT               *Event                    
 387   )                                                     
 388 {                                                       

Type域即事件的类型

NotifyTpl是回调函数的优先级,在本系列的第二部分会介绍,NorifyFunction即回调函数本身,NofityContext即传递给回调函数的参数。

EventGroup是事件组特性,其使用一个GUID来标识该事件属于一个事件组,同组内的事件均含有相同的GUID,不同事件组的GUID必然不同。

Event是返回的、创建完成的事件,EFI_EVENT类型本质上是IEvent*类型。


1、检查事件的类型

 401   Status = EFI_INVALID_PARAMETER;                                              
 402   for (Index = 0; Index < (sizeof (mEventTable) / sizeof (UINT32)); Index++) { 
 403      if (Type == mEventTable[Index]) {                                         
 404        Status = EFI_SUCCESS;                                                   
 405        break;                                                                  
 406      }                                                                         
 407   }                                                                            
 408   if(EFI_ERROR (Status)) {                                                     
 409     return EFI_INVALID_PARAMETER;                                              
 
DXE-------Driver Execution Environment (执行驱动环境)详解 DXE是在PEI阶段之后的下一个阶段。它实现了驱动环境的搭建(UEFI第三阶段)。DXE阶段执行了大量的系统初始化工作,在PEI的基础上,进入此阶段时,内存已经可以被完全使用,因此此阶段可以进行大量复杂的工作。DXE驱动之间通过Protocol通信。当所有的Driver都执行完毕后,系统完成初始化,接着会执行一个特殊的DXE Driver 的Protocol进而进入BDS阶段。从本质上讲,BDS是一种特殊的DXE阶段的应用程序。整体流程DxeMain是DXE阶段执行的主函数,入口函数。 阅读详情

相关推荐

UEFI.源码分析.DXE的异步事件服务.第三部分.定时器与时钟中断

源代码:EDK2 版本:UDK2017 UEFI源码分析第二篇,异步事件服务 第三部分,定时器 第一部分,事件驱动 第二部分,任务优先级 设置定时器EVT_TIMER 244 EFI_STATUS 245 EFIAPI 246 CoreSetTimer ( ...

随便写写 1225

UEFI.源码分析.DXE的异步事件服务.第二部分.任务优先级

源代码:EDK2 版本:UDK2017 UEFI源码分析第二篇,异步事件服务 第二部分,任务优先级 第一部分,事件驱动 定时器类型EVT_TIMER将在第三部分 任务优先级简述 典型的优先级有四种 /** MdePkg/Include/Uefi/UefiSpec.h **/ 585 // 586 // Task prior...

随便写写 1191

UEFI源码解析之EVENT

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

wangadi057612的博客 2977

UEFI.源码分析.DXE的内存服务.第三部分.HeapGuard

源码EDK2:Tianocore UEFI源码分析系列第二篇,DXE阶段的内存服务 第三部分,HeapGuard DXE阶段源码目录MdeModulePkg/Core/Dxe 基于开篇日(2018/04/18:16:30)时最新的EDk2版本,commit为255101471918ed8840f2be347916b90eef0e9c08 从初始化过程入手 直到CoreAddMemo...

随便写写 1345

UEFI学习(三)-创建一个dxe driver

创建一个dxe driver创建UEFI DXE driverDXE驱动的运行阶段DXE驱动创建 创建UEFI DXE driver 在edk2中,我们可以了解到它有非常多种类的模块,每种模块运行于不同阶段,上一阶段,我们尝试了一下标准应用程序的工程模块,接下来我们试一下创建一个DXE 驱动模块。借助此过程来了解DXE驱动模块的特点。 DXE驱动的运行阶段 首先我们要先了解一下,DXE驱动是运行于什么时期,可以通过什么方式展现,对于我们应该怎么去看到自己的模块有没有实现,有没有在运行。由于这方面的内容目

weixin_42951246的博客 5658

UEFI 学习 - 运行第一个DXE Driver

一、 编写源代码编写C:\edkii\OvmfPkg\MyHelloWorldDXEDriver\MyHelloWorldDXEDriver.cEFI_STATUSEFIAPI1编写C:\edkii\OvmfPkg\MyHelloWorldDXEDriver\MyHelloWorldDXEDriver.inf[Defines][Sources][Packages]BaseLibDebugLib。

技术联盟 1085

qcom 高通UEFI架构BootLoader edk2源码

高通UEFI架构,ABL部分代码,从开源分支拉的,平台为SDM845。

OpenDRIVE车道计算避坑指南:为什么你的poly3曲线总对不齐?

本文深入解析OpenDRIVE标准中车道几何计算的三大核心难题:参数化三次多项式(ParamPoly3)的坐标系转换与参数映射、车道偏移与宽度的优先级判定,以及螺旋线(Spiral)接续的平滑性保障。通过实战案例与代码示例,提供了一套避免车道线错位与曲率不连续的精确计算与验证方法,是高精地图开发与仿真场景构建的实用避坑指南。

q9w8e7r6t5的博客 421

硬件基础——mos管

文章目录前言一、寄生参数二、使用步骤1.引入库2.读入数据总结 前言 MOS管设计重点 一、寄生参数 1.寄生电容 mos管有寄生电容Cgs,此电容大小一般为pF级别,一般规格书可以查到。 使用时,要特别注意GS管教的寄生电容Cgs,控制MOS管的导通与截止,本质上是控制Cgs电容的充放电。(最好要加限流) 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt imp

Malqaq的博客 6594

DSP28335与Vofa+上位机通信实战:SCIb配置避坑指南(附完整代码)

本文提供DSP28335与Vofa+上位机通信的实战指南,重点解析SCIb模块配置的常见问题与解决方案。针对研旭开发板的硬件连接、波特率精确计算、FIFO高效使用以及FireWater协议封装进行了详细说明,并附有完整代码,帮助开发者快速实现实时数据可视化与波形分析,提升调试效率。

weixin_29172963的博客 150

EEGLAB安装、EDF数据导入、EEG预处理(Matlab)

目录下载和安装下载安装遇到问题及解决方案导入EDF数据EEG预处理 下载和安装 下载 链接:https://pan.baidu.com/s/17eMT6B7LgZ4PyqWvD5ixmg 提取码:12gz 安装 **第一步:**将下载下来的文件解压,修改名称为eeglab,将此文件夹存放在matlab的安装目录里的toolbox文件夹下,下图是我的路径,需要拷贝到自己相对应的路径中 第二步: 打开Matlab软件,点击主页中的设置路径 设置路径 点击添加并包含子文件夹,将eeglab文件夹添加进来,保

y18771025420的博客 1万+

HC-05蓝牙模块AT指令配置避坑全记录:从配对失败到稳定主从通信

本文详细记录了HC-05蓝牙模块AT指令配置的全过程,从基础认知到主从通信的稳定实现。涵盖了进入AT模式的方法、关键AT指令详解、主从配对流程及常见故障排除,帮助开发者快速掌握蓝牙串口模块的配置技巧,避免常见配对失败问题。

weixin_42632434的博客 414

结构力学程序算法理论基础(一)————虚功原理

1.约束 定义约束:限制质点或者质点系运动的条件称为约束,表示这些限制条件的数学方程称为约束方程。 (1)几何约束 限制质点或者质点系在空间的几何位置的条件称为几何约束.如单摆,其中质点M可绕固定点O在平面Oxy内摆动,摆长为l.这时摆杆对质点的限制条件是:质点M必须在以点O为圆心,以l为半径的圆周上运动.其约束方程为: 又质点M在固定的曲面上运动,那么曲面方程就是质点M的约束方程,即 上...

l93919861的博客 4511

Android Binder的两三事--基于Android14源码

Android14-Framework-Binder

保持专注,保持热爱 1140

基于Simulink的MIMO-OFDM系统仿真建模示例

MIMO概述MIMO技术利用多个天线进行信号发送和接收,通过空间复用来提高数据传输速率,或通过空间分集来增强信号的可靠性。OFDM概述OFDM是一种将高速率数据流分成多个低速数据流并行传输的技术,每个子载波都采用调制方式(如BPSK、QPSK),并通过IFFT/FFT变换实现串并转换。MIMO-OFDM优势结合了MIMO的空间分集增益与OFDM对抗多径效应的能力,适用于宽带无线通信系统。提供了更高的数据速率和更好的频谱效率,是现代无线通信标准(如4G LTE、5G NR等)的核心技术之一。

xiaoheshang_123的博客 327

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: UEFI.源码分析.DXE的内存服务.第三部分.HeapGuard
下一篇: UEFI.源码分析.DXE的异步事件服务.第二部分.任务优先级
木艮氵
博客等级 码龄11年 136粉丝 51原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值