禁用Windows中的中断

时间:2012-09-27 15:51:50

标签: windows driver interrupt

我需要原子地执行一段代码。我想唯一的办法就是禁用中断,我怎样才能在windows下执行此操作?我正在搜索允许我这样做的Windows操作系统,因此我不关注特定的窗口。即便是Windows CE也不错。

斯特凡诺

1 个答案:

答案 0 :(得分:1)

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

对于初学者,您无法禁用用户模式应用程序的中断。 (这是一项特权指示。)

在内核模式下,您可以使用IRQL来阻止大多数premption(但不是全部)。这是在Windows下执行不可抢占的硬件操作的“标准”方法。我怀疑这是你真正想要的。如果您可以让代码在更高级别的IRQL范围内运行,那么您应该没问题。 See this link for info on IRQL. 请记住,运行得越高,破坏的东西就越多。期望性能计数器变得不准确,设备缓冲区溢出等等。

作为后门,您可以将原始程序集CLI / STI指令嵌入到内核驱动程序中,但这可能会破坏很多内容,除非您的代码在很短的时间内禁用中断。如果没有,期待蓝屏。另外,我相信AMD64编译器会对你进行内联汇编的打击。

我强烈建议您退出原子性要求。

其他一些选项:

  • 启动到您自己的环境以运行测试(类似于Memtest86)。
  • 考虑使用父RTOS内核。现有的“Windows RTOS”解决方案将Windows作为父RTOS的子进程运行。现有的Windows应用程序和驱动程序运行良好,并为RTOS编写时间关键/原子任务。该空间中最受欢迎的玩家是RTX from IntervalZero

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