!dma

!dma 拡張機能には、ダイレクト メモリ アクセス (DMA) サブシステムとドライバー検証ツールの DMA 検証ツール オプションに関する情報が表示されます。

!dma 
!dma Adapter [Flags]

パラメーター

Adapter
表示するDMAアダプタのアドレスを16進数で指定します。 これが 0 の場合、すべての DMA アダプターが表示されます。

Flags
表示に含める情報を指定します。 これは、次のビットを任意に組み合わせて指定できます。 デフォルトは 0x1 です。

ビット0 (0x1)
表示に汎用アダプター情報を含めます。

ビット 1 (0x2)
マップ レジスタ情報を表示します。 (DMA 検証がアクティブな場合のみ)。

ビット 2 (0x4)
表示に共通のバッファー情報を含めます。 (DMA 検証がアクティブな場合のみ)。

ビット 3 (0x8)
表示に散布図/収集リスト情報を含めます。 (DMA 検証がアクティブな場合のみ)。

ビット 4 (0x10)
ハードウェア デバイスのデバイスの説明を表示に含めます。 (DMA 検証がアクティブな場合のみ)。

ビット 5 (0x20)
待機コンテキスト ブロック情報を表示します。

DLL

Kdexts.dll

追加情報

ドライバー検証ツールの詳細については、Windows ドライバー キット (WDK) のドキュメントを参照してください。 DMA の詳細については、Windows Driver Kit (WDK) のドキュメントと、Mark Russinovich David Solomon による Microsoft Windows Internalsを参照してください。

解説

無効な引数 (!dma 1 など) では、簡単なヘルプ テキストが生成されます。

!dma 拡張機能をパラメーターなしで使用すると、すべての DMA アダプターとそのアドレスの簡潔な一覧が表示されます。 これは、このコマンドの長いバージョンで使用するアダプターのアドレスを取得するために使用できます。

ドライバー検証ツールの DMA 検証オプションがアクティブな場合に、この拡張機能を使用する方法の例を次に示します。

0:kd> !dma

Dumping all DMA adapters...

Adapter: 82faebd0     Owner: SCSIPORT!ScsiPortGetUncachedExtension 
Adapter: 82f88930     Owner: SCSIPORT!ScsiPortGetUncachedExtension 
Adapter: 82f06cd0     Owner: NDIS!NdisMAllocateMapRegisters 
Master adapter: 80076800

この出力から、システムに 3 つの DMA アダプターがあることがわかります。 SCSIPORT は 2 つを所有し、NDIS は 3 つ目を所有します。 NDIS アダプターを詳しく調べるには、!dma 拡張機能とそのアドレスを使用します。

0:kd> !dma  82f06cd0
Adapter: 82f06cd0     Owner: NDIS!NdisMAllocateMapRegisters (0x9fe24351)
 MasterAdapter:       00000000
   Adapter base Va      00000000
   Map register base:   00000000
 WCB:                 82f2b604
   Map registers: 00000000 mapped, 00000000 allocated, 00000002 max

   Dma verifier additional information:
   DeviceObject: 82f98690
   Map registers:        00000840 allocated, 00000000 freed
   Scatter-gather lists: 00000000 allocated, 00000000 freed
   Common buffers:       00000004 allocated, 00000000 freed
   Adapter channels:     00000420 allocated, 00000420 freed
   Bytes mapped since last flush: 000000f2

データの最初のブロックは、HAL 開発者が問題をデバッグするために使用できる特定の情報です。 目的に応じて、「Dma 検証ツールの追加情報」の下のデータが興味深いものです。 この例では、NDIS がマップ レジスタ0x840割り当てられていることがわかります。 これは膨大な数です。NDIS は最大 2 つのマップ レジスタを使用することを計画していたため、特にです。 このアダプターは、明らかに散布図/収集リストを使用せず、すべてのアダプター チャネルを配置しています。 マップ レジスタの詳細を確認します。

0:kd> !dma  82f06cd0 2
Adapter: 82f06cd0     Owner: NDIS!NdisMAllocateMapRegisters 
...

  Map register file 82f06c58 (0/2 mapped)
     Double buffer mdl: 82f2c188
     Map registers:
        82f06c80: Not mapped
        82f06c8c: Not mapped

  Map register file 82f06228 (1/2 mapped)
     Double buffer mdl: 82f1b678
     Map registers:
        82f06250: 00bc bytes mapped to f83c003c
        82f0625c: Not mapped

  Map register file 82fa5ad8 (1/2 mapped)
     Double buffer mdl: 82f1b048
     Map registers:
        82fa5b00: 0036 bytes mapped to 82d17102
        82fa5b0c: Not mapped
...

この例では、特定のマップ レジスタがマップされていることがわかります。 各 マップ レジスタ ファイル は、ドライバーによるマップ レジスタの割り当てです。 つまり、AllocateAdapterChannel の 1 回の呼び出しを表します。 NDIS は、これらのマップ レジスタ ファイルの多数を収集しますが、一部のドライバーは一度に 1 つずつ作成し、完了したら破棄します。

マップ レジスタ ファイルは、"MapRegisterBase" という名前でデバイスに返されるアドレスでもあります。 DMA 検証ツールでは、ドライバーごとに最初の 64 個のマップ レジスタのみがフックされることに注意してください。 残りの部分はスペースの理由から無視されます (各マップ レジスタは 3 つの物理ページを表します)。

この例では、2 つのマップ レジスタ ファイルが使用されています。 これは、ドライバーがバッファーをマップして、ハードウェアに表示されることを意味します。 最初のケースでは、0xBC バイトはシステム仮想アドレス 0xF83C003Cにマップされます。

一般的なバッファーを調べると、次の内容が明らかになります:

0:kd> !dma  82f06cd0 4
Adapter: 82f06cd0     Owner: NDIS!NdisMAllocateMapRegisters 
...
   Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
      Length:           1000
      Virtual address:  82e77000
      Physical address: 2a77000

   Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
      Length:           12010
      Virtual address:  82e817f8
      Physical address: 2a817f8

   Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
      Length:           4300
      Virtual address:  82e95680
      Physical address: 2a95680

   Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
      Length:           4800
      Virtual address:  82e9d400
      Physical address: 2a9d400

これは非常に簡単です。さまざまな長さの 4 つの一般的なバッファーがあります。 物理アドレスと仮想アドレスはすべて指定されます。