如何理解UEFI的事件机制(二)

我看了很多文章,包括用的教材都是基础知识——时间中断——调度这个顺序

这给我造成了很多误解,因为看时钟中断看了很久,但完全不知道它和异步事件调度有什么联系,看到最后才恍然大悟,原来是这样。

虽然这种博客应该没什么人看,但恭喜你,不用奇怪这点了。

故事要从上篇提到的恢复(降低)优先级的RestoreTpl说起

这个函数前面都很正常,断言啊,判断啊,比较有意思的是这一段

  while (gEventPending != 0) 
{
    PendingTpl = (UINTN) HighBitSet64 (gEventPending);
    if (PendingTpl <= NewTpl) {
      break;
    }
    gEfiCurrentTpl = PendingTpl;
    if (gEfiCurrentTpl < TPL_HIGH_LEVEL) {
      CoreSetInterruptState (TRUE);
    }
    CoreDispatchEventNotifies (gEfiCurrentTpl);
    //执行gEventQueue [gEfiCurrentTpl]队列里所有event的Notification函数
  }

之前提过,gEventPending是一个32位的二进制串,置1说明此位有事件已经被触发,等着你执行

那么这段就很好理解了

取出当前等待执行队列中优先级最高的,和准备恢复的优先级比较

如果比它小或者相同,退出函数

如果比它大,说明系统还有更要紧的事情,先执行高优先级的

这样,当一个事件恢复自己的优先级,系统里比它优先级高的事件全都执行了——至于这些事件什么时候触发,是的,在时钟中断里触发。

上一篇也说了,时间中断和waitforevent的优先级都是4。以时钟中断为例,时钟每10ms中断一次,每次中断先把自己的优先级拉到31,再调用RestoreTpl把自己的优先级降回4,每中断一次,事件就调度一次。

最后一篇讲时钟中断——应该还有一些维持的数据结构什么的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值