Printk - Printk
printk это C функция от Интерфейс ядра Linux выводит сообщения в журнал ядра[1]. Он принимает строковый параметр, называемый строка формата, который определяет метод для рендеринга произвольного числа параметров с различными типами данных в строку[1]. Затем строка печатается в журнале ядра.[1].
Он обеспечивает printf
-подобная абстракция и ее анализ строки формата и аргументов ведут себя аналогично printf
[1]. Он действует как инструмент отладки для программистов ядра, которым нужна эта функция для регистрации сообщений от ядра.[1].
В printk
прототип функции:
int printk(const char *fmt, ...);
Стандартная библиотека C и это printf
функция недоступна в режиме ядра, поэтому требуется printk
[2].
Отличия от printf
Функция printk
основан на printf
, но не всегда может использоваться так же, как printf
используется[1].
Уровни журнала
printk
позволяет вызываемому объекту указать тип и важность отправляемого сообщения[1]. Этот спецификатор называется уровнем журнала.[1].
Уровень журнала определяет тип сообщения, отправляемого в журнал сообщений ядра.[1]. Уровень журнала указывается добавлением (с помощью C конкатенация строковых литералов ) строка, описывающая уровень журнала до начала создаваемого сообщения[1]. Например, сообщение может быть создано на KERN_INFO
используя следующее:[1]
printk(KERN_INFO "Сообщения п", аргумент);
Строка, определяющая уровень журнала, состоит из ASCII начало символа заголовка, за которым следует цифра, описывающая уровень журнала, или символ 'c', чтобы указать, что сообщение является продолжением предыдущего сообщения[1][3]. Следующие уровни журналов вместе с их интерпретациями приведены ниже.[4].
0 | KERN_EMERG | Аварийное состояние; система вероятно мертва |
1 | KERN_ALERT | Проблема, требующая немедленного внимания |
2 | KERN_CRIT | Критическое состояние |
3 | KERN_ERR | Ошибка |
4 | KERN_WARNING | Предупреждение |
5 | KERN_NOTICE | Нормальное, но заслуживающее внимания состояние |
6 | KERN_INFO | Информационное сообщение |
7 | KERN_DEBUG | Сообщение отладки, как правило, лишнее |
Если уровень журнала не указан, по умолчанию используется уровень журнала. KERN_WARNING
[1], если в самом ядре не установлено другое значение по умолчанию[нужна цитата ].
Уровни журнала определены в <linux/kern_levels.h>
[3]. Какие уровни журнала печатаются, настраивается с помощью sysctl файл / proc / sys / ядро / printk
[1].
Форматы указателя
В %п
спецификатор формата (используется для печати указателей в printf
) расширен, чтобы добавить дополнительные режимы форматирования, например, запрос на печать struct sockaddr *
с помощью % pISpc
напечатает адрес и порт IPv4 / v6 в удобном для человека формате (например, «1.2.3.4:12345» или «[1: 2: 3: 4: 5: 6: 7: 8]: 12345»)[5].
Нет поддержки с плавающей запятой
Пока printf
поддержка вывода чисел с плавающей запятой, printk
не[5], поскольку ядро Linux не использует числа с плавающей запятой внутри ядра[6].
Описание
Функция пытается заблокировать семафор контроль доступа к системной консоли[1][7]. В случае успеха вывод регистрируется и вызываются драйверы консоли.[1]. Если невозможно получить семафор, вывод помещается в буфер журнала, и текущий держатель семафора консоли заметит новый вывод, когда они освободят семафор консоли, и отправит буферизованный вывод на консоль перед освобождением семафора.[1].
Одним из последствий этой отложенной печати является тот код, который вызывает printk
а затем изменяет уровни журнала для печати, может сломаться. Это связано с тем, что уровень журнала для печати проверяется, когда происходит фактическая печать.[1].
Функция printk
может быть вызван из любого места ядра, кроме самых ранних этапов процесса загрузки ядра, когда системная консоль не инициализирована[4]. Альтернативная функция Early_printk
реализован на некоторых архитектурах и используется идентично printk
на ранних этапах процесса загрузки[4].
Рекомендации
- ^ а б c d е ж грамм час я j k л м п о п q р «Ведение журнала сообщений с помощью printk - Документация ядра Linux». www.kernel.org. Получено 2020-09-09.
- ^ ISO / IEC 9899: 2018. Международная организация по стандартизации. 2018.
- ^ а б "kern_levels.h". GitHub. Получено 2020-09-09.
- ^ а б c "printk ()". archive.is. 2007-08-30. Получено 2020-09-09.
- ^ а б «Как правильно настроить спецификаторы формата printk - документация ядра Linux». www.kernel.org. Получено 2020-09-09.
- ^ «Re: ядро Linux и плавающая точка». www.redhat.com. Получено 2020-09-09.
- ^ «Основы работы с драйверами - документация по ядру Linux». www.kernel.org. Получено 2020-09-09.