Usando a Pilha de Kernel

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 pilha de kernel.

Para evitar ficar sem espaço de pilha no modo kernel, use as seguintes diretrizes de design:

  • Evite fazer chamadas profundamente aninhadas de uma rotina interna de driver para outra, se cada rotina passar dados na pilha de kernel.

  • Certifique-se de limitar o número de chamadas recursivas que podem ocorrer, se você criar um driver que tenha uma rotina recursiva.

Em outras palavras, a estrutura de árvore de chamada de um driver 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 do modo kernel pode variar entre diferentes plataformas de hardware e diferentes versões do sistema operacional.

Ficar sem espaço de 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 de pilha do kernel. No entanto, o pool nãopagado também é um recurso de sistema limitado.

Geralmente, a pilha do modo kernel reside na memória, no entanto, ela pode ocasionalmente ser paginada se o thread entrar em um estado de espera que especifica o modo de usuário. Consulte KeSetKernelStackSwapEnable para obter informações sobre como desabilitar temporariamente a paginação de pilha de kernel para o thread atual. Por motivos de desempenho, não é recomendável desabilitar a paginação de pilha de kernel globalmente, mas se você quiser fazer isso durante uma sessão de depuração, consulte Desabilitar a paginação de pilhas de kernel

Como a pilha de kernel pode ser paginada, tenha cuidado ao passar buffers baseados em pilha (ou seja, variáveis locais) para o DMA ou qualquer rotina executada em DISPATCH_LEVEL ou superior.