次の方法で共有


DMA 使用時の考慮点

このセクションでは、ミニポート ドライバーで DMA 操作を使用する場合に考慮すべき重要なポイントをいくつか示します。

VideoPortStartDma に関するその他の注意事項

ディスプレイ ドライバーは通常、ミニポート ドライバーに転送要求を送信し、実際に DMA 転送が実行されます。 ディスプレイ ドライバーは、DMA エンジンがアイドル状態であるからといって、転送要求内のすべてのデータが転送されたとは想定できません。 これは、大規模な転送要求に対して、ミニポート ドライバーが VideoPortStartDmaVideoPortCompleteDma を複数回呼び出す必要があるためです。 ハードウェアの DMA エンジンは、転送する追加のデータがある場合でも、このような 2 つの DMA 操作の間はアイドル状態になります。 転送要求が完全に完了したことをディスプレイ ドライバーに通知するのは、ミニポート ドライバーの役割です。

VideoPortStartDmaContext パラメーターは、ハードウェア拡張機能内のメモリなどの非ページ メモリを指す必要があります。 このパラメーターは、IRQL DISPATCH_LEVEL で実行されるミニポート ドライバーの HwVidExecuteDma コールバック ルーチンに渡されます。

DMA と割り込み

多くのデバイスでは、ハードウェア DMA 操作が完了すると割り込みが生成されます。 ビデオ ミニポート ドライバーの割り込みサービス ルーチン (ISR) は、さらなる DMA 関連タスクのために DPC ルーチンをキューに配置する必要があります。 ビデオ ポート ドライバーの DMA 関数は IRQL DISPATCH_LEVEL 以下でのみ呼び出すことができるため、ISR で呼び出さないでください。

VideoPortStartDma 関数がまだ戻っていない場合でも、前述の DPC ルーチンで転送されているサイズを確認するのは安全です。これは、VideoPortStartDmapLength 引数が指す変数が、HwVidExecuteDma が呼び出された時点で既に更新されているためです。

論理アドレスと物理アドレス

ビデオ ポート ドライバーの DMA 実装では、DMA ハードウェアによって使用されるアドレスである論理アドレスの概念が使用されます。 論理アドレスは、物理アドレスとは異なる場合があります。 ビデオ ポート ドライバーが提供する DMA 関数は、プラットフォーム固有のメモリ制限を考慮します。 このため、MmGetPhysicalAddress などのカーネル モード関数ではなく、ビデオ ポート ドライバー DMA 関数を使用することが重要です。 論理アドレスの詳細については、「アダプター オブジェクトと DMA」を参照してください。

同時 DMA

同時 DMA 転送をサポートするデバイスの場合は、同時読み取りと書き込みをサポートする DMA コントローラー、または 2 つの個別の DMA コントローラーで、ミニポート ドライバーは、同時実行パスごとに個別の DMA アダプター オブジェクトを取得する必要があります。 たとえば、デバイスに並列で動作する 2 つの DMA コントローラーがある場合、ミニポート ドライバーは VideoPortGetDmaAdapter を 2 回呼び出して、2 つの VP_DMA_ADAPTER 構造体へのポインターを取得する必要があります。 その後、ミニポート ドライバーは、特定の DMA コント ローラーの DMA 転送要求を行うたびに、その要求で適切なポインターを使用する必要があります。