!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
这相当简单;有四个不同长度的常见缓冲区。 所有物理地址和虚拟地址都已给出。