Одно из решений проблемы — вариант функции 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
и поднять уровень при котором сообщения выводятся на консоль. Каждый из вариантов имеет свои положительные и отрицательные стороны — вам решать.Уровни вывода сообщений определены в файле
Буфер сообщений ядра