本文简单介绍一下UEFI中的事件管理:

UEFI是不支持多进程的,但是UEFI支持多事件分发机制。UEFI只支持时钟中断,并基于时钟中断实现事件分发。类似于OS中基于时钟中断来实现基于时间片的多任务调度。

下图是DXE内核管理事件的结构:

1. UEFI把事件分成32个优先级,当我们创建一个事件的时候,我们会把他添加到链表gEventSignalQueue中.

2. 当我们触发(sign)一个事件时,我们会把他添加到他对应的优先级的链表&gEventQueue[Event->NotifyTpl]中.

下图是执行内核调用和时钟中断发生时进行事件分发的过程:

1. CoreTimerTick()是我们的时钟中断服务函数【类似Linux中的scheduler_tick()】,他会去遍历定时器事件链表,如果有定时器到期,就触发mEfiCheckTimerEvent,CoreCheckTimers()作为回调函数被调用.

补充说明:

1.内核为每种优先级的任务定义了一个链表(当我们signal一个Event的时候,他会被插入到对应优先级的链表中):

  //
// 我们为每个优先级都定义了一个链表
// 所以这里要初始化每个链表
//
for (Index=; Index <= TPL_HIGH_LEVEL; Index++) {
InitializeListHead (&gEventQueue[Index]);
}

2.关于锁机制:

我们看到只有当我们在释放锁的时候(即恢复之前优先级的时候CoreRestoreTpl),才会去执行事件分发:一般来说程序执行在TPL_APPLICATION水平(比较低了),而大部分Event都属于TPL_CALLBACK或TPL_NOTIFY(都高于TPL_APPLICATION),所以在CoreRestoreTpl的时候,位于&gEventQueue链表中的事件会得到执行。

  // 查看所有高于即将恢复到的优先级别上的待处理事件
//
while (((- << NewTpl) & gEventPending) != ) {
gEfiCurrentTpl = (UINTN) HighBitSet64 (gEventPending); // 得到下一个要处理的最高级别
if (gEfiCurrentTpl < TPL_HIGH_LEVEL) {
CoreSetInterruptState (TRUE); //时钟中断被重新启动
}
CoreDispatchEventNotifies (gEfiCurrentTpl); //调用该级别中的所有(事件的)回调函数
}

EDK II之DXE Core的事件管理的更多相关文章

  1. EDK II之DXE Core框架简介

    本文旨在简单的介绍一下DXE阶段的工作原理: UDK2015的开源代码下载:https://github.com/tianocore/tianocore.github.io/wiki/EDK-II D ...

  2. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  3. Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2]

    Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2] 2015-07   北京海淀区  ...

  4. Tools:downloading and Building EDK II工具篇:安装/使用EDKII源代码获取/编译工具[2.3]

    Tools:Installing and using the Required Tools for downloading and Building EDK II工具篇:安装/使用EDKII源代码获取 ...

  5. JavaScript 事件管理

    在设计JavaScript xxsdk的时候考虑到能让调用者参与到工作流程中来,开始用了回调函数.如下: this.foo = function(args,callbackFn) { //do som ...

  6. jquery技巧之让任何组件都支持类似DOM的事件管理

    本文介绍一个jquery的小技巧,能让任意组件对象都能支持类似DOM的事件管理,也就是说除了派发事件,添加或删除事件监听器,还能支持事件冒泡,阻止事件默认行为等等.在jquery的帮助下,使用这个方法 ...

  7. Redis事件管理(二)

    Redis的定时器是自己实现的,不是很复杂.说说具体的实现吧. 定时器的存储维护采用的是普通的单向链表结构,具体节点定义为: /*时间定时器结构体*/ typedef struct aeTimeEve ...

  8. Redis事件管理(一)

    Redis统一的时间管理器,同时管理文件事件和定时器, 这个管理器的定义: #if defined(__APPLE__) #define HAVE_TASKINFO 1 #endif /* Test ...

  9. Redis事件管理(三)

    Redis的事件管理和定时器的管理都是自己来实现的,Redis的事件管理分为两部分,一部分是封装了系统的异步事件API,还有一部分是在这基础上封装了一个通用的事件管理器,根据具体的系统来决定具体使用哪 ...

随机推荐

  1. 【Java】-NO.16.EBook.4.Java.1.010-【疯狂Java讲义第3版 李刚】- 异常

    1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.010-[疯狂Java讲义第3版 李刚]- 异常 Style:EBook Series:Java Si ...

  2. pom.xml实例

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. 【LeetCode每天一题】Group Anagrams(变位词组)

    Given an array of strings, group anagrams together. Example: Input: ["eat", "tea" ...

  4. mybatis oracle 插入自增记录 获取主键值 写回map参数

    网上搜了好多文章照着弄都返回不了主键给map, 实践证明要在传入的map参数里写回插入的主键,要这样写 <selectKey resultType="java.lang.Integer ...

  5. webpack使用雪碧图插件

    1.先安装插件 npm install --save-dev webpack-spritesmith 2.配置webpack 配置之前 先引入var SpritesmithPlugin = requi ...

  6. 从零开始一起学习SLAM | C++新特性要不要学?

    LAM,C++编程是必备技能.不过,大家在学校里学习的书本一般比较老,主要还是C++98那些老一套. 本文所谓的C++新特性是指C++11及其以后的C++14.C++17增加的新关键字和新语法特性.其 ...

  7. Mybatis中的常用的三个查询方法

    selectList 用于查询多条数据的情况,返回值是一个list集合.如果没有查到任何数据,返回没有元素的集合(空集合,不是null) selectOne 用于查询单条数据的情况,返回值是一个对象, ...

  8. 路径遍历:ZIP条目覆盖

    程序在解压zip文件时,如果没有验证zip条目,攻击者可能对条目覆盖,从而造成路径遍历 例如:以下代码示例解压zip文件.    static final int BUFFER = 512;    / ...

  9. Mybatis时间段比较

    在开始时间和结束时间内的一段时间范围的查询 <if test="timeStart != null and timeStart != ''"> and wfsj > ...

  10. QT5 QT4--LNK2019 无法解析的外部符号

    新创建的工程 #include <QtWidgets/QApplication> #include <QtWidgets/QWidget> #include <QtWid ...