Compartir a través de


Uso de la pila de kernels

El tamaño de la pila en modo kernel se limita a aproximadamente tres páginas. Por lo tanto, al pasar datos a rutinas internas, los controladores no pueden pasar grandes cantidades de datos en la pila del kernel.

Para evitar quedarse sin espacio de pila en modo kernel, use las siguientes instrucciones de diseño:

  • Evite realizar llamadas profundamente anidadas de una rutina de controlador interna a otra, si cada rutina pasa datos en la pila del kernel.

  • Asegúrese de limitar el número de llamadas recursivas que se pueden producir si diseña un controlador que tenga una rutina recursiva.

En otras palabras, la estructura de árbol de llamadas de un controlador debe ser relativamente plana. Puede llamar a las rutinas IoGetStackLimits e IoGetRemainingStackSize para determinar el espacio de pila del kernel que está disponible o KeExpandKernelStackAndCallout para expandirlo. Tenga en cuenta que el tamaño de la pila en modo kernel puede variar entre diferentes plataformas de hardware y diferentes versiones del sistema operativo.

Si se agota el espacio de pila del kernel, se produce un error irrecuperable del sistema. Por lo tanto, es mejor que un controlador asigne memoria de espacio del sistema que que se queda sin espacio de pila del kernel. Sin embargo, el grupo no paginado también es un recurso del sistema limitado.

Por lo general, la pila en modo kernel reside en la memoria, pero ocasionalmente se puede paginar si el subproceso entra en un estado de espera que especifica el modo de usuario. Consulte KeSetKernelStackSwapEnable para obtener información sobre cómo deshabilitar temporalmente la paginación de la pila del kernel para el subproceso actual. Por motivos de rendimiento, no se recomienda deshabilitar la paginación de la pila de kernel globalmente, pero si quiere hacerlo durante una sesión de depuración, consulte Deshabilitar la paginación de las pilas de kernel.

Dado que la pila del kernel se puede paginar, tenga cuidado de pasar búferes basados en pila (es decir, variables locales) a DMA o cualquier rutina que se ejecute en DISPATCH_LEVEL o superior.