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.
O tamanho da pilha do modo kernel é limitado a aproximadamente três páginas. Portanto, ao passar dados para rotinas internas, os drivers não podem passar grandes quantidades de dados na stack do kernel.
Para evitar a falta de espaço de pilha no modo kernel, siga as seguintes diretrizes de conceção:
Evite fazer chamadas profundamente aninhadas de uma rotina de driver interno para outra, se cada rotina estiver a passar dados na pilha do kernel.
Certifique-se de limitar o número de chamadas recursivas que podem ocorrer, se você projetar um driver que tenha uma rotina recursiva.
Em outras palavras, a estrutura da árvore de chamadas de um motorista deve ser relativamente plana. Você pode chamar as rotinas IoGetStackLimits e IoGetRemainingStackSize para determinar o espaço de pilha do kernel disponível, ou KeExpandKernelStackAndCallout para expandi-lo. Observe que o tamanho da pilha de modo kernel pode variar entre diferentes plataformas de hardware e diferentes versões do sistema operacional.
Esgotamento do espaço na pilha do kernel causa um erro fatal do sistema. Portanto, é melhor para um driver alocar memória de espaço do sistema do que ficar sem espaço na pilha do kernel. No entanto, o pool não paginado também é um recurso limitado do sistema.
Geralmente, a pilha de modo kernel reside na memória, no entanto, ela pode ocasionalmente ser paginada se o thread entrar em um estado de espera que especifique o modo de usuário. Consulte KeSetKernelStackSwapEnable para obter informações sobre como desativar temporariamente a paginação da pilha do kernel para o thread atual. Por motivos de desempenho, não é recomendado desativar a paginação da pilha do kernel globalmente, mas se você quiser fazer isso durante uma sessão de depuração, consulte Desabilitar a paginação de pilhas do kernel
Como a pilha do kernel pode ser paginada, tenha cuidado ao passar buffers baseados em pilha (ou seja, variáveis locais) para DMA ou qualquer rotina que seja executada em DISPATCH_LEVEL ou acima.