一、Event的定义与概念
在UEFI中所有的异步操作都要通过事件(Event)来实现。事件通常用于通知某个事件的发生,例如设备插入、硬件错误、系统启动等等。UEFI事件可以被不同组件监听,并根据事件类型执行相应的操作。
事件服务由EFI_BOOT_SERVICES提供,启动服务为开发者提供了一些函数,用于操作事件、定时器以及TPL(任务优先级),这些函数可以分为三类:事件相关函数、定时器相关函数及TPL相关函数。
事件可以处于signaled状态,表示事件已经被触发或通知,或者是事件等待处理。事件不处于signaled状态,表示事件尚未触发或通知。
函数介绍:
CreateEvent() 用于产生一个事件,其函数原型为:
/**
Creates an event.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_CREATE_EVENT)(
IN UINT32 Type, //要创建的事件类型及其模式和属性。
IN EFI_TPL NotifyTpl, //TPL, 事件的优先级
IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL, //指向事件通知函数的指针,如果有的话
IN VOID *NotifyContext OPTIONAL, //通知函数上下文的指针
OUT EFI_EVENT *Event //输出参数,指向新产生的事件
);
Type:事件的模式和属性,可以利用#define来定义事件的类型和模式,例如:
//事件的类型和模式,可以通过按位或组合
#define EVT_TIMER 0x80000000 //表示是一个定时器事件
#define EVT_RUNTIME 0x40000000 //表示是一个运行时事件
#define EVT_NOTIFY_WAIT 0x00000100 //表示是一个等待事件,用于操作系统中等待事件的产生
#define EVT_NOTIFY_SIGNAL 0x00000200 //表示这是一个信号事件,用于通知事件的发生
#define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201 //退出启动服务的事件,通知UEFI固件即将退出启动服务
#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202 //虚拟地址改变的事件,用于UEFI固件正在改变虚拟地址的通知
NotifyTpl: 事件的优先级
// Task priority level
//
#define TPL_APPLICATION 4 //应用程序级的事件,优先级相对较低
#define TPL_CALLBACK 8 //回调事件,其他组件完成某个操作后触发
#define TPL_NOTIFY 16 //通知事件
#define TPL_HIGH_LEVEL 31 //高优先级事件,用于紧急情况或关键操作
NotifyFunction OPTIONAL:调用一个通知事件(如果有的话),其原型为
/**
Invoke a notification event
调用一个通知事件
@param[in] Event Even