禁用窗口中的中断



我需要以原子方式执行一段代码。我想唯一的方法是禁用中断,我怎么能在windows下做到这一点?我正在搜索一个允许我这样做的windows操作系统,所以我不关注特定的窗口。即使是Windows CE也不错。

Stefano

用户编写的代码完全禁用中断的概念几乎违背了Windows的一些基本设计假设。

对于初学者来说,您不能禁用来自用户模式应用程序的中断。(这是一条特权指令。)

在内核模式下,您可以使用IRQL来阻止大多数预选项(但不是全部)。这是在Windows下执行不可抢占硬件操作的"标准"方式。我怀疑这就是你真正想要的。如果你能让你的代码在更高级别的IRQL的范围内运行,你应该是可以的。有关IRQL的信息,请参阅此链接。请记住,你跑得越高,就会有越多的事情发生。预计性能计数器会变得不准确,设备缓冲区会溢出,等等。

作为后门,您可以将原始程序集CLI/STI指令嵌入内核驱动程序中,但这可能会破坏很多事情,除非您的代码在很短的一段时间内禁用中断。如果没有,则显示蓝色屏幕。此外,我相信AMD64编译器会反对您尝试进行内联汇编。

我强烈建议你放弃你的原子性要求。

其他一些选项:

  • 引导到您自己的环境来运行测试(类似于Memtest86)
  • 考虑使用父RTOS内核。有现成的"Windows RTOS"解决方案将Windows作为父RTOS的子进程运行。现有的Windows应用程序和驱动程序运行良好,时间关键型/原子任务是为RTOS编写的。该领域最受欢迎的播放器是IntervalZero的RTX

此外,关于x86还有一个肮脏的小秘密,你应该知道:即使你在汇编中编写RTOS,你在x86平台上编写的几乎任何东西都不能保证是原子的。有一些系统管理中断可以中断您的代码,即使您执行CLI/STI。

最新更新