Одно из решений проблемы — вариант функции printk()
, который может выводить информацию на консоль на очень ранних стадиях процесса загрузки — early_printk()
. Поведение этой функции аналогично функции printk()
, за исключением имени и возможности работать на очень ранних стадиях загрузки. Однако, такое решение не переносимо, потому что не для всех поддерживаемых аппаратных платформ этот метод работы реализован. Если же он есть, то может сослужить хорошую службу.
Кроме ситуаций, когда необходимо выводить на консоль информацию на очень ранних стадиях загрузки системы, можно положиться на функцию printk()
, которая работает практически всегда.
Уровни вывода сообщений ядра
Главное отличие между функциями printk()
и printf()
— это возможность в первой указывать
printk(KERN_WARNING "Это предупреждение!\n");
printk(KERN_DEBUG "Это отладочное сообщение!\n");
printk("Мы не указали значения loglevel!\n");
Строки KERN_WARNING
и KERN_DEBUG
определены через препроцессор в заголовочном файле
. Эти макросы раскрываются в строки, соответственно "<4>"
и "<7>"
, которые объединяются со строкой формата в самом начале сообщения, выводимого функцией printk()
. После этого на основании уровня вывода сообщения и уровня вывода консоли (значение переменной console_loglevel
) ядро принимает решение выводить информацию на консоль или нет. В табл. 18.1 приведен полный список возможных значений уровня вывода сообщений.
Таблица 18.1. Доступные значения уровня вывода сообщений ядра (loglevel)
Значение loglevel | Описание |
---|---|
KERN_EMERG | Аварийная ситуация |
KERN_ALERT | Проблема, на которую требуется немедленно обратить внимание |
KERN_CRIT | Критическая ситуация |
KERN_ERR | Ошибка |
KERN_WARNING | Предупреждение |
KERN_NOTICE | Обычная ситуация, но на которую следует обратить внимание |
KERN_INFO | Информационное сообщение |
KERN_DEBUG | Отладочное сообщение — обычно избыточная информация |
Если уровень вывода сообщений ядра не указан, то его значение по умолчанию равно DEFAULT_MESSAGE_LOGLEVEL
, который в данный момент равен KERN_WARNING
. Так как это значение может измениться, то для своих сообщений необходимо всегда указывать уровень вывода.
Наиболее важный уровень вывода — KERN_EMERG
определен как "<0>"
, а наименее важный — KERN_DEBUG
, как "<7>"
. Например, после обработки препроцессором кода из предыдущего примера получается следующее.
printk("<4>Это предупреждение!\n");
printk("<7>Это отладочное сообщение!\n");
printk("<4>Мы не указали значения loglevel!\n");
Как вы будете использовать функцию printk()
зависит только от вас. Конечно, обычные сообщения, которые должны быть видимы, должны иметь соответствующий уровень вывода. Отладочные сообщения, которые в большом количестве встраиваются в самые разные места кода с целью разобраться с проблемой — "допустим ошибка здесь", "пробуем", "работает" — могут иметь любой уровень вывода. Один вариант — оставить уровень при котором сообщения выводятся на консоль равным значению этого параметра по умолчанию, а уровень вывода ваших сообщений установить в значение KERN_CRIT
, или что-то около этого. Можно поступить и наоборот — для отладочных сообщений установить уровень KERN_DEBUG
и поднять уровень при котором сообщения выводятся на консоль. Каждый из вариантов имеет свои положительные и отрицательные стороны — вам решать.
Уровни вывода сообщений определены в файле
.
Буфер сообщений ядра