禁用硬件和软件中断。

9

是否可能使用ASM/C/C++程序禁用所有中断以完全控制处理器?

如果是 -> 如何实现?

如果不是 -> "原子"操作系统调用如何工作(例如进入临界区)?

感谢您的帮助!


4
请说明您使用的处理器和操作系统(如果有)。在现代桌面/服务器操作系统中,用户空间代码通常以非特权模式运行,这会防止您执行此操作。 - nos
MS Windows(XP SP2/SP3,Vista,7)x86和x64版本, 现代英特尔处理器(例如Intel Core 2 Duo) - someone
关于原子操作:[对于'int num',num ++可以是原子的吗?](https://dev59.com/9VkS5IYBdhLWcg3w1JlK)描述了如何/为什么`lock cmpxchg [rdi],ecx` 是原子的。 在多核机器上,在当前核心上禁用中断无论如何都是无用的;即使在所有核心上禁用中断,如果另一个核心已经运行了同一程序的另一个线程,那么它也不起作用。 - Peter Cordes
3个回答

12

在x86汇编中,以下命令可用:

  • sti:设置中断使能位。
  • cli:清除中断使能位。

这些指令用于设置和清除IF标志。当IF标志被设置时,CPU将处理硬件中断;当它被清除时,CPU将忽略硬件中断。但这不会影响非屏蔽中断的处理,也不会影响软件中断或异常处理。然而,这些指令在未授权模式下无法使用(通常是高于ring 0,取决于IOPL)。


5
你理解错了。STI开启中断,CLI关闭中断。 - Alexey Frunze
1
它也不会禁用软件中断或异常。 - Stewart
1
谢谢大家的评论和编辑:STI使能中断,CLI禁用中断确实是正确的。我本来很确定是反过来的,但是我学习汇编语言时使用的是C64,所以我查了一下:6510处理器使用CLI来禁用中断,使用STI来使能中断。我有点困惑;-) - Ludwig Weinzierl

3

在x86和大多数现代处理器上,您可以使用原子指令。这些指令保证在另一个线程/处理器访问该内存之前不会完成执行。

在Win32下,您可以使用Interlocked*函数在支持的平台上进行抽象处理。

在MIPS上,很多指令后面都可以添加.I来保证互锁。


2
在 x86 上,您可以在某些指令前加上“lock”前缀使它们成为原子操作。 - Gunther Piez
针对哪个平台?如果是 Windows 平台,那么请访问 http://msdn.microsoft.com/en-us/library/ms684122(VS.85).aspx。 - Goz

2

x86架构在FLAGS寄存器中有一个中断标志(IF)。当该标志被设置为0时,硬件中断将被禁用,否则将被启用。命令cli将此标志设置为0,而sti将其设置为1。将值加载到FLAGS寄存器中的指令(例如popf和iret)也可能修改此标志。

祝好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接