!dma

!dma 扩展显示有关直接内存访问 (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)
使显示包含 Wait 上下文块信息。

DLL

Kdexts.dll

其他信息

有关驱动程序验证程序的信息,请参阅 Windows 驱动程序工具包 (WDK) 文档。 有关 DMA 的信息,请参阅 Windows 驱动程序工具包(WDK)文档和 Mark Russinovich 和 David Solomon 编写的 Microsoft 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

这相当简单;有四个不同长度的常见缓冲区。 所有物理地址和虚拟地址都已给出。