Операционная система Windows имеет два основных уровня: уровень ядра и пользовательский уровень. Пользовательский уровень не может непосредственно обращаться к аппаратному обеспечению и ограничен в рамках определенного адресного пространства.

Пользовательский уровень работает режиме 3 (наименьший приоритет). Если программа пользовательского уровня приводит к возникновению ошибки, операционная система Windows завершает выполнение программы и генерирует сообщение об ошибке. Поскольку программа работает в собственном адресном пространстве, оно не будет оказывать влияние на другие программы. В пользовательском режиме работают следующие компоненты:

  • служба регистрации;
  • подсистема безопасности;
  • программа и подсистема Win32;
  • программа и подсистема OS/2;
  • программа и подсистема POSIX.

В архитектуру Windows были внесены некоторые изменения, поскольку процессы режима ядра работают намного быстрее (режим 0). Драйвера видеоадаптеров и печати были переданы из пользовательского режима в режим ядра. Последний является привилегированным режимом центрального процессора и предоставляет непосредственный доступ к оперативной памяти и аппаратному обеспечению компьютера. Ошибки уровне ядра обычно невозможно восстановить, поэтому требуется перезагрузка компьютера.

Синий экран смерти” (BSOD) — это встроенный механизм перехвата ошибок, который используется для остановки работы всех системных, чтобы избежать повреждения системы и данных. Это означает, что драйвер печати или видеоадаптера, содержащий ошибку, может привести к аварийному завершению работы Windows. В режиме ядра работают следующие компоненты:

  • различные диспетчеры, службы управления вводом/выводом данных, объекты, модули безопасности, система IPC (interprocess communication), графическая оболочка, диалоговые окна и виртуальная память;
  • микроядро, которое предоставляет базовые функции операционной системы;
  • уровень аппаратных абстракций (HAL);
  • драйверы устройств.

Тем не менее, что за информация отображается на экране BSOD (или экране STOP)? Далее приводится основная структура информации BSOD. Реальное содержимое окна BSOD зависит от конкретной программной ошибки, поэтому некоторые из описанных разделов могут отсутствовать.

Раздел 1: индикаторы статуса порта отладки DSR CTS SND --------------------------------------------------------------- Раздел 2: информация об ошибке *** STOP: 0x0000000A (0x00000002, 0x00000000, 0xDB30442D) IRQL_NOT_LESS_OR_EQUAL *** Address db30442d has base at db300000 — matrxmil.SYS CPUID: GenuineIntel 5.2.4 irql:if SYSVER 0xF0000565 --------------------------------------------------------------- Раздел 3: информация о драйверах Dll Base DateStmp — Name Dll Base DateStmp — Name 80100000 2cd348a4 — ntoskrnl.exe 80400000 2cd348b2 — hal.dll 80010000 2cd348b5 — ncrc810.sys 80013000 2cda574d — SCSIPORT.SYS и так далее... --------------------------------------------------------------- Раздел 4: сборка ядра и дамп стека Address dword dump Build [1381] — Name xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx — matrxmil.SYS xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx — ntoskrnl.exe xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx — ntoskrnl.exe и так далее... --------------------------------------------------------------- Раздел 5: данные порта отладки Restart and set the recovery options in the system control panel or the /CRASHDEBUG system start option if this message reappears, contact your system administrator or technical support group 

Если система была запущена с параметрами /debug или /crashdebug, то будет использоваться следующее сообщение:

 Kernel Debugger Using: Com2 (Port 0x2f8), Baud Rate 9600) Beginning Dump of physical memory Physical memory dump complete. Contact your system administrator or technical support group 

Раздел 1

Этот раздел отображается только в том случае, если система была запущена с параметрами /debug или /crashdebug. Для определения того, запущен ли системный отладчик, достаточно обратить внимание на меню загрузчика при загрузке Windows. Возле пункта меню запуска Windows будет отображаться строка [debugger enabled]. Для включения режима отладки с помощью параметра /debug необходимо выполнить следующие действия.

1. Поменяйте  атрибуты файла BOOT.INI:

attrib c:\boot.ini - r - s

2. Отредактируйте этот файл и в строку запуска Windows добавьте параметр /debug (для того, чтобы сообщить системе о необходимости загрузки в оперативную память отладчика ядра при загрузке Windows) или /crashdebug (чтобы система загрузила отладчик, однако записала его выходные данные в файле подкачки). Дополнительными параметрами являются /Debugport, сообщающий системе, какой порт COM необходимо использовать (по умолчанию COM2) и /Baudrate — для указания скорости передачи данных (по умолчанию указана скорость 19200 бит/с, но лучше использовать 9600 бит/с). Например:

 [operating systems] multi(0)disk(0)rdisk(0)partition(0)\WINDOWS="Windows NT" /debug /debugport=com3 /baudrate=9600 

3. Сохраните отредактированный файл.

4. Верните прежние атрибуты файла BOOT.INI:

attrib c:\boot.ini +r +s

Трехсимвольные аббревиатуры являются сигналами (например, RTS — это Ready To Send, DSR — Data Send Ready, CTS —Clear To Send, а SND означает, что данные передаются на последовательный порт).

Раздел 2

Этот раздел содержит код ошибки (или код BugCheck) с максимум четырьмя, определенными разработчиком, параметрами (они определяются в вызове функции KeBugCheckEx()). В данном случае код BugCheck имеет значение 0x0000000A IRQL_NOT_LESS_OR_EQUAL. Это означает, что системный процесс пытался получить доступ к выгружаемой памяти на уровне процесса, приоритет которого слишком высок. Обычно такая ошибка вызывается драйвером устройства.

Например, значение BugCheck, равное 0x00000077 или 0x0000007A, означает, что содержимое файла подкачки не может быть загружено в память. Второе шестнадцатеричное значение поможет диагностировать причину возникновения проблемы. Возможные значения приводятся далее.

Значения BugCheck

0xC000009A Ошибка STATUS_INSUFFICIENT_RESOURCES, вызывается недостатком невыгружаемого пула
0xC000009A Ошибка STATUS_DEVICE_DATA_ERROR, обычно вызывается сбойным блоком на жестком диске
0xC000009D Ошибка STATUS_DEVICE_NOT_CONNECTED, вызывается испорченным, неплотно прилегающим кабелем или терминатором; может вызываться тем, что контроллер не обнаруживает диск
0xC000016A Ошибка STATUS_DISK_OPERATION_FAILED, вызывается сбойным блоком на диске
0xC0000185 Ошибка STATUS_IO_DEVICE_ERROR, вызывается неправильной установкой терминаторов или кабелей на устройствах SCSI

Раздел 3

В этом разделе перечислены все драйвера, которые были загружены в момент аварийного завершения работы. Раздел разделен на две области, в каждой из который указывается три столбца. Первый столбец является временным штампом (в секундах с 1-го января 1970 гг.). Это значение может быть преобразовано в действительное время с помощью утилиты CVTIME.EXE (в свое время в операционной системе VMS для этого использовалась утилита f$cvtime).

Раздел 4

Этот раздел содержит информацию о номере сборки операционной системы и дамп стека, включающий в себя адреса, используемые поврежденным модулем. В верхних строках может содержаться информация о сбойном драйвере или коде, однако не всегда, поскольку обработчики ловушки ядра могут выполняться в последнюю очередь для сохранения информации об ошибке.

Раздел 5

Содержимое раздела зависит от наличия параметра /debug. Впрочем, в разделе содержится лишь информация о необходимости обращения к администратору/службе поддержки и о том, создан ли файл .DMP.