【问题标题】:x86_64 Assembly: effects of the interrupt flag and TPR registerx86_64 汇编:中断标志和 TPR 寄存器的影响
【发布时间】:2020-07-19 00:10:11
【问题描述】:

我对任务优先级寄存器cr8(Windows 上的IRQL)都很熟悉,当然我也知道如何使用clisti 启用和禁用中断。不过,我对这两者有一些疑问。

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

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

这是否意味着将 TPR 设置为 0xF KzRaiseIrql(HIGH_LEVEL) 等同于 cli?如果我的 TPR 是 0xF 并且中断标志被清除会发生什么?如果启用中断标志怎么办?

【问题讨论】:

    标签: assembly x86 x86-64 interrupt windows-kernel


    【解决方案1】:

    两者是完全独立的,并且完全按照您的预期工作。

    如果 IF 为 0,则 TPR 是什么无关紧要。如果 TPR 为 0xF,则 IF 是什么无关紧要。 在任何一种情况下,都会屏蔽所有中断。

    【讨论】:

    • 顺便说一下,这两个寄存器是在不同的地方实现的。 IF在核心实现,TPR在本地APIC实现。如果 TPR = 0xF,APIC 不会向内核断言中断。如果 TPR
    • 另外,EXTINT(如果启用)被 IF=0 屏蔽,但不被 TPR=0xF 屏蔽
    • EXTINT 到底是什么?来自 APIC 的东西? @PaoloBonzini
    • 这是 APIC 的 LINT 寄存器中交付模式字段的设置。如果 LINT0 的交付模式设置为 EXTINT。来自传统 8259 中断控制器的中断以向后兼容的方式传递到 CPU 0。
    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 2012-08-26
    • 2016-11-11
    • 2021-03-25
    • 1970-01-01
    • 2012-01-11
    • 2014-04-25
    • 2011-01-22
    相关资源
    最近更新 更多