デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。
【 デバドラ講座32 : DpcForIsrルーチンの処理、ISRとDpcForIsrの関係 】
割り込み処理の主要な処理はDpcForIsrルーチンが実行します。割り込みが発生した際、ISRは割り込みが発生した事を認識し、必要な情報を集めてキューに入れます。割り込みで要求された処理を実際に実行するのはDpcForIsrルーチンです。DpcForIsrルーチンはDISPATCH_LEVELで実行されるので変数の定義は必ず非ページプールメモリで行わなければなりません。また、使用できる関数とメモリに制限があります。ISRルーチンではIRPの処理を行いません。そこで、DpcForIsrルーチンはIRPに関する処理を行います。
DpcForIsrは割り込み発生時に必要とされるデバイスに対する処理を行います。DpcForIsrに必要な情報がキューに入れられる際、I/Oマネージャは現在のIRPの受け渡しを行います。DpcForIsrルーチンにおいて、処理が終了した際にIoCompleteRequest関数により現在のIRPを完了させます。また、IRPの完了状態もこの関数で設定します。そして、IoStartNextPacket関数により次のIRPを起動させます。この関数はDISPATCH_LEVELでのみ実行可能で、しかもStartIOルーチンが存在しなければ関数を使用することはできません。IoStartNextPacket関数のプロトコルを次に示します。
VOID
IoStartNextPacket(
IN PDEVICE_OBJECT DeviceObject, //デバイスオブジェクトのポインタ
IN BOOLEAN Cancelable); //IRPをキャンセルできるかどうかの設定
ISRとDpcForIsrの関係
ISRはDIRQLで実行され、DpcForIsrはDISPATCH_LEVELで実行されます。ISRを実行している際に同じプロセッサ内でレベルの低い割り込みが発生すると、その割り込みはブロックされます。従って、ISRで行う処理はできるだけ短時間で行い、他の割り込み処理を可能にする必要があります。ISRはDpcForIsrルーチンで必要な情報をキューに入れます。DpcForIsrルーチンでは、割り込みで要求された実際のI/O処理を行います。
SRとDpcForIsrの関係は病院の中で例えると受付係と担当医に似ています。患者が来ると、受付は必要な情報を患者からもらい担当医にその情報を渡し、患者には待合室で待ってもらいます。そして担当医は待合室にいる患者の診察を行います。ISRは割り込みが入ると割り込みから情報を受け取り、DpcForIsrに必要な情報を渡しキューに配置します。そしてキューに入ったDpcForIsrルーチンの処理が実行されます。
ISRとDpcForIsrは共に関係して動作するように設計しなければなりません。どの部分をISRが処理し、どの部分をDpcForIsrが処理するかを設計する必要があります。通常、緊急を要する部分をISRが処理し、時間のかかる複雑な処理をDpcForIsrが処理します。実際、ISRとDpcForIsrのバランスの問題は、使用できる関数によって制約されています。ISRがDpcForIsrを呼び出し実際どの位割り込み処理が遅延されるかはその時によりますが、その遅延は通常ミリ秒単位です。
参考資料
- 「NTドライバプログラミング」
- Peter G. Viscarola、W. Anthony Mason著 久保雅俊、三浦秀朗訳 サイエンスパーク株式会社 監修
- 「WDMデバイスドライバプログラミング完全ガイド」上
- Edword N. Dekker, Jpseph M. Newcomer著 株式会社クイック訳