От стандартного выхода на экран моего ПК
В любом вводном курсе первое, что вы изучаете, - это то, что System.out.println, printf и т. Д. Печатаются в стандартном формате и появляются на вашем экране. Я хотел бы знать все подробные шаги в этом процессе. Короче говоря, я знаю, что участвуют следующие, но я не знаю всех особенностей:
- Системный вызов сделан ядру
- Текст растеризован
- Процессор выполняет программные инструкции (используя разделяемую библиотеку, верно?)
- Драйверы для экрана задействованы
- Процессор взаимодействует с некоторой шиной (PCI? Или PCIe?) На материнской плате
- Шина отправляет данные на экран
У меня есть несколько конкретных вопросов:
- Как компьютер узнает, что на экране отображаются стандартные средства? Что если подключено более одного экрана? Откуда он знает экран с жесткого диска или разъема Ethernet?
- Как видеодрайвер включается в уравнение? Откуда он знает, какой драйвер использовать?
- Как процессор помещает данные на шину? Например, как он узнает, по какому адресу писать? Как этот адрес используется для отправки данных в место записи? Можете ли вы привести некоторые примеры инструкций процессора, которые используются в этом процессе?
Спасибо!
1 ответ
Кроме того, стандартный вывод это просто. Понятие "экран" - это абстракция ОС. Например, в Linux и некоторых других UNIX, ваш процесс связан с TTY или PTY (teletypewriter и psudoteletypewriter), на которые может указывать stdout, но это не обязательно. Stdout может указывать на файл, сеть, что угодно! И вы должны различать настоящий терминал (например, Ctrl-Alt-F1 в Ubuntu) и псевдо-терминал (например, Konsole, CMD, Terminal.app). Когда у вас есть псевдо-терминал, он живет в окне, что делает вещи в 10 раз сложнее. Если у вас есть псевдо-терминал, здесь могут быть шаги (Linux):
- Сделать системный вызов (
write
) записать в FD 0 строку. write
запишет в файл, связанный с FD 0, который, скорее всего, подключен к подчиненному контроллеру вашего PTY. Затем эмулятор терминала (главный контроллер) получает выходные данные.- Он использует какую-то графическую библиотеку (GTK, Qt, SDL, OpenGL и т. Д.) Для визуализации в буфер окна. Именно здесь будут происходить фантазии шрифтов.
- Оконный буфер передается оконному менеджеру и системе X Window, которые рисуют его вместе со всеми остальными окнами и всем остальным.
Что касается видеодрайвера, видеодрайвер используется двумя частями этой системы: X windows и OpenGL. Видеодрайвер устанавливается с помощью файлов конфигурации и обнаружения оборудования, при котором ОС (или BIOS) проверяет систему, чтобы найти все доступное оборудование и загрузить драйверы.
Как процессор помещает данные в шину? (Насколько мне известно, следующее относится к x86 и Linux). Ну, данные должны как-то попасть на видеокарту. Это может произойти несколькими способами. Либо видеокарта отображает некоторую видеопамять в память процессора, либо вы используете порты ввода-вывода x86 (in
а также out
инструкции).
Давайте посмотрим на первую ситуацию. Все видеокарты отображают текстовый видеобуфер по адресу сегмента 0xb800 (а некоторые также отображают где-то 3D-буфер данных, но я не уверен). Так что, если я хочу написать строку "Hello, world"
в буфер видео, вот некоторые x86 ASM:
mov es, B800H ;Set the extra segment to the video buffer
mov ds, cs ;Set the data segment
mov esi, hellomsg ;Set the source index to the hellomsg
mov edi, 0 ;Video buffer offset
mov ecx, [hellolen] ;How many characters
rep movsb ;Copy
;;Data
hellomsg db "Hello, world!" ;Null terminated hello world
hellolen dw 13
Кстати, это ASM уровня драйвера или ОС - для этого требуется доступ к видеобуферу напрямую или, по крайней мере, для отображения видеобуфера в ваше адресное пространство. Другой вариант, порты ввода / вывода, - это когда водитель подключается. Потому что от того, какие порты и что им писать, зависит видеокарта, я не буду приводить пример, но вы можете посмотреть на это.