x86 处理器中断标志的实际使用示例有哪些?
What are examples of practical usage of x86 processor interrupt flag?
Wikipedia 表示 中断标志决定了 CPU 是否会处理可屏蔽的硬件中断。如果标志设置为 1,将处理可屏蔽的硬件中断,如果清除 - 忽略。
我很难理解什么是可屏蔽或 non-maskable 中断。
- IF 标志的实际用途是什么?
- 什么是maskable/non-maskable中断,有什么区别?
P.S。我刚刚开始研究汇编语言和处理器的内部工作原理,请用简单的英语来了解 5 岁的孩子。如果可以的话当然=).
一个典型的场景,例如在 DOS 编程中,您可以在修改中断处理程序 table 之前禁用中断,并在完成后重新启用中断。
如果在修改 table 时允许发生中断,您将不知道将要使用旧的还是新的处理程序地址(或各一半)。
在某些情况下,您可能希望在中断处理程序本身中禁用中断,以防止在处理挂起的中断时再次调用它。
不可屏蔽中断通常是无论中断标志的当前状态如何都会发生的中断 - 我不记得曾经处理过这些中断。
如果您正在学习 asm 来加速内部循环和其他东西,则无需担心。您可以而且应该将中断管理留给 OS。 (cli / sti
当然是只对内核有效的特权指令。)
Linux 设备驱动程序(第 2 版),Chapter 9 是关于中断处理的,并提到使用 cli/sti。
在 SMP 之前的日子里,禁用中断作为锁定的一种简单的蛮力替代方法。对于多核 CPUs,即使在您的代码 运行 打开的核心上禁用了中断,另一个核心也可能会触及您的数据结构,因此它的用处要小得多。现在很少有人做了。
有时需要禁用中断。例如,当您执行某些操作时,堆栈指针暂时未指向有效内存。 (nvm,mov ss, reg
隐式禁用中断,直到下一条指令之后。因此您可以更改堆栈段,然后更改堆栈指针而无需 cli/sti
。这在 64 位代码中无关紧要,其中段寄存器本质上是未使用。)
另一个可能的例子是在修改其他关键数据结构时,CPU 使用这些数据结构来决定在发生中断时要做什么。 (全局描述符 table and/or 中断描述符 table)。尽管 IDK 关于这些,但如果它们与其他 CPU 共享,那么您需要使它们始终有效。我想我不久前读过一个例子,关于你需要在描述符 tables 或其他东西的一对连接更改期间禁用中断的情况,但我不记得是什么了。
我并不是内核方面的 i386 专家-space,所以我不会理解 this explanation of a case 中使用 "task gates" 时需要禁用中断的所有内容,不管那些是什么。
该文档看起来像是低级教程系列的一部分:http://www.osdever.net/bkerndev/Docs/gdt.htm。如果您想深入了解 x86 引擎盖下发生的所有疯狂事情,您可能会发现它很有趣。
Wikipedia 表示 中断标志决定了 CPU 是否会处理可屏蔽的硬件中断。如果标志设置为 1,将处理可屏蔽的硬件中断,如果清除 - 忽略。
我很难理解什么是可屏蔽或 non-maskable 中断。
- IF 标志的实际用途是什么?
- 什么是maskable/non-maskable中断,有什么区别?
P.S。我刚刚开始研究汇编语言和处理器的内部工作原理,请用简单的英语来了解 5 岁的孩子。如果可以的话当然=).
一个典型的场景,例如在 DOS 编程中,您可以在修改中断处理程序 table 之前禁用中断,并在完成后重新启用中断。
如果在修改 table 时允许发生中断,您将不知道将要使用旧的还是新的处理程序地址(或各一半)。
在某些情况下,您可能希望在中断处理程序本身中禁用中断,以防止在处理挂起的中断时再次调用它。
不可屏蔽中断通常是无论中断标志的当前状态如何都会发生的中断 - 我不记得曾经处理过这些中断。
如果您正在学习 asm 来加速内部循环和其他东西,则无需担心。您可以而且应该将中断管理留给 OS。 (cli / sti
当然是只对内核有效的特权指令。)
Linux 设备驱动程序(第 2 版),Chapter 9 是关于中断处理的,并提到使用 cli/sti。
在 SMP 之前的日子里,禁用中断作为锁定的一种简单的蛮力替代方法。对于多核 CPUs,即使在您的代码 运行 打开的核心上禁用了中断,另一个核心也可能会触及您的数据结构,因此它的用处要小得多。现在很少有人做了。
有时需要禁用中断。例如,当您执行某些操作时,堆栈指针暂时未指向有效内存。 (nvm,mov ss, reg
隐式禁用中断,直到下一条指令之后。因此您可以更改堆栈段,然后更改堆栈指针而无需 cli/sti
。这在 64 位代码中无关紧要,其中段寄存器本质上是未使用。)
另一个可能的例子是在修改其他关键数据结构时,CPU 使用这些数据结构来决定在发生中断时要做什么。 (全局描述符 table and/or 中断描述符 table)。尽管 IDK 关于这些,但如果它们与其他 CPU 共享,那么您需要使它们始终有效。我想我不久前读过一个例子,关于你需要在描述符 tables 或其他东西的一对连接更改期间禁用中断的情况,但我不记得是什么了。
我并不是内核方面的 i386 专家-space,所以我不会理解 this explanation of a case 中使用 "task gates" 时需要禁用中断的所有内容,不管那些是什么。
该文档看起来像是低级教程系列的一部分:http://www.osdever.net/bkerndev/Docs/gdt.htm。如果您想深入了解 x86 引擎盖下发生的所有疯狂事情,您可能会发现它很有趣。