Відповіді:
Здається, ця посилання має відповіді на ваші запитання під назвою: Linux Kernel Development Second Edition .
витяг
printk ()
Функція друку ядра
printk()
, поводиться майже ідентичноprintf()
функції бібліотеки С. Дійсно, протягом всієї цієї книги ми не використовували жодних реальних відмінностей. Для більшості намірів це добре;printk()
це просто назва функції форматування друку у форматі ядра. Однак це має деякі відмінності.Міцність printk ()
Одне властивість
printk()
швидко сприйнятого як належного - це його надійність.printk()
Функція викликається з приблизно де - небудь в ядрі в будь-який час. Його можна викликати з контексту переривання або процесу. Його можна викликати, поки утримується замок. Його можна викликати одночасно на декількох процесорах, але він не вимагає, щоб абонент тримав замок.Це пружна функція. Це важливо, оскільки корисність
printk()
полягає в тому, що він завжди є і завжди працює.Нестійкість printk ()
Шлях у броні
printk()
міцності Росії існує. Він непридатний до певного моменту завантаження ядра до ініціалізації консолі. Дійсно, якщо консоль не ініціалізована, куди повинен піти вихід?Зазвичай це не проблема, якщо ви не налагоджуєте проблеми дуже рано в процесі завантаження (наприклад, в
setup_arch()
, який виконує ініціалізацію, характерну для архітектури). Таке налагодження - це складне завдання для початку, а відсутність будь-якого способу друку лише ускладнює проблему.Є деяка надія, але не багато. Хакери жорсткої архітектури використовують апаратне забезпечення, яке працює (скажімо, послідовний порт) для спілкування із зовнішнім світом. Повірте, це не цікаво для більшості людей. Деякі підтримувані архітектури реалізують здорове рішення, проте інші (включені i386) мають виправлення, які також врятують день.
Рішення являє собою
printk()
варіант , який може виводити на консоль дуже рано в процесі завантаження:early_printk()
. Поведінка така сама, якprintk()
змінюється лише ім'я та його здатність працювати раніше. Однак це не портативне рішення, оскільки не у всіх підтримуваних архітектурах реалізований такий метод. Це, можливо, стане вашим найкращим другом, якщо це станеться.Якщо вам не потрібно писати на консоль дуже рано в процесі завантаження, ви можете розраховувати
printk()
завжди працювати.
Як працює printK, коли ОС все ще завантажується?
printk()
переходить до консолі, якщо можливо, і пріоритет досить високий; Я не впевнений, в який момент ядро ініціалізує VT, щоб зробити це можливо, але це, очевидно, досить рано.
[src]/kernel/printk/printk.c
досить добре задокументований. Здається, доступ до консолі контролюється через семафори. Повідомлення також вводиться /dev/dmsg
, незалежно від пріоритету.