Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Размер стека режима ядра ограничен примерно тремя страницами. Поэтому при передаче данных во внутренние подпрограммы драйверы не могут передавать большие объемы данных в стеке ядра.
Чтобы избежать простоя стека в режиме ядра, используйте следующие рекомендации по проектированию:
Избегайте глубоко вложенных вызовов из одной внутренней подпрограммы драйвера в другую, если каждая подпрограмма передает данные в стек ядра.
Убедитесь, что вы ограничиваете количество рекурсивных вызовов, которые могут возникать, если вы разрабатываете драйвер с рекурсивной подпрограммой.
Другими словами, структура дерева вызова драйвера должна быть относительно плоской. Вы можете вызвать подпрограммы IoGetStackLimits и IoGetRemainingStackSize , чтобы определить доступное пространство стека ядра или KeExpandKernelStackAndCallout , чтобы развернуть его. Обратите внимание, что размер стека режима ядра может отличаться между различными аппаратными платформами и различными версиями операционной системы.
Исчерпание пространства стека ядра приводит к фатальной системной ошибке. Таким образом, драйверу лучше выделить память в пространстве системного уровня, чем выйти из пространства стека ядра. Однако незамещаемый пул также является ограниченным системным ресурсом.
Как правило, стек режима ядра находится в памяти, однако иногда его можно вывести на страницу, если поток входит в состояние ожидания, указывающее режим пользователя. См. KeSetKernelStackSwapEnable для получения информации о том, как временно отключить пейджинг стека ядра для текущего потока. По соображениям производительности не рекомендуется глобально отключить разбиение по стеку ядра, но если вы хотите сделать это во время сеанса отладки, см. статью "Отключить разбиение по страницам стека ядра"
Так как стек ядра может быть выгружен, будьте осторожны при передаче буферов на основе стека (т. е. локальных переменных) в DMA или любую рутину, которая выполняется на уровне DISPATCH_LEVEL или выше.