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

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

5 ответов


Linux:

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

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


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

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

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


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

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

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

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


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

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


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

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

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

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