Partager via


!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.