Partilhar via


!dma

A extensão !dma exibe informações sobre o subsistema DMA (Acesso Direto à Memória) e a opção Verificador de DMA do Verificador de Driver.

!dma 
!dma Adapter [Flags]

Parâmetros

Adaptador
Especifica o endereço hexadecimal do adaptador DMA a ser exibido. Se ele for zero, todos os adaptadores DMA serão exibidos.

Sinalizadores
Especifica as informações a serem incluídas na exibição. Isso pode ser qualquer combinação dos bits a seguir. O padrão é 0x1.

Bit 0 (0x1)
Leva a tela a incluir informações genéricas do adaptador.

Bit 1 (0x2)
Leva a exibição a incluir informações de registro de mapa. (Apenas quando a Verificação de DMA está ativa.)

Bit 2 (0x4)
Leva a exibição a incluir informações comuns do buffer. (Apenas quando a Verificação de DMA está ativa.)

Bit 3 (0x8)
Leva a exibição a incluir informações da lista de dispersão/coleta. (Apenas quando a Verificação de DMA está ativa.)

Bit 4 (0x10)
Leva a exibição a incluir a descrição do dispositivo para o dispositivo de hardware. (Apenas quando a Verificação de DMA está ativa.)

Bit 5 (0x20)
Leva a exibição a incluir informações de bloco de contexto de espera.

DLL

Kdexts.dll

Informações Adicionais

Para saber mais sobre o Verificador de Driver, confira a documentação do WDK (Kit de Driver do Windows). Para saber mais sobre DMA, consulte a documentação do WDK (Kit de Driver do Windows) e o livro Microsoft Windows Internals de Mark Russinovich David Solomon.

Comentários

Argumentos inválidos (por exemplo, !dma 1) geram um texto breve de ajuda.

Quando a extensão !dma é usada sem parâmetros, ela exibe uma lista concisa de todos os adaptadores DMA e endereços. Isso pode ser usado para obter o endereço de um adaptador para uso nas versões mais longas desse comando.

Este é um exemplo de como essa extensão pode ser usada quando a opção Verificação de DMA do Verificador de Driver está ativa:

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 dessa saída, note que há três adaptadores DMA no sistema. O SCSIPORT possui dois e o NDIS possui o terceiro. Para examinar o adaptador NDIS em detalhes, use a extensão !dma com o endereço:

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

O primeiro bloco de dados são informações específicas a serem usadas por um desenvolvedor HAL para depurar o problema. Para seus propósitos, os dados abaixo "Informações adicionais do verificador de DMA" são interessantes. Neste exemplo, note que o NDIS alocou registros de mapa 0x840. Este é um número enorme, especialmente porque o NDIS indicou que pretendia usar no máximo dois registros de mapas. Parece que este adaptador não usa listas de dispersão/coleta e guardou todos os canais de adaptador. Veja os registros do mapa em detalhes:

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

Neste exemplo, você verá que certos registros de mapa foram mapeados. Cada arquivo de registro de mapa é uma alocação de registros de mapa pelo driver. Ou seja, ele representa uma única chamada para AllocateAdapterChannel. O NDIS coleta um grande número desses arquivos de registro de mapa, enquanto alguns drivers criam um de cada vez e os descartam quando terminam.

Os arquivos de registro de mapa também são os endereços retornados ao dispositivo com o nome "MapRegisterBase". Note que o verificador DMA conecta apenas os primeiros 64 registros de mapa para cada driver. O restante é ignorado por questões de espaço (cada registro de mapa representa três páginas físicas).

Neste exemplo, dois arquivos de registro de mapa estão em uso. Isso significa que o driver mapeou um buffer para que ele fique visível para o hardware. No primeiro caso, 0xBC bytes são mapeados para o endereço virtual do sistema 0xF83C003C.

Um exame dos buffers comuns revela:

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

É simples: existem quatro buffers comuns de comprimentos variáveis. Todos os endereços físicos e virtuais são fornecidos.