UEFI抢占机制

本文详细介绍了UEFI的抢占机制,包括Task Priority Level、Event、Timer及其应用场景,并通过具体的情景分析展示了如何处理中断和事件调度。此外,还讨论了SpinLock的工作原理,确保任务执行的正确性和顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文件纯属个人理解,如有错误,欢迎指出


1. Task Priority Level, 任务优先级

任务优先级数值越大,优先级越高。优先级高于当前任务优先级的任务可能抢占当前中断当前任务的执行。在UEFI标准中,只有4个优先级

 

表格 1 任务优先级

Task Priority Level

Value

中断

使用经典场景

TPL_APPLICATION

4

启用

.efi文件运行时的默认优先级;调用WaitForEvent时必须处于TPL_APPLICATION优先级

TPL_CALLBACK

8

启用

中间优先级

TPL_NOTIFY

16

启用

中间优先级

TPL_HIGH_LEVEL

31

禁用

最高优先级,处于此优先级时

 

可调用BootServiceRiseTPL/RestoreTPL提升或降低任务优先级。在RestoreTPL时,会调用处于等调用事件处理函数队列中高于当前任务优先级的事件处理函数。

2. Event, 事件

用于同步事件,如,定时器到达指定点后,定时器中断程序会通过调用事件中指定的回调函数及参数完成指定定时任务。

事件共有如下几种类型

 

表格 2 Event类型

Type

功能

EVT_TIMER

0x80000000

定时器

EVT_RUNTIME

0x40000000

运行时事件

EVT_NOTIFY_WAIT

0x00000100

等待事件,checkEvent时会被移入Notify_Callback<

### UEFI 中 TPL_NOTIFY 和 TPL_CALLBACK 的优先级比较 在 UEFI 规范中,任务优先级(TPL, Task Priority Level)用于管理不同任务之间的执行顺序。具体来说,在 EDK 代码中的定义表明: - `TPL_CALLBACK` 定义为数值 8, - `TPL_NOTIFY` 定义为数值 16[^3]。 这意味着 `TPL_NOTIFY` 的优先级高于 `TPL_CALLBACK`。当涉及到多个任务的同时调度时,具有较高 TPL 值的任务会先于较低 TPL 值的任务得到处理。因此,在这两个特定的 TPL 级别之间进行对比时,任何设置为 `TPL_NOTIFY` 的操作都将被赋予更高的优先权去抢占资源或获得 CPU 时间片。 对于具体的实现细节而言,可以通过调用 `RaiseTPL()` 函数来临时提高当前环境下的最小可接受 TPL 至指定的新值,并获取之前的有效 TPL;而在完成高优工作之后,则应该通过相应的 API 如 `RestoreTPL()` 来恢复原始的状态[^2]。 ```c // Example of raising and restoring the TPL in C code. EFI_STATUS RaiseAndDoWork(EFI_TPL NewTpl) { EFI_TPL oldTpl; // Save current TPL and set it to desired value oldTpl = RaiseTPL(NewTpl); // Perform high-priority work here // Restore original TPL after completing critical section RestoreTPL(oldTpl); return EFI_SUCCESS; } ``` #### 关键点总结: - `TPL_NOTIFY` (16)> `TPL_CALLBACK` (8),即前者拥有更高优先级。 - 使用 `RaiseTPL()` 可以改变当前上下文的最低允许 TPL 并返回之前的 TPL 设置。 - 应该总是记得使用像 `RestoreTPL()` 这样的机制来确保系统的稳定性和一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值