次の方法で共有


DMA 検証

DMA 検証は、ダイレクト メモリ アクセス (DMA) の使用を監視します。 Windows の開発に合わせ、DMA ルーチンが変更されたため、多くのドライバーが DMA 呼び出しを誤って使用します。 さらに、一部のドライバー ライターは、HAL DMA サブシステムを完全にバイパスしようとします。 この方法では、ドライバーに潜在的なバグが発生する可能性があります。

ドライバー検証ツールの DMA 検証オプションは、一般的な DMA エラーをキャッチしようとします。 !dma カーネル デバッガー拡張機能と共に、ドライバーが DMA を適切な方法で使用していることを確認するために使用できます。

このドライバー検証ツール オプションは 、HAL 検証とも呼ばれます。 ドライバー検証ツールによって生成される一部のエラー メッセージでは、この用語を使用できます。

さまざまな種類の DMA

DMA は、ハードウェア デバイスがプロセッサを使用せずにメモリ間でデータを転送できるメカニズムです。 転送を設定するにはプロセッサが必要であり、転送が完了するとデバイスはプロセッサに通知します。 このシステムの利点は、DMA 転送の実行中にプロセッサが他のタスクを実行できることです。

Windows 2000 以降では、いくつかの種類の DMA が使用されています。

共通バッファー DMA
共通バッファー DMA は、システムがハードウェアとソフトウェアの両方からアクセスできる単一のバッファーを割り当てることができる場合に実行されます。 ドライバーは、バッファーへのアクセスの同期を担当します。 メモリはキャッシュされないため、ドライバーにとってこの同期が容易になります。 共通バッファーを設定した後、ドライバーとハードウェアの両方が HAL からの介入なしでバッファー内のアドレスに直接書き込むことができます。

パケット DMA
パケット DMA は、ハードウェアで使用するためにマップする必要がある既存のバッファーが 1 つある場合に実行されます。 パケット DMA を使用する例として、メモリからディスクへのファイルの転送があります。 この状況で共通バッファー DMA を使用すると、ハードウェアがディスクに転送する前にファイルを共通バッファーに転送する必要があるため、無駄になります。 代わりに, HAL は相談されます。;これは、ハードウェアがメモリ内の実際のバッファーを見つけるのに役立つ情報をドライバーに提供します。 この操作は、関連するルーチンが異なるアーキテクチャ間で動作する必要性によって複雑になります。

分散/収集 DMA
散布/収集 DMA は、一度に複数のパケット DMA 転送を設定するショートカット方式です。 たとえば、ネットワーク経由でパケットを転送する場合は、ネットワーク スタックの各部分に独自のヘッダー (TCP、IP、イーサネットなど) が追加されます。 これらのヘッダーはすべて、メモリ内のさまざまな場所から割り当てられます。 この場合、散布図/収集 DMA は、ハードウェアによるアクセス用の各ヘッダーとデータ セグメントをマップするバッチ要求を HAL に発行することで、時間を節約します。 このメソッドは、パケットの各部分でパケット DMA ルーチンを呼び出す代わりに、各ルーチンを 1 回呼び出し、HAL が各ルーチンを個別にマッピングする役割を果たすことができます。

注:スキャッター/ギャザー機能は、デバイスがスキャッター/ギャザーのルーチンを使用できることを意味するものではありません。 散布図/収集機能とは、デバイスが特定の範囲ではなく、メモリ内の任意の領域から読み取りまたは書き込みを行うことができることを示す、デバイスの説明のフラグを指します。

システム DMA
システムDMAは、直接転送を行うためにマザーボード上のシステムDMAコントローラをプログラミングすることによって実行されます。 システム DMA を使用できるのは ISA カードのみです。

DMA 検証の効果

DMA 検証がアクティブな場合、ドライバー検証ツールは、次のような DMA ルーチンの誤用を検出します。

  • DMA メモリ バッファーのオーバーランまたはアンダーラン (これらのエラーは、ハードウェアまたはドライバーによって発生する可能性があります)。

  • 共通バッファー、アダプター チャネル、マップ レジスタ、またはスキャッター/ギャザー リストを二重に解放します。

  • 共通バッファー、アダプター チャネル、マップ レジスタ、散布図/収集リスト、またはアダプターを解放しないことによってメモリをリークする。

  • 1 つのアダプターに対して一度に複数のアダプター チャネルが存在する。

  • 既に解放され、存在しなくなったアダプターを使用しようとしています。

  • アダプター バッファーをフラッシュしません。

  • アダプターの未処理の参照カウントが多すぎます。

  • ページング可能なバッファーに対して DMA を実行する (DMA 転送を開始する前にすべてのバッファーをロックする必要があります)。

  • マングルされたフラグを持つ MDL で DMA を実行する。

  • 無効なシステム アドレスを参照するのは、最初の MDL の前、または最初の MDL の終了後、または MDL バッファーよりも長く、MDL 内のページ境界を越える転送長を使用する場合です。

  • 一度に割り当てるマップ レジスタが多すぎるか、許可されている最大数よりも多くのマップ レジスタを割り当てる。

  • マップ レジスタの二重マッピング。

  • マップレジスタがまだ一部マップされたままの状態で、マップレジスタを解放しようとしています。

  • マップされていないマップ レジスタをフラッシュしようとしています。

  • マップレジスタファイルの終わりでバイトをフラッシュしようとする時、その数が多すぎます。

  • 不適切な IRQL での DMA ルーチンの呼び出し。

  • NULL 値のDMA_ADAPTERを HAL ルーチンに渡します。

  • アドレスが MDL に含まれていない場合に、HAL ルーチンにアドレスと MDL を渡します。

  • 既にマップされているアドレス範囲をマップしようとしています。

  • マップされていないバッファーをフラッシュしようとしています。

  • 転送用の長さ 0 のバッファーをマップしようとしています。

  • 廃止された関数 HalGetAdapter を呼び出します (すべてのドライバーで代わりに IoGetDmaAdapter を使用する必要があります)。

ドライバー検証ツールは、ドライバーの動作を監視し、これらの違反が発生した場合0xE6バグ チェックを発行します。 バグ チェック パラメーターの一覧については、バグ チェック 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) を参照してください。

DMA 検証が役立つのはいつですか?

DMA を直接使用するすべてのドライバー (HAL DMA ルーチンを呼び出すことによって) は、DMA 検証を使用してテストする必要があります。

さらに、ミニポート ドライバーは、多くの場合、間接的に DMA を使用するため (DMA を使用するポート ドライバーを呼び出すことによって) テストする必要があります。

DMA 検証は、ドライバーまたはハードウェア デバイスが DMA バッファーをオーバーランしたときに検出できるため、メモリの破損を検出する効果的な方法でもあります。

DMA 検証の監視

カーネル デバッガー拡張機能 !dma を使用して、豊富な DMA 情報を表示できます。 各 DMA アダプターの動作に関するさまざまな詳細を表示できます。 !dma 拡張機能の詳細な例とデバッガー拡張機能に関する一般的な情報については、Windows 用デバッグ ツール パッケージのドキュメントを参照してください。 詳細については、「 Windows デバッグ 」を参照してください。

このオプションのアクティブ化

ドライバー検証マネージャーまたは Verifier.exe コマンド ラインを使用して、1 つ以上のドライバーの DMA 検証機能をアクティブ化できます。 詳細については、「 ドライバー検証ツールオプションの選択」を参照してください。

  • コマンド ラインで

    コマンド ラインでは、DMA 検証オプションは ビット 7 (0x80) で表されます。 DMA 検証をアクティブにするには、0x80のフラグ値を使用するか、フラグ値に0x80を追加します。 例えば次が挙げられます。

    verifier /flags 0x80 /driver MyDriver.sys
    

    この機能は、次の起動時にアクティブになります。

    Windows Vista 以降のバージョンの Windows では、 /volatile パラメーターをコマンドに追加することで、コンピューターを再起動せずに DMA 検証をアクティブ化および非アクティブ化することもできます。 例えば次が挙げられます。

    verifier /volatile /flags 0x80 /adddriver MyDriver.sys
    

    この設定はすぐに有効ですが、コンピューターをシャットダウンまたは再起動すると失われます。 詳細については、「 揮発性設定の使用」を参照してください。

    DMA 検証機能も標準設定に含まれています。 例えば次が挙げられます。

    verifier /standard /driver MyDriver.sys
    
  • ドライバー検証ツール マネージャーの使用

    1. ドライバー検証ツール マネージャーを起動します。 コマンド プロンプト ウィンドウに 「Verifier 」と入力します。
    2. (コード開発者向けの) [カスタム設定の作成] を選択し、[次へ] をクリックします。
    3. 完全な一覧から [個々の設定を選択] を選択します
    4. DMA 検証を選択 (チェック) します。

    DMA 検証機能も標準設定に含まれています。 この機能を使用するには、ドライバー検証ツール マネージャーで、[ 標準設定の作成] をクリックします。