Понимание аппаратного обеспечения printf

Мне было интересно, есть ли в сети какие-либо ресурсы, которые объясняют, что происходит с чем-то вроде printf of C, что объясняет, что происходит на очень низком уровне (вызовы BIOS/ядро)

Ответ 1

Linux:

printf() --- > printf() в библиотеке C --- > write() в библиотеке C --- > write() системный вызов в ядре.

Чтобы понять интерфейс между пространством пользователя и пространством ядра, вам нужно будет узнать, как работают системные вызовы.

Чтобы понять, что происходит на самых низких уровнях, вам необходимо проанализировать исходный код в kernel.

Быстрая ссылка на системный вызов Linux (pdf-ссылка) может быть полезна, поскольку она определяет, где в исходном исходном коде ядра вы можете начать поиск.

Ответ 2

Что-то вроде printf или printf? Это несколько расплывчато.

вывод printf в поток stdout FILE *; то, что связано с ним, зависит от системы и, кроме того, может быть перенаправлено на любое другое устройство потока, для которого ОС предоставляет подходящий драйвер устройства. Я работаю во встроенных системах, и чаще всего stdout по умолчанию направляется на UART для последовательного ввода-вывода - часто это единственное устройство ввода-вывода потока, и его нельзя перенаправить. В ОС графического интерфейса для приложений консольного режима вывод графически отображается в текстовом терминале терминала в окне, в Windows, например, это может включать вызовы GDI или DirectDraw, которые, в свою очередь, обращаются к драйверу устройства видеоустройства. На современной настольной ОС вывод консольного символа не связан с BIOS вообще, кроме начальной начальной загрузки.

Короче говоря, обычно существует огромное количество программного обеспечения между вызовом printf() и оборудованием, на котором оно выводится.

Ответ 3

Это очень специфично для платформы. С аппаратной точки зрения, back-end реализация printf() может быть направлена ​​на последовательный порт, несерийный ЖК-дисплей и т.д. Вы действительно задаете два вопроса:

  • Как printf() интерпретирует аргументы и строку форматирования для генерации правильного вывода?

  • Как вывод получается из printf() на целевое устройство?

Вы должны помнить, что для работы приложения не требуется ОС, ядро ​​и BIOS. Вложенные приложения обычно имеют printf() и другие процедуры ввода-вывода записывают в буфер кольцевых символов. Затем прерывание может опросить этот буфер и манипулировать оборудованием вывода (LCD, последовательный порт, лазерное шоу и т.д.), Чтобы отправить буферный вывод в нужное место назначения.

Ответ 4

По определению, вызовы BIOS и ядра зависят от платформы. На какой платформе вас интересует? Несколько ссылок на информацию, связанную с Linux, уже опубликованы.

Также обратите внимание, что printf может даже не привести к вызовам BIOS или ядра, так как ваша платформа может не иметь ядро ​​или BIOS (встроенные системы - хороший пример этого).

Ответ 5

Хорошее упражнение, хотя было бы довольно сложно было бы проследить вызов через ядро ​​linux. Вы можете DL его на http://www.kernel.org/

Ответ 6

Функция printf() принимает несколько аргументов (функция аргументов переменной длины). Пользователь поставляет строку и вводит аргументы.

Функция printf() создает внутренний буфер для построения выходной строки. Теперь printf() выполняет итерацию по каждому символу пользовательской строки и копирует символ в выходную строку. Printf() останавливается только на "%".

"%" означает, что есть аргумент для преобразования (Аргументы имеют вид char, int, long, float, double или string). Он преобразует его в строку и добавляет в выходной буфер. Если аргумент является строкой, он выполняет строчную копию.

Наконец, printf() может появиться в конце пользовательского укуса и копирует весь буфер в файл stdout.