2

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

斯特凡诺

4

1 回答 1

1

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

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

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

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

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

其他一些选项:

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

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

于 2012-09-28T16:18:14.360 回答