SCIENCE PARK

デバドラ講座

【 デバドラ講座17 : ドライバの処理過程 】

ドライバの処理は簡単に表すと図1のようになり、矢印は制御の流れを示します。

図1:ドライバの処理の流れ
図1:ドライバの処理の流れ
  1. ドライバはロードされた後、I/OマネージャによりDriverEntryが呼び出されます。
  2. DriverEntryでは、ハードウェアを表すデバイスオブジェクトが生成されます。続いてデバイスを初期化し、アプリケーションからデバイスを名前で使用できるようにします。また、後に使うディスパッチルーチンが登録されます。
  3. DriverEntryは直接ハードウェアにアクセスするのではなく、HALを介して実行されます。ここまでの処理で、ドライバとデバイスは通信可能な状態になります。
  4. ユーザーモードのアプリケーションからオープン、クローズ、読み、書き等の操作要求があると、I/Oマネージャは適当なディスパッチルーチンを呼び出します。操作によってはデバイスにアクセスしないものもあります。例えば、デバイスのクローズの処理を行う際、直接デバイスに対して操作を行わないことが多くあります。デバイスに直接アクセスしない操作はディスパッチルーチン内で処理されます。
  5. ディスパッチルーチンはHALを介してデバイスの操作を行います。キューイングをサポートするドライバの場合、ディスパッチルーチンは直接デバイスにアクセスしません。要求はキューに貯め、StartI/Oルーチンで処理が実行されます。
  6. デバイスから割り込みが起きた場合、HALはデバイスからこの信号をキャッチし、割り込みサービスルーチン(ISR)を起動します。
  7. ISRルーチンは割り込み要求の必要最小限の処理を実行します。最も単純な例では、10個前後のコマンドを実行し、割り込み要求をDPCキューに入れ、復帰します。ISRルーチンはDIRQ_LEVELで実行されます。
  8. デバイスから割り込み要求が起きた場合、ISRが呼び出されます。しかし、データのコピー、エラーの復旧など、比較的時間のかかる処理の場合、ISRルーチンはDPCルーチンを呼び出します。
  9. DPCルーチンはキューに貯めてある割り込み要求を取り出し、時間のかかる割り込み処理を実行します。DPCルーチンはDISPATCH_LEVELで実行されます。このように割り込み処理を優先度の違うISR、DPCと分けることで、常にデバイスの割り込み処理が実行できます。
  10. ユーザーモードからアンロード操作要求があると、I/Oマネージャはアンロードルーチンを呼び出します。アンロード操作はマシンのシャットダウン、手動によるデバイスのストップによって要求が発生します。
  11. アンロードルーチンはドライバとデバイスのつながりを解除し、デバイスが停止できる状態に設定します。アンロードの処理ではデバイスにアクセスする場合としない場合があります。デバイスによっては、アンロードの処理においてデバイスをシャットダウンしなければならない場合もあります。

参考資料

「WDMデバイスドライバプログラミング完全ガイド」上
Edword N. Dekker, Jpseph M. Newcomer著 株式会社クイック訳
page up