次の方法で共有


SynchCritSection ルーチンの概要

クリティカル セクションは、ハードウェア リソースまたはドライバー データへの排他的アクセスを必要とするコードの部分です。 つまり、そのコードは、同じリソースまたはデータを参照できる他のコードによって中断されてはなりません。また、リソースまたはデータが同時に複数のプロセッサから参照されてはなりません。

クリティカル セクションは、ISR および SynchCritSection ルーチンに限定する必要があります。 システムは、現在のプロセッサの IRQL をデバイスの DIRQL 値に上げ、スピン ロックを取得した後にのみ、これらのルーチンを呼び出します。 SynchCritSection ルーチンが戻ると、システムはスピン ロックを解放し、プロセッサの IRQL を下げます。

プロセッサの IRQL をデバイスの DIRQL 値に上げると、優先順位の高いデバイスを除き、現在のプロセッサが割り込まれるのを防ぎます。 スピン ロックを取得すると、他のプロセッサがそのスピン ロックに関連付けられているクリティカル セクション コードを実行できなくなります。 (このスピン ロックは割り込みスピン ロックと呼ばれることもあります)。

デバイス ドライバーの StartIo および DpcForIsr または CustomDpc ルーチンは、多くの場合、ドライバーの ISR と同じハードウェア リソース (デバイス レジスタやその他のバス相対メモリなど) やドライバーが保持するデータにアクセスする必要があります。 ドライバーのデバイスや設計によっては、ディスパッチ、AdapterControlControllerControl、またはタイマー ルーチンも、ハードウェア リソースまたはドライバーが保持するデータにアクセスする場合があります。

ISR 以外のクリティカル セクションを呼び出すには、ドライバーは KeSynchronizeExecution ルーチンを使用する必要があります。 このルーチンは、入力として SynchCritSection ルーチンのアドレス、ドライバ定義のコンテキスト情報、割り込みオブジェクト ポインターを受 け取ります。 システムは、割り込みオブジェクト ポインターを使用して、SynchCritSection ルーチンで使用する DIRQL とスピン ロックを決定します。 (これらの値は、以前、IoConnectInterrupt 関数の SpinLock パラメータと SynchronizeIrql パラメータを使用して、システムによって指定されています。)