EDK II之DXE Core的事件管理
本文简单介绍一下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的事件管理的更多相关文章
- EDK II之DXE Core框架简介
本文旨在简单的介绍一下DXE阶段的工作原理: UDK2015的开源代码下载:https://github.com/tianocore/tianocore.github.io/wiki/EDK-II D ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- 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 北京海淀区 ...
- Tools:downloading and Building EDK II工具篇:安装/使用EDKII源代码获取/编译工具[2.3]
Tools:Installing and using the Required Tools for downloading and Building EDK II工具篇:安装/使用EDKII源代码获取 ...
- JavaScript 事件管理
在设计JavaScript xxsdk的时候考虑到能让调用者参与到工作流程中来,开始用了回调函数.如下: this.foo = function(args,callbackFn) { //do som ...
- jquery技巧之让任何组件都支持类似DOM的事件管理
本文介绍一个jquery的小技巧,能让任意组件对象都能支持类似DOM的事件管理,也就是说除了派发事件,添加或删除事件监听器,还能支持事件冒泡,阻止事件默认行为等等.在jquery的帮助下,使用这个方法 ...
- Redis事件管理(二)
Redis的定时器是自己实现的,不是很复杂.说说具体的实现吧. 定时器的存储维护采用的是普通的单向链表结构,具体节点定义为: /*时间定时器结构体*/ typedef struct aeTimeEve ...
- Redis事件管理(一)
Redis统一的时间管理器,同时管理文件事件和定时器, 这个管理器的定义: #if defined(__APPLE__) #define HAVE_TASKINFO 1 #endif /* Test ...
- Redis事件管理(三)
Redis的事件管理和定时器的管理都是自己来实现的,Redis的事件管理分为两部分,一部分是封装了系统的异步事件API,还有一部分是在这基础上封装了一个通用的事件管理器,根据具体的系统来决定具体使用哪 ...
随机推荐
- [django]django model的查询和更新
再分享Django系列的另外几篇文章: Django model select的各种用法详解:https://mp.weixin.qq.com/s/JVh4UnS2Tql9gUVaBSoGuA Dja ...
- [py]初始化dict结构和json.dump使用
1.json.dump使用 http://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html ...
- 继承时,当父子类都具有相同的成员变量,默认情况下是直接调用子类的成员变量,当要调用父类的成员变量则需要使用super关键之
package day02; public class Person { String name="fl"; }class Car{ }class Student extends ...
- Java获取环境变量
Java 获取环境变量Java 获取环境变量的方式很简单: System.getEnv() 得到所有的环境变量System.getEnv(key) 得到某个环境变量的值 Map map = Syst ...
- 【Java】-NO.17.EBook.4.Java.1.014-【疯狂Java讲义第3版 李刚】- Annotation
1.0.0 Summary Tittle:[Java]-NO.17.EBook.4.Java.1.014-[疯狂Java讲义第3版 李刚]- Annotation Style:EBook Serie ...
- gcc 6.2.0/6.3.0/8.2.0 编译安装
参考:http://www.linuxfromscratch.org/blfs/view/stable/general/gcc.html 下载地址在这里:https://ftp.gnu.org/gnu ...
- python+selenium入门
from selenium import webdriver打开浏览器 driver = webdriver.Chrome() 打开网页 driver.get("http://www.bai ...
- 了解MQ
一.了解RocketMQ? rocketMQ是阿里开源的一款十分优秀的消息队列,rocketMQ具有很多其他消息队列不具有的特性,更重要的是rocketMQ是用java开发的学习成本较低,并且经历了双 ...
- Winform下如何上传图片并显示出来。同时保存到数据库
通常,我们在开发软件或者网站是否,通常有时候需要添加图片,我们怎么做呢,直接贴例子. 前提是添加openFileDialog控件哈 #region 定义公共的类对象及变量 SqlConn ...
- 16. 3Sum Closest(双指针)
Given an array nums of n integers and an integer target, find three integers in nums such that the s ...