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