Как именно printk работает внутри?

10

Я знаю, printfнуждается в помощи от ОС, чтобы сделать свою работу.

Я также знаю, printfчто не работает в исходном коде Linux, так как нет библиотеки. И так у нас printkдля отладки.

Как printkработает, когда ОС еще загружается?

gpuguy
источник

Ответы:

11

Эта ссылка, кажется, содержит ответы на ваши вопросы под названием: Linux Kernel Development Second Edition .

выдержка

printk ()

Функция печати ядра, printk()ведет себя почти идентично printf()функции библиотеки C. Действительно, на протяжении всей этой книги мы не использовали никаких реальных отличий. Для большинства намерений это хорошо; printk()это просто имя отформатированной функции печати ядра. Однако есть некоторые отличия.

Надежность printk ()

Одним из свойств, которое printk()принято считать само собой разумеющимся, является его надежность. printk()Функция вызывается из примерно где - нибудь в ядре в любое время. Его можно вызвать из контекста прерывания или процесса. Его можно вызвать, пока удерживается блокировка. Он может быть вызван одновременно на нескольких процессорах, но для этого не требуется, чтобы вызывающая сторона удерживала блокировку.

Это упругая функция. Это важно, потому что полезность printk()основывается на том факте, что он всегда есть и всегда работает.

Неустойчивость принта ()

Пробоина в доспехах printk()крепости России существует. Его невозможно использовать до определенного момента в процессе загрузки ядра, до инициализации консоли. Действительно, если консоль не инициализирована, куда должен идти вывод?

Обычно это не проблема, если только вы не отлаживаете проблемы в самом начале процесса загрузки (например, в setup_arch()котором выполняется инициализация для конкретной архитектуры). Такая отладка является проблемой с самого начала, и отсутствие какого-либо метода печати только усугубляет проблему.

Есть некоторая надежда, но не много. Хакеры хардкорной архитектуры используют аппаратное обеспечение, которое работает (скажем, последовательный порт), для связи с внешним миром. Поверьте мне, это не весело для большинства людей. В некоторых поддерживаемых архитектурах реализовано правильное решение, однако в других (включая i386) доступны исправления, которые также экономят время.

Решение представляет собой printk()вариант , который может выводить на консоль очень рано в процессе загрузки: early_printk(). Поведение такое же, как printk(), только имя и его способность работать раньше были изменены. Однако это не переносимое решение, поскольку не во всех поддерживаемых архитектурах реализован такой метод. Хотя он может стать вашим лучшим другом, если это так.

Если вам не нужно писать на консоль в самом начале процесса загрузки, вы printk()всегда можете рассчитывать на работу.

SLM
источник
4

Как работает printK, когда ОС еще загружается?

printk()по возможности идет на консоль и приоритет достаточно высокий; Я не уверен, в какой момент ядро ​​инициализирует VT, чтобы сделать это возможным, но это, очевидно, довольно рано.

[src]/kernel/printk/printk.cдовольно хорошо задокументировано. Доступ к консоли, по-видимому, контролируется с помощью семафоров. Сообщение также вводится /dev/dmsgнезависимо от приоритета.

лютик золотистый
источник