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 corrupção de memória é um problema de driver comum. Erros de controlador podem produzir problemas muito tempo depois que os erros são cometidos. O mais comum desses erros é acessar a memória que já foi liberada e alocar n bytes e, em seguida, acessar n + 1 bytes.
Para detetar corrupção de memória, o Verificador de Driver pode alocar memória de driver de um pool especial e monitorar esse pool para acesso incorreto. O suporte especial ao pool é fornecido para rotinas fornecidas pelo sistema no modo kernel, como ExAllocatePoolWithTag e também para as rotinas fornecidas pelo sistema GDI, como EngAllocMem.
Piscina especial por alinhamentos
Dois alinhamentos da piscina especial estão disponíveis:
- O alinhamento Verificar Início é mais eficaz na deteção de subutilizações de acesso.
- O alinhamento Verificar Final é melhor na deteção de ultrapassagens de acesso.
Para obter mais informações sobre como usar as opções Verificar Início e Verificar Fim , consulte Detetando saturações e subsaturações. Note que a grande maioria das corrupções de memória devem-se a excessos, não a subutilizações.
Quando a funcionalidade Pool Especial estiver ativa e Verificar Final tiver sido selecionada, cada alocação de memória solicitada pelo driver será colocada numa página separada. O endereço mais alto possível que permite que a alocação caiba na página é retornado, para que a memória seja alinhada com o final da página. A parte anterior da página é escrita com padrões especiais. A página anterior e a página seguinte estão marcadas como inacessíveis.
Se o driver tentar aceder à memória após o fim da alocação, o Driver Verifier detetará isso imediatamente e emitirá Bug Check 0xCD. Se o driver gravar na memória antes do início do buffer, isso (presumivelmente) alterará os padrões. Quando o buffer é libertado, o Verificador de Driver detetará a alteração e emitirá o Bug Check 0xC1.
Se o driver ler ou gravar no buffer depois de libertá-lo, o Verificador de Drivers emitirá Bug Check 0xCC.
Quando a opção Verificar Início está selecionada, o buffer de memória é alinhado com o início da página. Com essa configuração, underruns causam uma verificação de bug imediata e saturações causam uma verificação de bug quando a memória é liberada. Esta opção é idêntica à opção Verificar fim .
Verify End é o alinhamento padrão, pois os erros de sobrecarga são muito mais comuns em drivers do que os erros de subexecução.
Uma alocação de memória individual pode substituir essas configurações e escolher seu alinhamento chamando ExAllocatePoolWithTagPriority com o parâmetro Priority definido como XxxSpecialPoolOverrun ou XxxSpecialPoolUnderrun. (Esta rotina não pode ativar ou desativar o recurso Pool especial, ou solicitar o Pool especial para uma alocação de memória, que, de outra forma, seria alocada no pool normal. Apenas o alinhamento pode ser controlado a partir desta rotina.)
No Windows 7 e versões posteriores do sistema operacional Windows, a opção Pool especial suporta memória que foi alocada usando as seguintes APIs do kernel:
#B0 #A1 IoAllocateMdl #A2 #C3
IoAllocateIrp e outras rotinas que podem alocar estruturas de dados para pacotes de pedidos de E/S (IRP)
RtlAnsiStringToUnicodeString e outras rotinas de strings RTL (run-time library)
#B0 #A1 IoSetCompletionRoutineEx #A2 #C3
Piscina especial por tag de pool ou tamanho de alocação
Além da funcionalidade Pool Especial do Driver Verifier, que solicita pool especial para alocações por um driver especificado, há outras duas formas de usar o pool especial.
Tag de piscina. Solicite um pool específico para todas as alocações com um identificador de pool especificado.
Tamanho. Solicite um pool especial para todas as alocações dentro de uma faixa de tamanho especificada.
Para solicitar um pool especial para uma tag de pool específica ou um intervalo de tamanhos, utilize o Gflags, uma ferramenta que faz parte das Ferramentas de Depuração para Windows. Para obter detalhes, consulte Usando o Global Flags Utility.
Você pode usar o recurso Pool especial do Driver Verifier e os recursos especiais do pool do Gflags ao mesmo tempo. Se você fizer isso, lembre-se de que o pool especial é limitado, que nem todas as tentativas de alocação do pool especial são bem-sucedidas e que o Windows retorna um status de sucesso para tentativas fracassadas de alocação do pool especial que são satisfeitas por alocações dos pools de memória regulares.
Eficiência especial da piscina
Nem todos os pedidos especiais de piscina são atendidos. Cada alocação do pool especial usa uma página de memória física não paginável e duas páginas de espaço de endereço virtual. Se o pool estiver esgotado, a memória será alocada da maneira padrão até que o pool especial fique disponível novamente. Quando uma solicitação de pool especial é preenchida a partir do pool padrão, a função de solicitação não retorna um erro, pois a solicitação de pool foi bem-sucedida. Assim, não é recomendável que vários drivers sejam verificados ao mesmo tempo se a funcionalidade Pool Especial estiver ativada.
Um único driver que faz muitas pequenas solicitações de memória também pode esgotar esse pool. Se isso ocorrer, pode ser preferível atribuir etiquetas de pool às alocações de memória do driver e dedicar o pool especial a uma etiqueta de pool de cada vez.
O tamanho da piscina especial aumenta com a quantidade de memória física no sistema; idealmente, deve ser pelo menos 1 Gigabyte (GB). Em máquinas x86, como o espaço virtual (além do físico) é consumido, não use a opção de inicialização /3GB . Também é uma boa ideia aumentar as quantidades mínimas/máximas do arquivo de paginação por um fator de dois ou três.
Para ter certeza de que todas as alocações de um motorista estão sendo testadas, recomenda-se estressá-lo por longos períodos de tempo.
Monitorização da piscina especial
As estatísticas relativas à atribuição de reservas podem ser monitorizadas. Eles podem ser exibidos pelo Driver Verifier Manager, a linha de comando Verifier.exe ou em um arquivo de log. Consulte Monitoramento de contadores globais para obter detalhes.
Se o contador Alocações de Pool bem-sucedidas em Pool Especial for igual ao contador Alocações de Pool bem-sucedidas, o pool especial foi suficiente para cobrir todas as alocações de memória. Se o contador anterior for mais baixo do que o posterior, então o pool especial foi esgotado pelo menos uma vez.
Esses contadores não rastreiam alocações cujo tamanho é de uma página ou maior, uma vez que o pool especial não é aplicável a eles.
Se a funcionalidade Pool Especial estiver ativada, mas menos de 95% de todas as alocações de pool tiverem sido atribuídas a partir do pool especial, um aviso será exibido no Gestor de Verificação de Controladores. No Windows 2000, esse aviso aparecerá na tela Status do driver . No Windows XP e versões posteriores, esse aviso aparecerá na tela Contadores Globais . Se isso ocorrer, deve-se verificar uma lista mais curta de drivers, verificar pools individuais por tag de pool ou adicionar mais memória RAM ao sistema.
A extensão do depurador do kernel !verifier também pode ser usada para monitorizar a utilização do pool especial. Ele apresenta informações semelhantes às do Driver Verifier Manager. Para obter informações sobre extensões de depurador, consulte Depuração do Windows.
Ativar a opção de piscina especial
Você pode ativar a funcionalidade Special Pool para um ou mais drivers usando o Driver Verifier Manager ou através da linha de comando Verifier.exe. Para obter detalhes, consulte Selecionando Opções do Verificador de Controladores.
Observação
Para ativar o recurso Special Pool por tag de pool ou tamanho de alocação, ou para definir os alinhamentos Verificar Início (detetar subutilizações) e Verificar Fim (detetar sobreutilizações), use o utilitário Global Flags; estas definições de alinhamento aplicam-se a todas as alocações de Special Pool.
Na linha de comando
Na linha de comando, a opção Pool especial é representada pelo bit 0 (0x1). Para ativar o Pool Especial, use um valor de sinalizador de 0x1 ou adicione 0x1 ao valor do sinalizador. Por exemplo:
verifier /flags 0x1 /driver MyDriver.sysO recurso estará ativo após a próxima inicialização.
Yyou também pode ativar e desativar o Pool Especial sem reiniciar o computador adicionando o parâmetro /volatile ao comando. Por exemplo:
verifier /volatile /flags 0x1 /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 Piscina Especial também está incluído nas configurações padrão. Por exemplo:
verifier /standard /driver MyDriver.sysUsando o Gestor do Verificador de Drivers
- Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
- Selecione configurações individuais de uma lista completa.
- Selecione (verifique) Piscina especial.
O recurso Piscina Especial 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.