Мне было интересно, есть ли в сети какие-либо ресурсы, которые объясняют, что происходит с чем-то вроде printf of C, что объясняет, что происходит на очень низком уровне (вызовы BIOS/ядро)
Понимание аппаратного обеспечения printf
Ответ 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.