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

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

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

Как работает printk когда ОС по-прежнему загружается?

2 Solutions collect form web for “Как именно printk работает внутри страны?”

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

выдержка

printk ()

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

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

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

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

Непростость printk ()

Щупа в доспехах качества printk() существует. Он недоступен до определенного момента в процессе загрузки ядра, до инициализации консоли. В самом деле, если консоль не инициализирована, куда должен идти выход?

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

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

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

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

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

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

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

  • Является ли "sync" перед drop_caches необходимым?
  • Пакет Virtualbox и GPU: устройство с адресом PCI хоста, уже подключенным к этой виртуальной машине
  • Как получить доступ к физической памяти из пользовательского пространства?
  • Загрузка Centos 7 с пользовательской проблемой ядра
  • Как исправить ошибку make «Нет правила делать« menuconfig »цели при создании ядра для Beagleboard?
  • kdump не создает дамп ядра после загрузки модуля с ошибкой
  • Есть ли патч ядра для предотвращения загрузки файлов в RAM для LiveCD?
  • modinfo, когда модуль был скомпилирован в ядро ​​статически, не работал - обходные пути?
  • Простой Linux для Cyclone V - Arm Cortex A9
  • Входит ли CentOS в семейство System V? Как он считается сравнимым с семейством Unix System V?
  • Загрузите мое ядро ​​в виртуальную машину?
  • Interesting Posts

    Как я могу подать сигнал на задание cron, чтобы пропустить прогоны?

    Модем последовательного порта загорается, но не может связываться

    Свойства команды cat

    Можно ли определить чувствительные к каталогу псевдонимы в zsh (или любой другой оболочке)?

    Как применить этот патч revert commit от git?

    Настройка вторичной среды Vim

    Можно ли получить символ в терминальном курсе, используя escape-коды ANSI?

    Можно ли запустить pacman на жестком диске Antergos Linux из «живого» usb Antergos Linux?

    ddrescue возобновляет операцию спасения в другой файл изображения

    Как ввести дату в качестве опции в команде bash?

    В чем разница между пакетами postgresql и postgresql-9.n?

    sed – как заменить пробел или знак подчеркивания

    Заменить символы в целевом файле Makefile

    Файл открывается автоматически в вкладках

    Вернуть initramfs в более раннее состояние после настройки Dropbear для раннего расшифровки LUKS

    Linux и Unix - лучшая ОС в мире.