Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A Verificação DMA monitoriza a utilização do Acesso Direto à Memória (DMA). Desde que as rotinas DMA mudaram como o Windows se desenvolveu, muitos drivers fazem uso incorreto de chamadas DMA. Além disso, alguns criadores de drivers tentam ignorar completamente o subsistema HAL DMA. Esta prática pode introduzir bugs insidiosos no motorista.
A opção de verificação DMA do verificador de controladores tenta detetar erros comuns de DMA. Junto com a extensão do depurador do kernel !dma, pode ser usado para verificar se um driver está utilizando o DMA de maneira adequada.
Esta opção de Verificador de Driver também é chamada de Verificação HAL. Algumas mensagens de erro produzidas pelo Verificador de Driver podem usar este termo.
Diferentes tipos de DMA
DMA é um mecanismo através do qual um dispositivo de hardware pode transferir dados de ou para a memória sem usar o processador. O processador é necessário para configurar a transferência, e o dispositivo irá sinalizar o processador quando ele tiver concluído a transferência. A vantagem deste sistema é que o processador pode executar outras tarefas enquanto a transferência DMA está sendo executada.
Existem vários tipos de DMA utilizados no Windows 2000 e posterior:
DMA de buffer comum
O DMA de buffer comum é executado quando o sistema pode alocar um único buffer acessível pelo hardware e pelo software. O driver é responsável por sincronizar os acessos ao buffer. A memória não é armazenada em cache, tornando essa sincronização mais fácil para o driver. Depois de configurar um buffer comum, tanto o driver como o hardware podem gravar diretamente nos endereços no buffer sem qualquer intervenção do HAL.
Packet DMA
O DMA de pacotes é executado quando há um único buffer existente que deve ser mapeado para uso pelo hardware. Um exemplo de uso do pacote DMA é a transferência de um arquivo da memória para um disco. Usar DMA de buffer comum nessa situação seria um desperdício, porque o arquivo teria que ser transferido para o buffer comum antes que o hardware pudesse transferi-lo para o disco. Em vez disso, o HAL é consultado; Ele dá ao driver as informações necessárias para ajudar o hardware a encontrar o buffer real na memória. Esta operação é complicada pela necessidade de as rotinas envolvidas trabalharem em diferentes arquiteturas.
Scatter/Gather DMA
Dispersar/reunir DMA é um método de atalho que configura várias transferências DMA de pacotes de uma só vez. Se estiver a transferir um pacote pela rede, por exemplo, cada elemento da pilha de rede adicionará o seu próprio cabeçalho (TCP, IP, Ethernet e assim por diante). Esses cabeçalhos são todos alocados de diferentes lugares na memória. Nesse caso, o DMA de dispersão/coleta economiza tempo emitindo uma solicitação em lote para a HAL para mapear cada cabeçalho mais o segmento de dados para acesso pelo hardware. Em vez de ter que chamar as rotinas DMA do pacote em cada parte do pacote, esse método chama cada rotina uma vez e permite que o HAL seja responsável por mapear cada uma individualmente.
ObservaçãoA capacidade de dispersão/coleta não significa que o dispositivo possa usar as rotinas de dispersão/coleta. A capacidade de dispersão/recolha refere-se a um sinalizador na descrição do dispositivo que indica que o dispositivo é capaz de ler ou escrever a partir de qualquer área na memória, em vez de apenas um determinado intervalo.
DMA do sistema
O DMA do sistema é realizado programando o controlador DMA do sistema na placa-mãe para fazer a transferência diretamente. Apenas cartões ISA podem usar o sistema DMA.
Efeitos da verificação DMA
Quando a Verificação DMA está ativa, o Verificador de Driver deteta usos indevidos de rotinas DMA, incluindo:
Sobrecarga ou execução insuficiente do buffer de memória DMA (esses erros podem ser feitos pelo hardware ou pelo driver).
Liberação dupla de um buffer comum, canal do adaptador, registro de mapa ou lista de dispersão/coleta.
Vazamento de memória por não liberar buffers comuns, canais de adaptador, registros de mapas, listas de dispersão/coleta ou adaptadores.
Ter mais de um canal de adaptador disponível para um único adaptador simultaneamente.
Tentando usar um adaptador que já foi liberado e não existe mais.
Não esvaziar um buffer do adaptador.
Ter demasiadas contagens de referências pendentes para um adaptador.
Executar DMA num buffer paginável (todos os buffers devem ser bloqueados antes do início da transferência DMA).
Execução de DMA em um MDL com sinalizadores corrompidos.
Fazer referência a um endereço de sistema inválido, antes ou depois da primeira MDL, ou usar um comprimento de transferência que ultrapassa o buffer MDL e cruza um limite de página dentro da MDL.
Atribuir demasiados registos de mapas de uma só vez ou atribuir mais registos de mapas do que o número máximo permitido.
Mapeamento duplo de registos de mapas.
Tentando liberar registros de mapas enquanto alguns ainda estão mapeados.
Tentando liberar um registro de mapa que não foi mapeado.
Tentativa de descarregar demasiados bytes no final do arquivo de registro de mapa.
Chamar rotinas de DMA em um IRQL impróprio.
Passando um DMA_ADAPTER de valor nulo para uma rotina HAL.
Passar um endereço e um MDL para uma rotina HAL quando o endereço não está contido no MDL.
Tentando mapear um intervalo de endereços que já foi mapeado.
Tentando esvaziar um buffer que não está mapeado.
Tentando mapear um buffer de comprimento zero para transferência.
Chamando a função obsoleta HalGetAdapter (todos os drivers devem usar IoGetDmaAdapter em vez disso).
O Verificador de Controladores monitora o comportamento do controlador e emite o código de verificação de erros 0xE6 se ocorrer alguma dessas violações. Consulte Bug Check 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) para obter uma lista dos parâmetros de verificação de bugs.
Quando a verificação DMA é útil?
Todos os drivers que usam DMA diretamente (chamando as rotinas HAL DMA) devem ser testados com a Verificação do DMA.
Além disso, os drivers de miniporta também devem ser testados, já que muitas vezes usam DMA indiretamente (chamando drivers de porta que usam DMA).
A verificação DMA também pode ser uma maneira eficaz de detetar corrupção de memória, uma vez que pode detetar quando um driver ou um dispositivo de hardware excede um buffer DMA.
Monitoramento da verificação DMA
A extensão do depurador do kernel !dma pode ser usada para exibir várias informações DMA. Ele pode exibir vários detalhes sobre o comportamento de cada adaptador DMA. Há um exemplo detalhado da extensão !dma , bem como informações gerais sobre extensões de depurador, na documentação do pacote Ferramentas de Depuração para Windows. Consulte Depuração do Windows para obter detalhes.
Ativando esta opção
Você pode ativar o recurso de verificação DMA para um ou mais drivers usando o Gerenciador de verificador de driver ou a linha de comando Verifier.exe. Para obter detalhes, consulte Selecionando Opções do Verificador de Controladores.
Na linha de comando
Na linha de comando, a opção de verificação DMA é representada pelo bit 7 (0x80). Para ativar a Verificação DMA, use um valor de sinalizador de 0x80 ou adicione 0x80 ao valor do sinalizador. Por exemplo:
verifier /flags 0x80 /driver MyDriver.sysO recurso estará ativo após a próxima inicialização.
No Windows Vista e versões posteriores do Windows, você também pode ativar e desativar a Verificação DMA sem reinicializar o computador adicionando o parâmetro /volatile ao comando. Por exemplo:
verifier /volatile /flags 0x80 /adddriver MyDriver.sysEssa configuração entra em vigor imediatamente, mas é perdida quando você desliga ou reinicia o computador. Para obter detalhes, consulte Usando Configuração Volátil.
O recurso de verificação DMA também está incluído nas configurações padrão. Por exemplo:
verifier /standard /driver MyDriver.sysUsando o Gestor do Verificador de Drivers
- Inicie o Driver Verifier Manager. Digite Verifier numa janela da Linha de Comandos.
- Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
- Selecione configurações individuais de uma lista completa.
- Selecione a opção Verificação de DMA.
O recurso de verificação DMA também está incluído nas configurações padrão. Para usar esse recurso, no Gerenciador de Verificadores de Driver, clique em Criar Configurações Padrão.