我需要原子地执行一段代码。我想唯一的办法就是禁用中断,我怎样才能在windows下执行此操作?我正在搜索允许我这样做的Windows操作系统,因此我不关注特定的窗口。即便是Windows CE也不错。
斯特凡诺
答案 0 :(得分:1)
完全禁用中断的用户编写代码的概念几乎违背了Windows的一些基本设计假设。
对于初学者,您无法禁用用户模式应用程序的中断。 (这是一项特权指示。)
在内核模式下,您可以使用IRQL来阻止大多数premption(但不是全部)。这是在Windows下执行不可抢占的硬件操作的“标准”方法。我怀疑这是你真正想要的。如果您可以让代码在更高级别的IRQL范围内运行,那么您应该没问题。 See this link for info on IRQL. 请记住,运行得越高,破坏的东西就越多。期望性能计数器变得不准确,设备缓冲区溢出等等。
作为后门,您可以将原始程序集CLI / STI指令嵌入到内核驱动程序中,但这可能会破坏很多内容,除非您的代码在很短的时间内禁用中断。如果没有,期待蓝屏。另外,我相信AMD64编译器会对你进行内联汇编的打击。
我强烈建议您退出原子性要求。
其他一些选项:
另外,关于x86你应该知道一个肮脏的小秘密:你在x86平台上写的几乎没有任何东西保证是原子的,即使你在汇编中编写你的RTOS。即使您执行CLI / STI,也存在可能会中断代码的系统管理中断。