Compartilhar via


Verificação de DMA

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

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

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

Diferentes tipos de DMA

O DMA é 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 DMA 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.

Packet DMA
O DMA 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 funcionarem em diferentes arquiteturas.

DMA de dispersão/coleta
O DMA 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). Esses cabeçalhos são todos alocados de locais diferentes na memória. Nesse caso, o DMA 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 delas individualmente.

Observe que a funcionalidade 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 DMA do sistema é executado programando o controlador DMA do sistema na placa-mãe para fazer a transferência diretamente. Somente os cartões ISA podem usar o DMA 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:

  • Sobrecarga ou subcarga 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.

  • Vazamento de memória devido à falta de liberação de buffers comuns, canais do 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.

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

  • Não esvaziando um buffer do adaptador.

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

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

  • Executando DMA em um MDL com sinalizadores corrompidos.

  • Referenciando um endereço do 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 descarregar muitos bytes no final do arquivo de registro de mapeamento.

  • Chamando rotinas de DMA em um IRQL inadequado.

  • Passar um DMA_ADAPTER de valor nulo para uma rotina HAL.

  • Passando 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 ).

O Driver Verifier monitora o comportamento do driver e gera o bug check 0xE6 se alguma dessas violações ocorrer. Consulte Verificação de Erros 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) para uma lista dos parâmetros de verificação de erros.

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

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

Além disso, os drivers de miniporto também devem ser testados, pois geralmente usam o DMA indiretamente (por meio de chamadas para drivers de porta que utilizam DMA).

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

Monitorando a verificação de DMA

A extensão do depurador de kernel !dma 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 de depurador, na documentação do pacote Ferramentas de Depuração para Windows. Consulte a Depuração do Windows para obter detalhes.

Ativando essa opção

Você pode ativar o recurso de Verificação de DMA para um ou mais drivers usando o Driver Verifier Manager ou a linha de comando Verifier.exe. Para obter detalhes, consulte Selecionar 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 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 é efetivada imediatamente, mas é perdida quando você desliga ou reinicializa o computador. Para obter detalhes, consulte Como usar configurações voláteis.

    O recurso de 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. Iniciar 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 de Verificação de DMA também está incluído nas configurações padrão. Para usar esse recurso, no Gerenciador do Verificador de Driver, clique em Criar Configurações Padrão.