!dma
Die Erweiterung !dma zeigt Informationen über das Direct Memory Access (DMA)-Subsystem und die Option DMA Verifier von Driver Verifier an.
!dma
!dma Adapter [Flags]
Parameter
Adapter
Gibt die hexadezimale Adresse des DMA-Adapters an, die angezeigt werden soll. Ist dieser Wert Null, werden alle DMA-Adapter angezeigt.
Flaggen
Gibt die Informationen an, die in der Anzeige erscheinen sollen. Dies kann eine beliebige Kombination der folgenden Bits sein. Der Standardwert ist 0x1.
Bit 0 (0x1)
Bewirkt, dass die Anzeige generische Adapterinformationen enthält.
Bit 1 (0x2)
Bewirkt, dass die Anzeige Informationen zu den Kartenregistern enthält. (Nur wenn die DMA-Überprüfung aktiv ist.)
Bit 2 (0x4)
Bewirkt, dass die Anzeige gemeinsame Pufferinformationen enthält. (Nur wenn die DMA-Überprüfung aktiv ist.)
Bit 3 (0x8)
Bewirkt, dass die Anzeige Informationen zur Streu-/Sammelliste enthält. (Nur wenn die DMA-Überprüfung aktiv ist.)
Bit 4 (0x10)
Bewirkt, dass die Anzeige die Gerätebeschreibung für das Hardware-Gerät enthält. (Nur wenn die DMA-Überprüfung aktiv ist.)
Bit 5 (0x20)
Bewirkt, dass die Anzeige Informationen zum Kontextblock Warten enthält.
DLL
Kdexts.dll
Zusätzliche Informationen
Informationen über Driver Verifier finden Sie in der Dokumentation zum Windows Driver Kit (WDK). Informationen über DMA finden Sie in der Windows Driver Kit (WDK) Dokumentation und unter Microsoft Windows Internals von Mark Russinovich David Solomon.
Hinweise
Ungültige Argumente (zum Beispiel !dma 1) erzeugen einen kurzen Hilfetext.
Wenn die Erweiterung !dma ohne Parameter verwendet wird, zeigt sie eine übersichtliche Liste aller DMA-Adapter und ihrer Adressen an. Dies kann verwendet werden, um die Adresse eines Adapters zur Verwendung in den längeren Versionen dieses Befehls zu erhalten.
Das folgende Beispiel zeigt, wie diese Erweiterung verwendet werden kann, wenn die Option DMA Verification des Driver Verifier aktiviert ist:
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
Aus dieser Ausgabe können Sie ersehen, dass es drei DMA-Adapter im System gibt. SCSIPORT besitzt zwei und NDIS besitzt den dritten. Um den NDIS-Adapter im Detail zu untersuchen, verwenden Sie die Erweiterung !dma mit seiner Adresse:
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
Der erste Datenblock enthält spezifische Informationen, die ein HAL-Entwickler zur Fehlersuche verwenden kann. Für Ihre Zwecke sind die Daten unter „Dma verifier additional information“ interessant. In diesem Beispiel sehen Sie, dass NDIS 0x840 Map-Register zugewiesen hat. Das ist eine enorme Zahl, vor allem weil NDIS angedeutet hatte, dass es maximal zwei Map-Register verwenden wollte. Dieser Adapter verwendet offensichtlich keine Scatter/Gather-Listen und hat alle seine Adapterkanäle weggelegt. Sehen Sie sich die Kartenregister genauer an:
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
...
In diesem Beispiel sehen Sie, dass bestimmte Map-Register gemappt wurden. Jede Map-Register-Datei ist eine Zuordnung von Map-Registern durch den Treiber. Mit anderen Worten, es handelt sich um einen einzigen Aufruf von AllocateAdapterChannel. NDIS sammelt eine große Anzahl dieser Map-Registerdateien, während einige Treiber sie einzeln erstellen und nach Beendigung entsorgen.
Die Map-Register-Dateien sind auch die Adressen, die unter dem Namen „MapRegisterBase“ an das Gerät zurückgegeben werden. Beachten Sie, dass die DMA-Prüfung nur die ersten 64 Map-Register für jeden Treiber erfasst. Der Rest wird aus Platzgründen ignoriert (jedes Map-Register entspricht drei physischen Seiten).
In diesem Beispiel werden zwei Kartenregisterdateien verwendet. Dies bedeutet, dass der Treiber einen Puffer abgebildet hat, sodass er für die Hardware sichtbar ist. Im ersten Fall werden die 0xBC-Bytes auf die virtuelle Systemadresse 0xF83C003C abgebildet.
Eine Untersuchung der gemeinsamen Puffer zeigt:
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
Dies ist relativ einfach; es gibt vier gängige Puffer mit unterschiedlicher Länge. Die physischen und virtuellen Adressen sind alle angegeben.