【问题标题】:What are examples of practical usage of x86 processor interrupt flag?x86处理器中断标志的实际使用示例有哪些?
【发布时间】:2015-11-12 02:08:18
【问题描述】:

Wikipedia 表示中断标志决定了 CPU 是否会处理可屏蔽的硬件中断。如果标志设置为 1,将处理可屏蔽的硬件中断,如果清除 - 忽略。

我很难理解什么是可屏蔽或不可屏蔽中断。

  1. IF 标志的实际用途是什么?
  2. 什么是可屏蔽/不可屏蔽中断,有什么区别?

附:我刚刚开始研究汇编语言和处理器的内部工作原理,请让 5 岁的孩子用简单的英语。如果有可能当然 =)。

【问题讨论】:

  • 阅读英特尔® 64 和 IA-32 架构软件开发人员手册第 3A 卷:系统编程指南,第 1 部分中的第 6 章中断和异常处理 >。 IF 的实际用途是用于操作系统软件,以禁用中断。 NMI 很少使用。

标签: assembly x86 processor


【解决方案1】:

如果您正在学习 asm 来加速内部循环等,则无需担心。您可以并且应该将中断管理留给操作系统。 (cli / sti 当然是特权指令,无论如何只适用于内核。)

Linux 设备驱动程序(第 2 版),Chapter 9 是关于中断处理的,并提到使用 cli/sti。

在 SMP 之前的日子里,禁用中断作为锁定的简单暴力替代方法。使用多核 CPU,即使在运行代码的内核上禁用了中断,另一个内核也可能触及您的数据结构,因此它的用处要小得多。现在很少这样做了。

有时需要禁用中断。例如,当您做一些暂时使堆栈指针未指向有效内存的事情时。 (nvm,mov ss, reg 隐式禁用中断,直到执行以下指令。因此,您可以更改堆栈段,然后更改堆栈指针而不使用 cli/sti。这与 64 位代码无关,其中段寄存器基本上未使用。)

另一个可能的例子是在修改其他关键数据结构时,CPU 使用这些数据结构来决定在中断发生时要做什么。 (全局描述符表和/或中断描述符表)。尽管 IDK 关于这些,但如果它们与其他 CPU 共享,那么您需要保持它们始终有效。我想我不久前读过一个例子,关于一个例子,你需要在对描述符表或其他东西的一些连接更改期间禁用中断,但我不记得是什么。

我并不是真正的内核空间方面的 i386 专家,所以我不会深入了解 this explanation of a case 中在使用“任务门”时需要禁用中断的所有内容,无论它们是什么。

此文档看起来像是低级教程系列的一部分:http://www.osdever.net/bkerndev/Docs/gdt.htm。如果您想深入了解 x86 底层发生的所有疯狂事情,您可能会觉得这很有趣。

【讨论】:

    【解决方案2】:

    一个典型的场景,例如在 DOS 编程中,您可以在修改中断处理程序表之前禁用中断,并在完成后重新启用中断。

    如果在修改表时允许发生中断,您将不知道是使用旧的还是新的处理程序地址(或每个处理程序地址的一半)。

    您还可能希望在中断处理程序本身中禁用中断,以防止在处理挂起的中断时再次调用它。

    不可屏蔽中断通常是无论中断标志的当前状态如何都会发生的中断 - 我不记得曾经处理过这些。

    【讨论】:

      猜你喜欢
      • 2014-12-30
      • 2023-04-10
      • 2010-09-24
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2011-11-19
      相关资源
      最近更新 更多