2

コードをアトミ​​ックに実行する必要があります。唯一の方法は割り込みを無効にすることだと思いますが、Windowsでそれを行うにはどうすればよいですか? それを可能にするWindows OSを探しているので、特定のウィンドウに焦点を当てていません。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 に答える