Partilhar via


Verificação de DMA

A Verificação de DMA monitora o uso do DMA (Acesso Direto à Memória). Como as rotinas de AMD foram alteradas à medida que o Windows se desenvolveu, muitos drivers fazem uso incorreto de chamadas de AMD. Além disso, alguns gravadores de driver tentam ignorar completamente o subsistema HAL DMA. Essa prática pode introduzir bugs insidiosos no driver.

A opção Verificação de DMA do Verificador de Driver tenta capturar erros comuns de DMA. Juntamente com a extensão do depurador de kernel !dma , ela pode ser usada para verificar se um driver está usando o AMD de maneira adequada.

Essa opção verificador de driver também é chamada de Verificação HAL. Algumas mensagens de erro produzidas pelo Verificador de Driver podem usar esse termo.

Diferentes tipos de AMD

O AMD é um mecanismo por meio 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 sinalizará o processador quando concluir a transferência. A vantagem desse sistema é que o processador pode executar outras tarefas enquanto a transferência de DMA está sendo executada.

Há vários tipos de AMD usados 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, facilitando essa sincronização para o driver. Depois de configurar um buffer comum, o driver e o hardware podem gravar diretamente nos endereços no buffer sem nenhuma intervenção do HAL.

DMA do pacote
O AMD do pacote é executado quando há um único buffer existente que deve ser mapeado para uso pelo hardware. Um exemplo de uso de DMA de pacote é a transferência de um arquivo da memória para um disco. Usar o DMA de buffer comum nessa situação seria um desperdício, pois 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 fornece ao driver as informações necessárias para ajudar o hardware a encontrar o buffer real na memória. Essa operação é complicada pela necessidade de as rotinas envolvidas trabalharem em diferentes arquiteturas.

DMA de dispersão/coleta
O AMD de dispersão/coleta é um método de atalho que configura várias transferências de DMA de pacote ao mesmo tempo. Se você estiver transferindo um pacote pela rede, por exemplo, cada parte da pilha de rede adicionará seu próprio cabeçalho (TCP, IP, Ethernet e assim por diante). Todos esses cabeçalhos são alocados de diferentes locais na memória. Nesse caso, o AMD de dispersão/coleta economiza tempo emitindo uma solicitação em lote para o HAL para mapear cada cabeçalho mais o segmento de dados para acesso pelo hardware. Em vez de precisar chamar as rotinas de 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ção Acapacidade de dispersão/coleta não significa que o dispositivo pode usar as rotinas de dispersão/coleta. A funcionalidade de dispersão/coleta refere-se a um sinalizador na descrição do dispositivo que indica que o dispositivo é capaz de ler ou gravar de qualquer área na memória, em vez de apenas um determinado intervalo.

DMA do sistema
O AMD do sistema é executado programando o controlador de DMA do sistema na placa-mãe para fazer a transferência diretamente. Somente cartões ISA podem usar o AMD do sistema.

Efeitos da verificação de DMA

Quando a Verificação de DMA está ativa, o Verificador de Driver detecta uso indevido de rotinas de DMA, incluindo:

  • Saturação ou subexecutação do buffer de memória DMA (esses erros podem ser cometidos pelo hardware ou pelo driver).

  • Liberação dupla de um buffer comum, canal do adaptador, registro de mapa ou lista de dispersão/coleta.

  • Perda de memória ao não liberar buffers comuns, canais de adaptador, registros de mapa, listas de dispersão/coleta ou adaptadores.

  • Ter mais de um canal de adaptador presente para um adaptador ao mesmo tempo.

  • Tentativa de usar um adaptador que já foi liberado e não existe mais.

  • Não liberando um buffer do adaptador.

  • Ter muitas contagens de referência pendentes para um adaptador.

  • Executar o AMD em um buffer paginável (todos os buffers devem ser bloqueados antes do início da transferência de AMD).

  • Executando o AMD em um MDL com sinalizadores mutilados.

  • Referenciando um endereço de sistema inválido, antes do primeiro MDL ou após o final do primeiro MDL, ou usando um comprimento de transferência maior que o buffer MDL e cruza um limite de página dentro do MDL.

  • Alocar muitos registros de mapa ao mesmo tempo ou alocar mais registros de mapa do que o número máximo permitido.

  • Mapeamento duplo de registros de mapa.

  • Tentando liberar registros de mapa enquanto alguns ainda estão mapeados.

  • Tentando liberar um registro de mapa que não foi mapeado.

  • Tentando liberar muitos bytes no final do arquivo de registro do mapa.

  • Chamar rotinas de DMA em um IRQL inadequado.

  • Passar um valor nulo DMA_ADAPTER para uma rotina HAL.

  • Passar um endereço e um MDL para uma rotina HAL quando o endereço não estiver contido no MDL.

  • Tentando mapear um intervalo de endereços que já foi mapeado.

  • Tentando liberar um buffer que não está mapeado.

  • Tentando mapear um buffer de comprimento zero para transferência.

  • Chamar a função obsoleta HalGetAdapter (todos os drivers devem usar IoGetDmaAdapter ).

O Verificador de Driver monitora o comportamento do driver e emite bugs marcar 0xE6 se alguma dessas violações ocorrer. Consulte 0xE6 de Verificação de Bugs (DRIVER_VERIFIER_DMA_VIOLATION) para obter uma lista dos parâmetros de marcar de bugs.

Quando a verificação de DMA é útil?

Todos os drivers que usam o AMD diretamente (chamando as rotinas de AMD HAL) devem ser testados com a Verificação de DMA.

Além disso, os drivers de miniporta também devem ser testados, pois geralmente usam o AMD indiretamente (chamando drivers de porta que usam DMA).

A verificação de DMA também pode ser uma maneira eficaz de detectar corrupção de memória, pois pode detectar quando um driver ou um dispositivo de hardware ultrapassa um buffer de DMA.

Monitoramento da verificação de DMA

A extensão !dma do depurador de kernel pode ser usada para exibir uma grande quantidade de informações de DMA. Ele pode exibir vários detalhes sobre o comportamento de cada adaptador de DMA. Há um exemplo detalhado da extensão !dma , bem como informações gerais sobre extensões do depurador, na documentação do pacote Ferramentas de Depuração para Windows. Consulte Depuração do Windows para obter detalhes.

Ativando essa opção

Você pode ativar o recurso verificação de 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 driver.

  • Na linha de comando

    Na linha de comando, a opção Verificação de DMA é representada pelo Bit 7 (0x80). Para ativar a Verificação de DMA, use um valor de sinalizador de 0x80 ou adicione 0x80 ao valor do sinalizador. Por exemplo:

    verifier /flags 0x80 /driver MyDriver.sys
    

    O recurso estará ativo após a próxima inicialização.

    No Windows Vista e em versões posteriores do Windows, você também pode ativar e desativar a Verificação de DMA sem reinicializar o computador adicionando o parâmetro /volatile ao comando . Por exemplo:

    verifier /volatile /flags 0x80 /adddriver MyDriver.sys
    

    Essa configuração entra em vigor imediatamente, mas é perdida quando você desliga ou reinicializa o computador. Para obter detalhes, consulte Usando configurações voláteis.

    O recurso verificação de DMA também está incluído nas configurações padrão. Por exemplo:

    verifier /standard /driver MyDriver.sys
    
  • Usando o Gerenciador de Verificador de Driver

    1. Inicie o Gerenciador de Verificador de Driver. Digite Verificador em uma janela do Prompt de Comando.
    2. Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
    3. Selecione Selecionar configurações individuais em uma lista completa.
    4. Selecione (marcar) verificação de DMA.

    O recurso verificação de DMA também está incluído nas configurações padrão. Para usar esse recurso, no Gerenciador de Verificador de Driver, clique em Criar Configurações Padrão.