Compartir a través de


!dma

La extensión !dma muestra información sobre el subsistema de acceso directo a memoria (DMA) y la opción de comprobador de DMA del comprobador de controladores.

!dma 
!dma Adapter [Flags]

Parámetros

Adaptador
Especifica la dirección hexadecimal del adaptador de DMA que se va a mostrar. Si es cero, se mostrarán todos los adaptadores de DMA.

Banderas
Especifica la información que se v a incluir en la visualización. Puede ser cualquier combinación de los siguientes bits. El valor predeterminado es 0x1.

Bit 0 (0x1)
Hace que la visualización incluya información genérica sobre el adaptador.

Bit 1 (0x2)
Hace que la visualización incluya la información de registro de mapa. (solo cuando la comprobación de DMA está activada).

Bit 2 (0x4)
Hace que la visualización incluya la información del búfer común. (solo cuando la comprobación de DMA está activada).

Bit 3 (0x8)
Hace que la visualización incluya la información de la lista de dispersión/recopilación. (solo cuando la comprobación de DMA está activada).

Bit 4 (0x10)
Hace que la visualización incluya la descripción del dispositivo de hardware. (solo cuando la comprobación de DMA está activada).

Bit 5 (0x20)
Hace que la visualización incluya la información del bloque de contexto de espera.

Archivo DLL

Kdexts.dll

Información adicional

Para obtener información sobre el comprobador de controladores, consulte la documentación del Kit de controladores de Windows (WDK). Para obtener información sobre DMA, consulte la documentación del Kit de controladores de Windows (WDK) y Microsoft Windows Internals de Mark Russinovich y David Solomon.

Comentarios

Los argumentos no válidos (por ejemplo, !dma 1) generan un breve texto de ayuda.

Cuando se utiliza la extensión !dma sin parámetros, muestra una lista concisa de todos los adaptadores de DMA y sus direcciones. Puede utilizarse para obtener la dirección de un adaptador para su uso en las versiones más largas de este comando.

Este es un ejemplo de cómo puede utilizarse esta extensión cuando está activa la opción de comprobador de DMA del comprobador de controladores:

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

A partir de esta salida, puede ver que hay tres adaptadores de DMA en el sistema. SCSIPORT posee dos y NDIS el tercero. Para examinar el adaptador de NDIS en detalle, utilice la extensión !dma con su dirección:

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

El primer bloque de datos es información específica que un desarrollador de HAL puede utilizar para depurar el problema. Para sus fines, lo interesante son los datos que figuran debajo de "Información adicional del comprobador de Dma". En este ejemplo, se ve que NDIS ha asignado 0x840 registros de mapa. Se trata de una cifra enorme, sobre todo porque NDIS había indicado que tenía previsto utilizar un máximo de dos registros de mapa. Este adaptador aparentemente no utiliza listas de dispersión/recopilación y ha guardado todos sus canales de adaptador. Observe los registros de mapa con más detalle:

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

En este ejemplo, se ve que ciertos registros de mapa se han asignado. Cada archivo de registro de mapa es una asignación de registros de mapa por parte del controlador. En otras palabras, representa una única llamada a AllocateAdapterChannel. NDIS recopila un gran número de estos archivos de registro de mapa, mientras que algunos controladores los crean de uno en uno y los desechan cuando terminan.

Los archivos de registro de mapa son también las direcciones que se devuelven al dispositivo con el nombre "MapRegisterBase". Tenga en cuenta que el comprobador de DMA solo engancha los primeros 64 registros del mapa para cada controlador. El resto se ignoran por razones de espacio (cada registro de mapa representa tres páginas físicas).

En este ejemplo, se utilizan dos archivos de registro de mapa. Esto significa que el controlador ha asignado un búfer para que el hardware pueda verlo. En el primer caso, los bytes 0xBC se asignan a la dirección virtual del sistema 0xF83C003C.

Un examen de los búferes comunes revela lo siguiente:

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

Esto es bastante sencillo; existen cuatro búferes comunes de longitudes variables. Se dan todas las direcciones físicas y virtuales.