Когда ядро испорчено, это означает, что оно находится в состоянии, которое не поддерживается сообществом . Большинство разработчиков ядра игнорируют сообщения об ошибках, связанных с испорченными ядрами, и члены сообщества могут попросить вас исправить условие заражения, прежде чем они смогут приступить к диагностике проблем, связанных с ядром. Кроме того, некоторые функции отладки и вызовы API могут быть отключены, когда ядро испорчено.
В большинстве случаев, связанных с проприетарными драйверами, вы можете спокойно игнорировать состояние повреждения, но некоторые сценарии, приводящие к повреждению ядра, могут указывать на серьезные системные проблемы.
Эта функция предназначена для определения условий, которые могут затруднить правильное устранение проблемы с ядром. Например, загрузка проприетарного модуля может сделать вывод отладочной информации ядра ненадежным, поскольку разработчики ядра не имеют доступа к исходному коду модуля и, следовательно, не могут определить, что модуль, возможно, сделал с ядром. Аналогично, если ядро ранее испытывало состояние ошибки или произошла серьезная аппаратная ошибка, отладочная информация, сгенерированная ядром, может быть ненадежной.
Ядро может стать испорченным по любой из нескольких причин , включая (но не ограничиваясь) следующее:
- Использование проприетарного (или не совместимого с GPL) модуля ядра - это наиболее распространенная причина появления испорченных ядер, которая обычно возникает в результате загрузки проприетарных видеодрайверов NVIDIA или AMD
- Использование промежуточных драйверов, которые являются частью исходного кода ядра, но не полностью протестированы
- Использование модулей вне дерева , которые не включены в исходный код ядра Linux
- Принудительная загрузка или выгрузка модуля ядра (например, принудительная вставка модуля, не созданного для текущей версии ядра)
- Использование SMP (многопроцессорного) ядра на некоторых неподдерживаемых однопроцессорных процессорах, в первую очередь на старых процессорах AMD Athlon
- Перекрытие из ACPI DSDT, иногда требуется для исправления ошибок управления питанием (см здесь для более подробной информации)
- Определенные критические ошибки, такие как исключения проверки компьютера и ошибки ядра
- Некоторые серьёзные ошибки в системной прошивке (BIOS, UEFI), которые должны устраняться ядром
Каждое из этих условий представлено определенным флагом в ядре. Некоторые поставщики Linux, такие как SUSE, добавляют дополнительные флаги заражения, чтобы указать такие условия, как загрузка модуля, который не поддерживается поставщиком.
Более подробная информация доступна в документации ядра . Имеющиеся флаги загрязнения (с _ заменой 'пусто')
- G | P : G, если все загруженные модули имеют GPL или совместимую лицензию, в противном случае был загружен собственный модуль. Модули без MODULE_LICENSE или с MODULE_LICENSE, которые не распознаются insmod как совместимые с GPL, считаются проприетарными.
- F | _ : если какой-либо модуль был принудительно загружен "insmod -f", иначе, если все модули были загружены нормально.
- S | _ : если произошла ошибка в ядре SMP, работающем на оборудовании, которое не было сертифицировано как безопасное для работы многопроцессорной системы. В настоящее время это происходит только на различных атлонах, которые не поддерживают SMP.
- R | _ : если модуль был принудительно выгружен
rmmod -f
, иначе, если все модули были выгружены нормально.
- M | _ : если какой-либо процессор сообщил об исключении проверки компьютера , в противном случае исключений проверки компьютера не произошло.
- B | _ : если функция выпуска страницы обнаружила неверную ссылку на страницу или некоторые неожиданные флаги страницы.
- U | _ : если пользователь или пользовательское приложение специально запросили, чтобы был установлен флаг Tainted.
- D | _ : если ядро недавно умерло, т.е. произошел OOPS или BUG.
- A | _ : если таблица ACPI была переопределена.
- W | _ : если ядром ранее было выдано предупреждение (хотя некоторые предупреждения могут устанавливать более конкретные флаги заражения.)
- C | _ : если загружен промежуточный драйвер.
- I | _ : если ядро работает с серьезной ошибкой в прошивке платформы (BIOS или аналогичная).
- O | _ : если был загружен внешний модуль («вне дерева»).
- E | _ : если неподписанный модуль был загружен в ядро, поддерживающее сигнатуру модуля.
- L | _ : если в системе ранее произошла мягкая блокировка.
- K | _ : если ядро было исправлено.