Вопрос или проблема
Если в ядре происходит исключение ЦП, такое как ошибка доступа к памяти или неверная команда, в контексте обслуживания пользовательского процесса (например, системного вызова или страницовой загрузки), или в процессе kthread
, то до того момента, как будет установлено panic_on_oops
, будет выведена полезная информация, и задача просто завершится. Без паники. Иногда система остается полностью работоспособной. Достаточно для пользователя попытаться синхронизировать свои диски, корректно завершить программы и другими способами подготовиться к экстренной перезагрузке.
Но, к сожалению, если исключение происходит в атомарном контексте (например, в прерываниях или softirq), предпринятое действие всегда приводит к Kernel Panic (с описанием "Фатальное исключение в прерывании"
) — независимо от любых настроек или конфигураций при сборке. Это грустно. Почему нельзя симулировать возврат из прерывания и дать системе продолжить работу в надежде, что некоторые части всё еще будут функционировать? Спасибо.
Я знаю, что могу вставить бесконечную mdelay()
в коде при “исключении в прерывании” вместо panic()
, чтобы просто остановить локальный ЦП. Но обычно после этого не так много можно сделать… Даже если в машине сто штук ЦП, вскоре все они блокируются. Поэтому это не очень полезно.
Ответ или решение
Когда происходит исключение в ядре, такое как ошибка доступа к памяти или недопустимая операция, в контексте обслуживания пользовательского процесса (например, при системном вызове или при загрузке страницы), система может продолжать работать. В этом случае, если установлен параметр panic_on_oops
, может быть выдана полезная информация, и процесс может завершиться без полной остановки системы. Однако, если исключение возникает в атомарном контексте, например, в обработчике прерываний или в softirq, это всегда приводит к ядерному панике с сообщением «Фатальное исключение в прерывании».
Причины такого поведения связаны с природой обработки прерываний и гарантией целостности системы. Когда обработчик прерывания активен, система находится в состоянии, когда она ожидает завершения обработки событий и операций, связанных с аппаратными прерываниями. Если в этот момент произойдет исключение, оно может нарушить консистентность состояния, поскольку система не может безопасно освободить ресурсы или завершить текущие операции.
-
Непредсказуемое состояние: Исключения в атомарном контексте могут привести к непредсказуемым состояниям в системе, которые невозможно обработать. Это может вызвать долговременные проблемы, такие как блокировка ресурсов или повреждение данных. Поэтому, для защиты целостности системы, ядро предпочитает завершать работу, вызывая панику.
-
Отсутствие возможности восстановления: В отличие от ситуаций, когда исключение происходит в контексте выполнения процессов, где есть возможность завершить текущие операции и попытаться восстановить систему, при исключении в прерывании это не так просто. В большинстве случаев в таких ситуациях корректное восстановление становится невозможным, и продолжение нормальной работы системы может привести к дальнейшим сбоям и повреждениям.
-
Обработка ошибок: Ядро Linux имеет строгие методы обработки ошибок, направленные на обеспечение надежности системы. В случае исключения в прерывании, действие вывода информации об ошибке и последующий выход из ядра в безопасное состояние (панику) являются частью этого механизма, предоставляя разработчикам и администраторам системы информацию о проблеме и позволяя избежать случайной потери данных или состояния системы.
Таким образом, предпочтение выдачи паники в случае исключений в атомарных контекстах вызвано необходимостью поддержания целостности и надежности системы. Ядро Linux защищает себя от потенциально катастрофических последствий, гарантируя, что при возникновении серьезных ошибок система выйдет в безопасное состояние.