CR8寄存器在x86-64 CPU中如何用于优先处理中断?

3
我正在阅读英特尔控制寄存器的文档,但我很难理解CR8寄存器的用途。引用文档(2-18 Vol. 3A):
任务优先级级别(CR8的位3:0) - 这设置了与最高优先级中断对应的阈值,以被阻止。值为0表示启用所有中断。该字段在64位模式下可用。值为15表示将禁用所有中断。
如果您不介意,我有三个快速问题:
  1. 因此,CR8的3到0位组成了这16个优先级值。但是优先级是什么?我猜是正在运行的“线程”,对吗?

  2. 但是当接收到中断时,CR8中的优先级值与什么进行比较,以确定是否必须阻止它?

  3. 当中断被阻止时,这意味着什么?它会被“延迟”到以后的时间,还是只是丢弃,即丢失?

3个回答

6

CR8表示CPU当前的优先级。当有中断等待处理时,会将中断向量号的7到4位与CR8进行比较。如果中断向量号大于CR8,则立即处理该中断;否则,该中断将一直保持等待状态,直到将CR8设为更低的值。

假定APIC正在使用,则其具有一个中断请求寄存器(IRR),每个中断向量号对应一个位。当该位被设置时,表示该中断正在等待处理,它可能一直保持等待状态。

当中断到达时,会将其与IRR进行逻辑或运算。如果该中断已经在等待处理中(也就是说,该向量的IRR位已经设置),则新的中断将与之前的中断合并。(你可以说丢弃了新中断,但我不这么认为,相反,我认为这两个中断被合并成一个中断)由于合并的存在,中断服务例程必须设计为处理所有可用的任务,而不是期望针对每个任务单元都有一个独立的中断。


嗯。谢谢。中断等待多长时间?如果 CR8 一直保持在最高级别会怎样?在这种情况下,是否有一个缓冲区来收集这些中断,在它们被处理之前? - MikeF
@MikeF:大概就是当你长时间运行cli而不执行sti时,情况应该完全一样。是的,中断可能会丢失;据我了解,每个IRQ线路只有一个缓冲状态位(挂起或非挂起)。 - Peter Cordes
1
我在答案中更新了有关待处理中断的更多信息。@Peter - prl
@PeterCordes:这很有趣。我似乎找不到在英特尔文档中将中断向量的高4位用作优先级的任何地方。只有AMD简要说明它是实现相关的。另外,prl,我相信你的规则应该是只有当CR8不为0时才有效,对吗?否则,如果它为0,如果我没有弄错的话,中断0到31将是系统中断,并且其中一半将被永久阻塞(因为它们的优先级为0,而不大于CR8,CR8也是0)。我理解得对吗? - MikeF
3
卷3A,第10.8.3节 - prl
1
向量0到31不是中断,它们是异常。任务优先级不会影响异常的传递。(实际上,即使这些向量被保留,也可以将16-31号向量用作中断。) - prl

0
另一个相关的点是,Windows(我认为Linux也是)试图始终将CPU的IRQ级别保持尽可能低。中断服务例程在其提高的硬件中断级别下尽可能少地工作,然后cue延迟处理过程调用以在DPC IRQ级别下完成其余工作。DPC通常会立即得到服务,除非有其他的IRQ到达,因为它们比正常进程具有更高的优先级。
一旦CPU开始执行DPC,它将在将CPU IRQL返回零以允许正常线程恢复之前执行其每个CPU DPC队列中的所有DPC。
这种方法的优点是,任何优先级的传入硬件IRQ都可以打断DPC并几乎立即获得其自己的DPC,因此不会被错过。

1
是的,Linux也有所谓的“顶半部分”中断处理程序,它们只做尽可能少的工作,并将任务排队给“底半部分”任务,就像你所描述的那样。 - Peter Cordes

0
我也应该尝试解释(因为我认为)CPU的IRQ级别和IRQ优先级之间的区别。在x64之前,控制寄存器8未提供时,CPU没有IRQ级别的概念。Windows NT的设计者决定每个系统中的逻辑处理器都应具有一个虚拟的IRQ级别,该级别将存储在称为处理器控制块的数据结构中,每个CPU都有一个。他们决定应该有32个级别,我不知道原因。软件和硬件中断也被分配一个级别,因此,如果它们高于CPU分配的级别,则允许它们继续运行。Windows不使用PIC / APIC硬件分配的中断优先级,而是使用其中的中断屏蔽位。各个引脚被分配一个向量号,然后它们获得一个级别。当Windows在其PCB中提高CPU的LRQL时,它还会重新编程PIC / APIC的中断屏蔽。但不是立即。每次发生的中断都会导致Windows陷阱调度程序执行并将IRQ级别与CPU IRQL进行比较,如果IRQ级别更高,则中断继续进行,否则Windows重新编程掩码并返回到正在执行的线程。
那是因为重新编程PIC需要时间,如果没有更低级别的IRQ进入,那么Windows就可以节省一些工作。
在x64中有CR8,我仍在研究它的工作原理。

3
这看起来不像是一个独立的回答。它应该是对你之前回答的编辑。你可能应该合并你的账户(或者直接登录你的原始账户)并编辑那个已有的回答。(然后删除这个回答,这样就只剩下一个更完整的回答了。) - Peter Cordes
你之前的回答(来自五月份)看起来不错;我觉得很有趣,所以我给它点了赞。这个也没问题。不要期望对于相对偏僻的老问题(超过一两天的时间)在比C++更不受欢迎的标签中会有很多关注。我想只有很少的人(像我一样)会监控x86 / asm标签下的任何活动(不仅仅是新问题)。 - Peter Cordes
自己搬运,让它看起来漂亮。 - Graham Dearsley
嗨Pete,我回答了一个旧问题,那时这个网站还有一些有趣的问题。 - Graham Dearsley
抱歉,Pete。只是出气而已。对于形式超过实用性感到厌倦了。 - Graham Dearsley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接