デバイス データへのアクセスの同期
通常、ドライバーの InterruptService ルーチンまたは InterruptMessageService ルーチン (ISR) は、ドライバー データとハードウェア リソースへのアクセスを他のドライバー ルーチンと共有する必要があります。 ISR は管理者特権の IRQL で割り込みコンテキストで実行され、システムには複数のプロセッサが存在する可能性があるため、各ルーチンが中断することなく、この共有情報への排他的アクセスを一時的に持つことが保証されるように、共有データとリソースへのアクセスを同期することが重要です。
システムは、割り込みクリティカル セクション内で ISR を実行することで、この同期を サポートします。 割り込みには、割り当てられたスピン ロック、割り込みスピン ロック、IRQL、割り込み同期 IRQL があります。 システムは、プロセッサの IRQL を割り込み同期 IRQL に上げ、コードを実行する前に割り込みスピン ロックを取得することで、共有情報へのクリティカル セクション排他アクセス内で実行されるこのコードを保証します。 ISR を実行する前に、システムは常に割り込みのクリティカル セクションに入ります。 割り込みスピン ロックと同期 IRQL を共有することで、異なる割り込みが同じクリティカル セクションを共有できます。
ドライバーは、SynchCritSection ルーチンを指定することで、割り込みのクリティカル セクションで実行されるコードを実装できます。 ドライバーが KeSynchronizeExecution を使用して SynchCritSection ルーチンを呼び出すと、Interrupt パラメーターで指定された割り込みのクリティカル セクションが自動的に入力されます。
プロセッサの IRQL を割り込みの同期 IRQL に上げると、より高い同期 IRQL による割り込みを除き、現在のプロセッサが中断されなくなります。 スピン ロックを取得すると、他のプロセッサがそのスピン ロックに関連付けられている重要なセクション コードを実行できなくなります。
ドライバーが IoConnectInterruptEx を呼び出すときに、割り込みスピン ロックと同期 IRQL が割り当てられます。 ほとんどの場合、ドライバーは、システムが両方の値を決定することを許可できます。
ドライバーが IoConnectInterruptEx の CONNECT_LINE_BASED バージョンを使用し、NULL スピン ロックを指定する場合、システムは割り込みラインのスピン ロックを割り当てます。 また、システムは同期 IRQL の値を決定します (ドライバーは、必要に応じて、より高い値を指定できます)。
ドライバーが IoConnectInterruptEx の CONNECT_MESSAGE_BASED バージョンを使用し、NULL スピン ロックを指定する場合、システムは割り込みメッセージごとにスピン ロックを割り当てます。 また、システムは各メッセージの同期 IRQL の値を決定します (ドライバーは、必要に応じて、すべてのメッセージに共通する高い値を指定できます)。
ドライバーは、IoConnectInterruptEx の CONNECT_FULLY_SPECIFIED バージョンを使用する場合、また同じクリティカル セクションを共有する必要がある複数の割り込みベクトルがある場合にのみ、独自のスピン ロックを割り当てる必要があります。 ドライバーは、IO_CONNECT_INTERRUPT_PARAMETERS の SpinLock メンバーと SynchronizeIrql メンバーを使用して、独自のスピン ロックと同期 IRQL を指定できます。 詳細については、IO_CONNECT_INTERRUPT_PARAMETERS を参照してください。
クリティカル セクションの記述と入力については、クリティカル セクションの使用を参照してください。