x86_64汇编:中断标志和TPR寄存器的作用

Aru*_*pur 3 x86 assembly x86-64 interrupt windows-kernel

我熟悉任务优先级寄存器cr8(Windows 上的 IRQL),当然我知道如何使用 和 来启用和禁用cli中断sti。不过,我对两者有几个疑问。

首先,清除中断标志是否会cli“覆盖”TPR 中存储的当前值?例如:TPR 是PASSIVE_LEVEL (0)。如果中断被禁用,TPR 中的值就不再重要了吗?第二:我是从维基百科上读到的:

将 TPR 加载为 0 会启用所有外部中断。用 15 (1111b) 加载 TPR 将禁用所有外部中断。

这是否意味着将 TPR 设置为0xF KzRaiseIrql(HIGH_LEVEL)相当于cli?如果我的 TPR 是0xF并且中断标志被清除,会发生什么情况?如果中断标志使能怎么办?

prl*_*prl 5

两者是完全独立的,并且其工作原理与您\xe2\x80\x99d 所期望的完全一样。

\n

如果 IF 为 0,则 TPR 是什么并不重要。如果 TPR 为 0xF,则 IF 是什么并不重要。\n无论哪种情况,所有中断都会被屏蔽。

\n

  • 顺便说一句,这两个寄存器是在不同的地方实现的。IF在核心实现,TPR在本地APIC实现。如果 TPR = 0xF,APIC 不会向内核发出中断。如果 TPR < 0xF,APIC 将向内核发出一个中断(如果有一个优先级大于 TPR 的待处理中断),但如果 IF 为 0,则内核不会确认该中断。 (3认同)