【问题标题】:Are there any CPU-state bits indicating being in an exception/interrupt handler in x86 and x86-64?是否有任何 CPU 状态位指示处于 x86 和 x86-64 中的异常/中断处理程序中?
【发布时间】:2021-07-15 03:11:29
【问题描述】:

x86x86-64 中是否有任何CPU-state 位指示处于异常/中断处理程序中?换句话说,我们能否仅根据CPU寄存器的状态来判断当前执行的是主线程还是异常处理程序?

【问题讨论】:

  • 不,没有。存在表示处于 NMI 处理程序中的隐藏状态,但软件无法访问。
  • 如果您想要为您正在设计的系统提供这样的指示,您可以为 IDT 中的所有条目使用不同的代码段描述符。
  • @prl:对于外部中断(不是例外),outb(0x20, 0x20) 是否仍然适用于保持 PIC 快乐(wiki.osdev.org/IDT_problems#I_can_only_receive_one_IRQ),还是仅适用于旧的传统做事方式?还是仅针对某些类型的中断?我在回答中对此感到疑惑,如果您可以将其简化为准确的内容,请随时进行编辑或评论。

标签: exception x86 x86-64 cpu-registers interrupt-handling


【解决方案1】:

不,CPU 本身(例如控制寄存器)中没有表示“我们处于异常或中断处理程序中”的位。

但是有一个隐藏状态表明您处于 NMI(不可屏蔽中断)处理程序中。由于您无法通过禁用中断来阻止它们,并且不可阻止的 NMI 任意嵌套会很不方便,因此在您运行 iret 之前不会交付另一个 NMI。即使在 NMI 处理程序期间发生异常(如 #DE div by 0),并且该异常处理程序本身返回 iret,即使您尚未处理完 NMI。请参阅 LWN 上的 The x86 NMI iret problem

对于正常中断,如果您不希望在处理此中断时传递另一个中断,则可以禁用中断 (cli)。

但是,当您处理完外部中断时,可能需要告知中断控制器(逻辑上位于 CPU 内核之外,但实际上是现代 CPU 的一部分)。 (不是软件中断或异常)。 https://wiki.osdev.org/IDT_problems#I_can_only_receive_one_IRQ 显示了保持旧版 PIC 满意所需的 outb 指令。 (我不知道这是否适用于更现代的中断方式,例如 MSI-X 消息信号中断。 OSdev wiki 页面的那部分可能特定于让 BIOS 模拟传统 IBM-PC 东西的玩具操作系统。)但无论哪种方式,这仅适用于 外部 中断,如 PS/2 键盘控制器、硬盘驱动器DMA 完成,或其他任何内容(不是例外),因此与您的Are Linux system calls executed inside an exception handler? 问题无关。


缺少异常状态意味着在从中断处理程序调用schedule() 之前,您无需运行任何特殊指令来“确认”异常。您所要做的就是确保在应该或不应该启用中断时启用或不启用中断。 (sti / clipushf / popf 保存/恢复旧的中断状态。)当然,您的软件数据结构保持一致并适合您正在做的事情。但是,您无需专门做任何事情来让 CPU 满意。

这与用户空间不同,信号处理程序应该告诉操作系统它已经完成,而不是只是跳到某个地方并无限期地运行。 (在 Linux 中,信号处理程序可以修改主线程程序计数器,以便 sigreturn(2) 在交付时所在位置以外的地方恢复执行。)如果 POSIX 或 Linux 信号是您的(心理)模型想知道中断/异常,不,不是那样的。


有一种中断优先级机制(x86-64 中的 CR8,或 LAPIC TPR(任务优先级寄存器)),但它不会在 CPU 发出中断时自动设置。你可以设置一次(例如,如果你有很多高优先级的中断要在这个核心上处理),它会在中断之间持续存在。 (How is CR8 register used to prioritize interrupts in an x86-64 CPU?)。

它只是一个过滤器,用于在启用中断时(sti,RFLAGS 中的 IF=1 位)可以将哪些中断号传送到此内核。显然 Windows 使用了它,or did back in 2007,但 Linux 没有(或没有)。

您不必告诉 CPU / LAPIC 您已完成此中断,因此它可以提供另一个此优先级或更低优先级的中断。

【讨论】:

  • 谢谢,非常全面的回答。实际上,我并没有想到 POSIX/Linux 信号,而是一个典型的微控制器中断处理程序,在某种意义上它与信号 nadler 非常相似。这个模型不适用于系统调用这一事实是我真正想要确认的。
猜你喜欢
  • 2021-07-15
  • 2012-03-05
  • 1970-01-01
  • 2017-05-30
  • 2015-03-03
  • 2010-11-11
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
相关资源
最近更新 更多