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].

0KERN_EMERGАварийное состояние; система вероятно мертва
1KERN_ALERTПроблема, требующая немедленного внимания
2KERN_CRITКритическое состояние
3KERN_ERRОшибка
4KERN_WARNINGПредупреждение
5KERN_NOTICEНормальное, но заслуживающее внимания состояние
6KERN_INFOИнформационное сообщение
7KERN_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].

Рекомендации

  1. ^ а б c d е ж грамм час я j k л м п о п q р «Ведение журнала сообщений с помощью printk - Документация ядра Linux». www.kernel.org. Получено 2020-09-09.
  2. ^ ISO / IEC 9899: 2018. Международная организация по стандартизации. 2018.
  3. ^ а б "kern_levels.h". GitHub. Получено 2020-09-09.
  4. ^ а б c "printk ()". archive.is. 2007-08-30. Получено 2020-09-09.
  5. ^ а б «Как правильно настроить спецификаторы формата printk - документация ядра Linux». www.kernel.org. Получено 2020-09-09.
  6. ^ «Re: ядро ​​Linux и плавающая точка». www.redhat.com. Получено 2020-09-09.
  7. ^ «Основы работы с драйверами - документация по ядру Linux». www.kernel.org. Получено 2020-09-09.

внешняя ссылка