バス マスター DMA デバイス用 KMDF ドライバーでの I/O 要求の処理
[KMDF のみに適用]
このセクションのこのトピックでは、バス マスター DMA デバイスの KMDF ドライバーが I/O リクエストを処理する方法について説明します。 システム モード DMA を実装する KMDF ドライバーを作成する場合は、Supporting System-Mode DMAをご参照ください。
バス マスター DMA デバイスの KMDF ドライバーで I/O リクエストを処理するには、ドライバーのいくつかのイベント コールバック関数のコードが必要で、次の図に示すとおりです:
上記のように、DMA 関連の処理は次の 4 つのフェーズで行われます:
ドライバーの EvtDriverDeviceAdd や EvtDevicePrepareHardware コールバック関数は、ドライバーがフレームワークの DMA 機能を使用できるように、デバイスの DMA トランザクションを有効にする必要があります。 デバイスとドライバーが共有メモリ バッファーへのアクセスを必要とする場合、同じコールバック関数は共通のバッファーを作成する必要もあります。
ドライバーが、デバイスに DMA 操作の実行を要求する I/O リクエストを受信したら、ドライバーのリクエストハンドラーの1つは 新しい DMA トランザクションを作成して初期化する必要があります。 (ドライバーが DMA トランザクション オブジェクトを再利用する場合、ドライバーの EvtDriverDeviceAdd コールバック関数はトランザクション オブジェクトを作成できることに注意してください。)次に、フレームワークが必要に応じてトランザクションをより小さな DMA 転送に分割し始め、ドライバーのEvtProgramDmaコールバック関数を呼び出すことができるように、リクエストハンドラーはDMA トランザクションを開始する必要があります 。
ドライバーの EvtProgramDmaコールバック関数は、単一の DMA 転送用にDMA ハードウェアをプログラム し、デバイスの割り込みを有効にします。
デバイスが割り込まれると、フレームワークは、揮発性のデバイス情報を保存する、ドライバーの EvtInterruptDpc コールバック関数の実行をスケジュールするドライバーの EvtInterruptIsr コールバック関数を呼び出します。
ドライバーの EvtInterruptDpcコールバック関数は、ハードウェアが処理を完了した後、各 DMA 転送を完了します。 DMA トランザクションの最終的な転送が完了すると、EvtInterruptDpcコールバック関数は、 DMA トランザクションを完了します。
ドライバーは、メモリ リソースが不足している場合に動作できるように、DMA トランザクション オブジェクトを再利用 する場合があります。
ドライバーは、DMA固有の電源管理操作を処理するコールバック関数のセットを提供できます。
一部のドライバー は、デバイスとドライバーの両方がアクセスできる共通バッファーを使用します。