1

Как драйвер вызывает BSOD? Какой-нибудь реальный опытный пример был бы хорош. Я знаю основные вещи, например, это происходит, когда ОС сталкивается с критической ошибкой, такой как Divide-Fault. То, что я хотел бы знать, - это больше технических деталей, связанных с памятью ядра или поведением ядра, когда он встречает вышеупомянутые ошибки.

3 ответа3

7

Учтите, что нормальный порядок действий ОС, когда она сталкивается с таким классом ошибок, заключается в прекращении процесса, вызывающего обиду.

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

Таким образом, ОС работает лучше всех: сначала она отображает и, возможно, хранит диагностическую информацию, а затем переходит в некое состояние, в котором управление никогда не выходит за пределы определенной части ядра. По сути, система затем останавливается, потому что ничего не будет выполнено до перезагрузки системы. Ядро может выполнять что-то вроде инструкции HLT, вводить бесконечный цикл, отключать входные прерывания, запускать перезагрузку системы или делать все остальное, что подходит.

В зависимости от ОС, разные вещи могут вызвать сбои ядра. Одним из возможных примеров является сбой страницы при выполнении с отключенными прерываниями; Другой - это вызов ядра, который не проходит предварительные условия или проверку работоспособности (например, именно для этого предназначен IRQL_NOT_LESS_OR_EQUAL ). Список вещей, которые могут запускать BSOD в Windows, см., Например, в этом списке кодов ошибок STOP в Windows 2000 на MSDN.

В этом контексте также важно учитывать различия в том, что происходит внутри границы ядра и, следовательно, может привести к фатальному сбою системы, а не просто к сбою одного процесса. Все, что работает вне ядра (или, точнее, в Intel, за пределами кольца 0), может быть ограничено ядром, и это является одной из серьезных причин, например, например, защита межпроцессного процесса и замена памяти даже возможны или практичны (каждый Процесс настроен таким образом, что он может получить доступ только к своей собственной памяти, поддерживаемой процессором, и любое нарушение вызывает ошибку страницы, которая обрабатывается ядром и может привести либо к перезагрузке запрашиваемой страницы из swap, либо к ядро выдает ошибку защиты памяти и завершает процесс, вызывающий ошибку). В ОС с монолитным ядром многие вещи выполняются внутри границы ядра - это часто делается для повышения производительности, так как переключение контекста в ядро и из него обходится особенно дорого, но это накладывает огромную нагрузку на программистов драйверов, чтобы они не винтили up, поскольку любая ошибка (в неподходящее время или когда-либо, в зависимости от класса ошибки) при выполнении в режиме ядра является критичной для системы. Напротив, в микроядерной ОС в кольце 0 (или эквивалент) выполняется только минимальный код - обычно это ограничивается такими вещами, как управление памятью, планирование процессов и некоторые другие вещи, которые требуют такого уровня доступа к полная система - а остальная часть работает в пользовательском режиме и связывается с ядром через четко определенный интерфейс. Это позволяет тем же элементам управления доступом, которые используются для процессов пользовательского пространства, также защищать код, связанный с ядром, и с правильно определенным интерфейсом (например, любой драйвер должен иметь возможность повторно инициализировать соответствующее оборудование при загрузке в работающей системе, даже если драйвер был загружен ранее и аппаратное устройство находится в потенциально неизвестном состоянии), это может работать. Недостатком является то, что переключение этих контекстов в ядро и из него приводит к снижению производительности системы, и это якобы стало одной из главных причин того, что в Windows NT 4.0 (по сравнению с NT 3.x) Microsoft переместила драйверы устройств для выполнения в кольце 0 чем кольцо 3.

1

В отличие от пользовательского режима в ядре все драйверы совместно используют одну и ту же память. Если драйверы совершают неправильные действия (обращаясь к недопустимым ячейкам памяти), они влияют на другие компоненты. Ядро обнаруживает их и ошибки (нет nt!KeBugCheckEx) система для защиты системы и данных от повреждения.

* nix-подобная система делает то же самое в форме паники ядра.

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .