Wikipedia表示中断标志确定CPU是否处理可屏蔽硬件中断。如果该标志设置为1,则将处理可屏蔽硬件中断,如果清除 - 将被忽略。
我很难理解什么是可屏蔽或不可屏蔽的中断。
P.S。我刚刚开始深入研究汇编语言和处理器的内部工作原理,所以请使用5年前的简单英语。如果有可能当然=)。
答案 0 :(得分:4)
典型情况,例如在DOS编程中,您可以在修改中断处理程序表之前禁用中断,并在完成后重新启用中断。
如果在修改表时允许发生中断,您将不知道是否将使用旧的或新的处理程序地址(或每个的一半)。
您还可以在某种情况下禁用中断处理程序本身的中断,以防止在处理挂起的中断时再次调用它。
不可屏蔽的中断通常是在中断标志的当前状态下发生的 - 我不记得曾经不得不处理这些中断。
答案 1 :(得分:2)
如果你正在学习asm来加速内循环和东西,你不需要担心它。您可以而且应该将中断管理留给操作系统。 (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
Plugin = new AndroidJavaObject("com.sample.sampleActivity ",new object[]{activity,appId,licenceKey,sku});
当然是特权指令,无论如何只适用于内核。)
Linux设备驱动程序(第2版),Chapter 9是关于中断处理的,并提到使用cli / sti。
在SMP之前的日子里,禁用中断是锁定的一种简单的强力替代方法。对于多核CPU,即使在运行代码的核心上禁用中断,另一个核心也可能触及您的数据结构,因此它的用处非常少。很少再这样做了。
有时需要禁用中断。例如,当您执行暂时使堆栈指针未指向有效内存的操作时。 (nvm,cli / sti
隐式禁用中断,直到后面的指令。所以你可以改变堆栈段,然后更改堆栈指针而不用mov ss, reg
。这在64位代码中是无关紧要的,其中段寄存器基本上是未使用的。)
另一个可能的例子是修改CPU用来决定中断发生时要做什么的其他关键数据结构。 (全局描述符表和/或中断描述符表)。虽然IDK关于那些,如果它们与其他CPU共享,那么你需要保持它们始终有效。我想我不久前读过一个例子,你需要在对描述符表或其他东西的一些连接变化中禁用中断,但我不记得是什么。
我真的不是i386关于内核空间的专家,所以我不会在this explanation of a case中找到你需要在使用“任务门”时禁用中断的所有内容,无论那些是什么。
这个doc看起来像是一个低级教程系列的一部分:http://www.osdever.net/bkerndev/Docs/gdt.htm。如果你想深入了解在x86下发生的所有疯狂的事情,你可能会觉得很有趣。