Понимание аппаратного обеспечения printf - PullRequest
12 голосов
/ 16 марта 2010

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

Ответы [ 5 ]

27 голосов
/ 16 марта 2010

Linux:

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

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

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

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

4 голосов
/ 16 марта 2010

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

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

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

1 голос
/ 16 марта 2010

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

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

1 голос
/ 16 марта 2010

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

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

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

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

0 голосов
/ 13 марта 2017

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

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

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

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

...