0

下位レベルのドライバーに同期要求を送信しようとしているときに、ドライバーがハングするという問題が発生しています。DISPATCH_LEVELこのルーチンが呼び出された時点で、ルーチンは現在実行中です。

Microsoft が提供するドキュメント「ロック、デッドロック、および同期」を確認したところ、次のように書かれています。

低い IRQL で実行されているコードがロックを正常に取得したものの、高い IRQL でコードを実行するためにスレッドが中断された場合を考えてみましょう。上位の IRQL コードが同じロックを取得しようとすると、スレッドが永久にハングする可能性があります。IRQL の低いコードは、IRQL の高いコードが終了するまで実行できませんが、IRQL の高いコードは、IRQL の低いコードがロックを解放するまで終了できません。関与するスレッドは 1 つだけです。この問題を回避するために、通常、ロックを取得するコードはその IRQL を、ロックを取得するドライバー コードが実行できる最高の IRQL に引き上げます。

私たちの問題は、ハングアップとブルー スクリーンが発生することです。DISPATCH_LEVEL で待機する呼び出しを行うべきではないこと、および設計に作業が必要であることは理解していますが、IRQL メカニズムを正しく理解していることを確認したいだけです。

IRQL はプロセッサごとであり、さまざまなドライバーがさまざまなプロセッサで実行されるというのは正しいですか? DISPATCH_LEVELIRQLが高いため、他のドライバーのスレッドをプリエンプトすることにより、下位レベルのドライバーを対象とした同期要求を行うことが実際に問題を引き起こしているかどうかを確認したいと思います。

4

1 に答える 1

2

通常の呼び出しを行っている場合、他のコードは同じ CPU で同じレベルで実行されます。非同期送信を行っている場合は、別の CPU でスケジュールされている可能性があります。上位レベルのドライバーから下位レベルのドライバーへの同期送信を行っている場合は、おそらくハングするはずです。非同期にして完了ルーチンを書くだけです。

于 2013-07-03T17:54:07.893 に答える