CR8寄存器如何用于对x86-64 CPU中的中断进行优先级排序?

时间:2018-07-24 04:39:32

标签: x86-64 intel cpu-architecture amd

我正在阅读有关控制寄存器的英特尔文档,但仍在努力了解如何使用CR8寄存器。引用文档(2-18 Vol. 3A):

  

任务优先级(CR8的位3:0)—设置阈值   对应于要阻止的最高优先级中断。一种   值为0表示所有中断都被允许。该字段可用   在64位模式下。值15表示将禁止所有中断。

如果您不介意,我有3个快速问题:

  1. 因此,CR8的位3至0构成了这16个优先级值。但是优先级是什么?我认为正在运行的“线程”对吗?

  2. 但是与接收中断以查看是否必须阻止该中断相比,CR8中的优先级值是多少?

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

3 个答案:

答案 0 :(得分:2)

CR8指示CPU的当前优先级。当中断待处理时,将中断向量号的位7:4与CR8进行比较。如果向量较大,则将对其进行维修,否则将其暂挂,直到将CR8设置为较低的值为止。

假设使用API​​C,它具有一个IRR(中断请求寄存器),每个中断向量号各一位。将该位置1时,中断将挂起。它可以永远保持这种状态。

当中断到达时,将其与IRR进行或运算。如果该中断已经挂起(即该向量的IRR位已被设置),则新中断将与前一个中断合并。 (您可以说它已被删除,但我不是这样想的;相反,我说这两个被合并为一个。)由于这种合并,中断服务例程必须被设计为处理所有准备好的工作。 ,而不是期望每个工作单元都有明显的中断。

答案 1 :(得分:1)

另一个相关的观点是Windows(我假设是Linux)试图始终保持CPU的IRQ级别尽可能低。中断服务例程在较高的硬件中断级别执行尽可能少的工作,然后提示延迟的过程调用以在DPC IRQ级别进行其余工作。除非另外一个IRQ到达,否则DPC通常将立即得到服务,因为它们的优先级高于正常进程。

一旦CPU开始执行DPC,它将在其每个CPU DPC提示中执行所有DPC,然后再将CPU IRQL归零以允许正常线程恢复。

这样做的好处是,任何优先级的传入硬件IRQ都可以中断DPC并几乎立即获得其自己的DPC,因此不会丢失它。

答案 2 :(得分: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,我仍在研究它是如何工作的。