Как стать автором
Обновить

Маленькая, но очень коварная засада с программированием в kernelspace-е в ОС MS Windows

Время на прочтение1 мин
Количество просмотров3.7K
На днях отлаживал драйвер, при использовании которого возникали хаотические и, на первый взгляд, какие-то магические BSoD-ы. Все вызовы функций были правильные, никаких ошибок с нулевыми указателями и прочего распространенного гемороя не наблюдалось. Так и не поняв, что же могло случиться с этим драйвером я попросил более опытного коллегу посмотреть что же не так. Через несколько часов он сказал, что понял в чем причина бага. Результат обескуражил нас обоих.

Оказалось, что причина падений банальна проста: в логике драйвера активно использовался стек, нередко функция использовала 10 — 20 кб памяти на стеке под различного рода буфферы и массивы. MSDN говорит, что стек ядра ограничен тремя страницами памяти (что для 32-х битной архитектуры составляет порядка 12кб), в связи с чем лучше воздержаться от множественных вызовов функций и использования рекурсии.
Ошибка переполнения стека ядра вызывает так называемый Double Fault, т.е. процессор пытается сообщить о переполнении стека и положить структуру, содержащую сведения об этой ошибке на уже переполненный стек, таким образом возникает еще одна ошибка и ядру не остается ничего кроме как «умереть в мучениях» (сведения об этом взяты отсюда).
Также, использую функцию IoGetRemainingStackSize мы поняли, что до нашего фильтр-драйвера доходит только 5 — 6 кб памяти на стеке, а следовательно, если в систему будет загружен не один фильтр-драйвер, а несколько, то вероятность сбоев и BSoD-ов сильно возрастет.
Итак, если в вашем драйвере наблюдаются какие-то странные BSoD-ы, проверьте, может быть это из-за недостатка памяти на стеке, и не повторяйте мои ошибки.
Теги:
Хабы:
Всего голосов 71: ↑64 и ↓7+57
Комментарии101

Публикации

Истории

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань