共用方式為


!dma

!dma 延伸模組會顯示 Direct Memory Access (DMA) 子系統的相關信息,以及驅動程式驗證器的 DMA 驗證器選項。

!dma 
!dma Adapter [Flags]

參數

適配器
指定要顯示之 DMA 配接器的十六進位位址。 如果這是零,則會顯示所有 DMA 配接器。

標誌
指定要包含在顯示器中的資訊。 這可以是下列位的任何組合。 預設值為 0x1。

位 0 (0x1)
導致顯示包含泛型配接器資訊。

位 1 (0x2)
導致顯示包含地圖緩存器資訊。 (只有在 DMA 驗證為使用中時。)

位 2 (0x4)
導致顯示包含一般緩衝區資訊。 (只有在 DMA 驗證為使用中時。)

位 3 (0x8)
讓顯示包含散佈/收集清單資訊。 (只有在 DMA 驗證為使用中時。)

位 4 (0x10)
讓顯示包含硬體裝置的裝置描述。 (只有在 DMA 驗證為使用中時。)

位 5 (0x20)
導致顯示包含等候內容區塊資訊。

DLL

Kdexts.dll

其他資訊

如需驅動程式驗證器的相關信息,請參閱 Windows 驅動程式套件 (WDK) 檔。 如需 DMA 的相關信息,請參閱 Windows 驅動程式套件 (WDK) 檔和 Microsoft Mark Russinovich David 所羅門的 Windows 內部

備註

無效的自變數 (例如 !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

在此輸出中,您可以看到系統中有三個 DMA 配接器。 SCSIPORT 擁有兩個,NDIS 擁有第三個。 若要詳細檢查 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 已表示它計劃使用最多兩個地圖緩存器。 此配接器顯然不會使用散佈/收集清單,並已將所有配接器通道都放在一起。 更詳細地檢視地圖快取器:

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的單一呼叫。 NDIS 會收集大量這些對應緩存器檔案,而某些驅動程式會一次建立一個檔案,並在完成時加以處置。

對應緩存器檔案也是以 「MapRegisterBase」 名稱傳回至裝置的位址。 請注意,DMA 驗證器只會攔截每個驅動程式的前 64 個對應緩存器。 其餘部分會因為空間原因而忽略(每個地圖緩存器代表三個實體頁面)。

在此範例中,有兩個對應緩存器檔案正在使用中。 這表示驅動程式已對應緩衝區,讓硬體可以看到該緩衝區。 在第一個案例中,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

這是相當直接的;有四個不同長度的常見緩衝區。 所有實體和虛擬位址都已提供。