!dma
L’extension !dma affiche des informations sur le sous-système d’accès direct à la mémoire (DMA), et l’option Vérificateur DMA de Vérificateur de pilote.
!dma
!dma Adapter [Flags]
Paramètres
Adaptateur
Spécifie l’adresse hexadécimale de l’adaptateur DMA à afficher. Si elle est à zéro, tous les adaptateurs DMA seront affichés.
Drapeaux
Spécifie les informations à inclure dans l’affichage. Cela peut être n’importe quelle combinaison des bits suivants : La valeur par défaut est 0x1.
Bit 0 (0x1)
Fait en sorte que l’affichage inclue des informations génériques sur l’adaptateur.
Bit 1 (0x2)
Fait en sorte que l’affichage inclue des informations sur les registres de mappage. (Uniquement lorsque la vérification DMA est active).
Bit 2 (0x4)
Fait en sorte que l’affichage inclue des informations sur les tampons communs. (Uniquement lorsque la vérification DMA est active).
Bit 3 (0x8)
Fait en sorte que l’affichage inclue des informations sur les listes de dispersion/récolte. (Uniquement lorsque la vérification DMA est active).
Bit 4 (0x10)
Fait en sorte que l’affichage inclue la description du périphérique pour le périphérique matériel. (Uniquement lorsque la vérification DMA est active).
Bit 5 (0x20)
Fait en sorte que l’affichage inclue des informations sur le bloc de contexte d’attente.
DLL
Kdexts.dll
Informations supplémentaires
Pour des informations sur le Vérificateur de pilote, consultez la documentation du Kit de développement de pilotes Windows (WDK). Pour des informations sur le DMA, veuillez consulter la documentation du Kit de développement de pilotes Windows (WDK) et Microsoft Windows Internals (Au cœur de Windows) de Mark Russinovich et David Solomon.
Notes
Des arguments invalides (par exemple, !dma 1) génèrent un bref texte d’aide.
Lorsque l’extension !dma est utilisée sans paramètres, elle affiche une liste concise de tous les adaptateurs DMA et de leurs adresses. Cela peut être utilisé pour obtenir l’adresse d’un adaptateur à utiliser dans les versions plus longues de cette commande.
Voici un exemple de la façon dont cette extension peut être utilisée lorsque l’option de Vérification DMA du Vérificateur de pilote est active :
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
À partir de cette sortie, vous pouvez voir qu’il y a trois adaptateurs DMA dans le système. SCSIPORT en possède deux et NDIS en possède le troisième. Pour examiner l’adaptateur NDIS en détail, utilisez l’extension !dma avec son 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
Le premier bloc de données est une information spécifique que les développeurs HAL peuvent utiliser pour déboguer le problème. Pour vos besoins, les données sous « Informations supplémentaires du vérificateur DMA » sont intéressantes. Dans cet exemple, vous voyez que NDIS a alloué 0x840 registres de mappage. C’est un nombre très important, surtout parce que NDIS avait indiqué qu’il prévoyait d’utiliser un maximum de deux registres de mappage. Cet adaptateur n’utilise apparemment pas de listes de dispersion/récolte et a mis de côté tous ses canaux d’adaptateur. Examinons les registres de mappage de manière plus détaillée :
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
...
Dans cet exemple, vous voyez que certains registres de mappage ont été mappés. Chaque fichier de registres de mappage est une allocation de registres de mappage par le pilote. En d’autres termes, il représente un seul appel à AllocateAdapterChannel. NDIS collecte un grand nombre de ces fichiers de registres de mappage, tandis que certains pilotes les créent un par un et s’en débarrassent lorsqu’ils ont fini.
Les fichiers de registres de mappage sont également les adresses qui sont renvoyées au périphérique sous le nom « MapRegisterBase ». Notez que le vérificateur DMA ne surveille que les 64 premiers registres de mappage pour chaque pilote. Le reste est ignoré pour des raisons d’espace (chaque registre de mappage représente trois pages physiques).
Dans cet exemple, deux fichiers de registres de mappage sont en cours d’utilisation. Cela signifie que le pilote a mappé un tampon pour qu’il soit visible par le matériel. Dans le premier cas, 0xBC octets sont mappés à l’adresse virtuelle du système 0xF83C003C.
Un examen des tampons communs révèle :
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
C’est assez simple ; il y a quatre tampons communs de longueurs variables. Les adresses physiques et virtuelles sont toutes données.