Скачал по совету одного местного админа прогу Kanalyze - позволяет просматривать дамп памяти, сохраненный во время крэша с синим экраном смерти (BSOD). Хорошая штуковина, хоть и скачивает с сайта мегасофта библиотеки (хорошо, что сохраняет их у себя ). Нашел много любопытных вещей в дампе. Но - по порядку.
BSOD
Обьявляется у меня в игрухах с хорошей графикой (например, STALKER, Neverwinter Nights 2 и пр) синий экран смерти. Причем обьявляется совершенно произвольно, несистематически. Сначала были подозрения на видяшки. Потом на память. И то, и другое пробовал переставлять местами, втыкать по-разному - не помогает.
Код ошибки: STOP 0x0000000A IRQL_NOT_LESS_OR_EQUAL
Нашел описание этого СТОПа - он возникает, когда какой-то из драйверов ядра пытается обратиться к запрещенной области памяти, пытаясь считать или записать туда данные. В прогах возникает ошибка обращения Access violation... с кодом 0x00000005 (или 0x0000000c? Не помню точно) и прога сдыхает, а в драйверах - вот такой вот BSOD. Там же было указано, что можно найти адрес инструкции, сгенерировавшей BSOD. И начал я отлавливать...
Не буду описывать, как я ловил этот самый BSOD - это увлекательно, но долго. Отловился он в самом неожиданном месте - Сдохла древняя игруха Baldur's Gate. Причем, которые первые. Списал я радостно адрес ошибки и параметры и начал рыться...
Вскрытие
Вообще рытье в описалове BSODа очень ассоциируется с работой патологоанатома. Есть смерть, а я ищу причину. В общем, читал я рылся и дорылся - адрес, по которому была вызвана операция (0x806e4aca), лежит в области, зарезервированной под устройство PCI Bus, т.е. шину передачи данных, обьединяющую разные контроллеры и мост. Обнаружил это с помощью стандартной утилиты msinfo32. Попутно узнал о встроенном средстве тестирования драйверов verifier (не понравился он мне). Теперь передо мной встал вопрос - это глюк памяти, глюк драйвера или глюк материнки?
Битость памяти отпадает - я по-разному втыкал планки и даже пробовал разные, а как сдыхало, так и сдызает.
Чтобы определить, драйвер или материнка - пришлось скатать kanalyze (благо, что я заранее изменил настройки на сохранение полного дампа памяти) и движок дебаггера для этой проги с сайта МелкоМягких: Kernel Memory Space Analyzer Version 8.1 и Microsoft debugger engine Version 6.5.3.8.
Святая святых. Содержимое дампа.
В дампе с самого начала обнаружилось следующее:
1) в системе было 2 дедлока (deadlocks), причем Kanalyze нарисовал даже диаграмму в текстовом виде. В дедлоках сидели всем известные svchost.exe, services.exe и winlogon.exe, находясь в забавном круговом ожидании. Самая изюминка в том, что встречаются петли в виде svchost ожидет svchost. Выглядит забавно, хоть и разные IDшки процессов, а значит, и разные сервисы.
2) распределение памяти в системе Windows XP SP2 для 2 гиг оперативки примерно такое:
Карта памяти
Из этой карты видно, что в ошибка лежит в адресном пространстве, используемом под ядро и загрузочные драйвера. Однако удивляет, что в свойствах PCI Bus значится, что под это устройство выделена память в диапазонах 0x000a0000 - 0x000bffff, 0x80000000 - 0xfe02ffff и 0xfeb00000 - 0xfebfffff. Т.е., как видно и область памяти, где сидит ядро. Естесственно возник вопрос: выделенная в качестве ресурса устройства память является памятью под драйвер или рабочей памятью устройства?
Секох и еще один "железячник" (жду ответов от еще двоих) считают, что это именно рабочая память, т.е. глючит именно мать, а не ПО. Правда, никто не смог дать четкий ответ на поставленный вопрос, т.е. было высказано имхо, так что есть мысль спросить на эту тему своего препода по ОСям. У нее очень большой опыт в этом вопросе, плюс есть у кого спросить в случае незнания. Если, конечно, я не узнаю ответ ранее.
Такие вот делы.
Upd: Есть мысль такая - т.к. не у каждого устройства в ресурсах имеется выделенная память, а драйвер в наличии => память выделяется именно для функционирования девайса. Что подтверждает гипотезу о глючности материнки.