Паника ядра (иногда сокращенно KP [1] ) — это мера безопасности, принимаемая ядром операционной системы при обнаружении внутренней фатальной ошибки , при которой оно либо не может безопасно восстановиться, либо продолжение работы системы будет иметь более высокий риск потери крупных данных. Термин в значительной степени специфичен для Unix и Unix-подобных систем. Эквивалентом в операционных системах Microsoft Windows является ошибка остановки , часто называемая «синим экраном смерти».
Процедуры ядра , которые обрабатывают паники, известные как panic()
в исходном коде Unix, полученном от AT&T и BSD , обычно предназначены для вывода сообщения об ошибке на консоль , выгрузки образа памяти ядра на диск для последующей отладки , а затем либо ожидания ручной перезагрузки системы, либо инициирования автоматической перезагрузки . [2] Предоставляемая информация носит сугубо технический характер и направлена на помощь системному администратору или разработчику программного обеспечения в диагностике проблемы. Паники ядра также могут быть вызваны ошибками, возникающими за пределами пространства ядра . Например, многие операционные системы Unix впадают в панику, если процесс init , который выполняется в пространстве пользователя , завершается. [3] [4]
Ядро Unix поддерживает внутреннюю согласованность и корректность выполнения с помощью утверждений в качестве механизма обнаружения неисправностей . Основное предположение заключается в том, что оборудование и программное обеспечение должны работать правильно, а сбой утверждения приводит к панике , т. е. добровольной остановке всей системной активности. [5] Паника ядра была введена в ранней версии Unix и продемонстрировала существенное различие между философиями проектирования Unix и его предшественника Multics . Разработчик Multics Том ван Флек вспоминает обсуждение этого изменения с разработчиком Unix Деннисом Ритчи :
Я заметил Деннису, что почти половина кода, который я писал в Multics, была кодом восстановления после ошибок. Он сказал: «Мы все это убрали. Если возникает ошибка, у нас есть эта процедура, которая называется panic, и когда она вызывается, машина падает, и вы кричите в коридор: «Эй, перезагрузите ее». [ 6 ]
Первоначальная panic()
функция по сути не изменилась с пятого издания UNIX до UNIX 32V на базе VAX и выводила только сообщение об ошибке без какой-либо другой информации, а затем погружала систему в бесконечный цикл простоя.
Исходный код panic()
функции в V6 UNIX : [7]
/* * В случае, если консоль отключена, * panicstr содержит аргумент для последнего * вызова panic. */ char * panicstr ; /* * Паника вызывается при неразрешимых * фатальных ошибках. * Она синхронизируется, печатает "panic: mesg" и * затем зацикливается. */ panic ( s ) char * s ; { panicstr = s ; update (); printf ( "panic: %s \n " , s ); for (;;) idle (); }
По мере совершенствования кодовой базы Unix была улучшена panic()
и функция вывода на консоль различных форм отладочной информации.
Паника может возникнуть в результате аппаратного сбоя или программной ошибки в операционной системе. Во многих случаях операционная система способна продолжать работу после возникновения ошибки. Если система находится в нестабильном состоянии, вместо того, чтобы рисковать нарушениями безопасности и повреждением данных, операционная система останавливается, чтобы предотвратить дальнейший ущерб, что помогает облегчить диагностику ошибки и может автоматически перезапуститься. [8]
После перекомпиляции двоичного образа ядра из исходного кода , паника ядра при загрузке полученного ядра является распространенной проблемой, если ядро не было правильно настроено, скомпилировано или установлено. [9] Дополнительное оборудование или неисправная оперативная память также могут быть источниками фатальных ошибок ядра во время запуска из-за несовместимости с ОС или отсутствующего драйвера устройства . [10] Ядро также может перейти в состояние, panic()
если оно не может найти корневую файловую систему . [11] На последних этапах инициализации пользовательского пространства ядра паника обычно возникает, если не удается создать init . Паника также может возникнуть, если процесс init завершается, так как в этом случае система становится непригодной для использования. [12]
Ниже представлена реализация окончательной инициализации ядра Linux в kernel_init()
: [13]
static int __ref kernel_init ( void * не используется ) { ... /* * Мы пробуем каждый из этих вариантов, пока один из них не увенчается успехом. * * Оболочку Bourne можно использовать вместо init, если мы * пытаемся восстановить действительно сломанную машину. */ if ( execute_command ) { if ( ! run_init_process ( execute_command )) return 0 ; pr_err ( "Не удалось выполнить %s. Попытка использования значений по умолчанию... \n " , execute_command ); } if ( ! run_init_process ( "/sbin/init" ) || ! run_init_process ( "/etc/init " ) || ! run_init_process ( "/bin/init" ) || ! run_init_process ( "/bin/sh" )) return 0 ; panic ( "Init не найден. Попробуйте передать параметр init= ядру. " "См. Linux Documentation/init.txt для получения инструкций." ); }
Паники ядра возникают в Linux, как и в других Unix-подобных системах; однако серьезные, но не фатальные ошибки могут генерировать другой тип состояния ошибки, известный как kernel oops . [14] В этом случае ядро обычно продолжает работать после завершения процесса- нарушителя . Поскольку oops может привести к тому, что некоторые подсистемы или ресурсы станут недоступными, они могут впоследствии привести к полной панике ядра.
В Linux паника ядра приводит к миганию светодиодов клавиатуры, что является визуальным индикатором критического состояния. [15]
Когда в Mac OS X 10.2–10.7 происходит паника ядра , компьютер отображает многоязычное сообщение, информирующее пользователя о необходимости перезагрузки системы. [16] До версии 10.2 отображалось более традиционное сообщение о панике в стиле Unix; в версии 10.8 и более поздних версиях компьютер автоматически перезагружается, а сообщение отображается только как пропускаемое предупреждение. Формат сообщения варьируется от версии к версии: [17]
Если в течение трех минут после первой произойдет пять новых паник ядра, Mac отобразит запрещающий знак на тридцать секунд, а затем выключится; это известно как «повторяющаяся паника ядра». [18]
Во всех версиях выше 10.2 текст накладывается на символ режима ожидания и не отображается на весь экран. Отладочная информация сохраняется в NVRAM и записывается в файл журнала при перезагрузке. В 10.7 есть функция автоматического перезапуска после паники ядра. В некоторых случаях в 10.2 и более поздних версиях в дополнение к символу режима ожидания может появляться белый текст с описанием ошибки.