Что такое куча ядра и почему её порча опасна
Драйверам постоянно нужны маленькие кусочки памяти: под описание пакета, под очередь запросов, под временный буфер. Чтобы не выделять каждый раз целую страницу, ядро держит общую кучу и раздаёт из неё блоки. Перед каждым блоком стоит заголовок с размером и состоянием, а сам диспетчер кучи ведёт списки свободного и занятого. По справке Microsoft, код 0x13A означает, что этот диспетчер обнаружил повреждение в куче.
Первый параметр ошибки уточняет, что именно найдено. Среди вариантов, перечисленных Microsoft, — испорченный заголовок блока, признаки переполнения буфера, когда код записал больше, чем ему выделили, использование блока после освобождения, повторное освобождение одного и того же блока. Почти все эти варианты описывают ошибку программиста: кто-то обращается с памятью неаккуратно. Сам диспетчер кучи при этом не виноват — он похож на кассира, который при пересчёте обнаружил недостачу. Кто взял деньги, он не видел, он лишь честно остановил кассу. Имени нарушителя на синем экране поэтому обычно нет, и искать его приходится косвенно.
Но есть тонкость, из-за которой нельзя сразу обвинять программы. Если планка оперативной памяти искажает отдельные биты, заголовок блока портится без всякого участия драйвера, и диспетчер кучи видит ровно то же самое. Отсюда главный вопрос разбора: одна и та же ли картина повторяется при каждом сбое, и связана ли она с каким-то событием. Повторяемость говорит в пользу программы, хаос — в пользу железа.
