|
|
|
| Насколько я знаю, для осуществления графического ввода-вывода(например, вывода окна на монитор в Windows) процесс осуществляет вызов соотвествующей функции операционной системы(в Windows GDI), далее GDI перенаправляет данные после обработки и синхронизации с другими приложениями на низкоуровневый драйвер графического устройства(видеодаптера или принтера, например). А как выглядит ввод-вывод на побайтном уровне - например, какие байты принимает принтер, чтобы вывести картинку? И есть ли к принтерам документация, в которой описывается на уровне байт, обмен между принтером и компьютером? | |
|
|
|
|
|
|
|
для: dump
(05.12.2011 в 13:53)
| | >операционной системы(в Windows GDI), далее GDI перенаправляет данные после обработки и
>синхронизации с другими приложениями на низкоуровневый драйвер графического устройства
Да, если это не игра, то процесс так и поступает, если же приложение использует DirectX, то приложение исключает GDI и еще чертову тучу промежуточных библиотек и взаимодействие идет через DirectX, который обращается к драйверам напрямую, фактически монаполизируя устройство.
>А как выглядит ввод-вывод на побайтном уровне - например, какие байты принимает принтер,
>чтобы вывести картинку? И есть ли к принтерам документация, в которой описывается на уровне
>байт, обмен между принтером и компьютером?
Фактически у любого принтера или видео-карты есть память, которую и заполняет через драйвер операционная система или приложение, если в этой памяти что-то есть - принтер печатает, нет - стоит. С видео-памятью посложнее, там обычно используется двойная или тройная буферизация, т.е. пока вам отображается кадр, в другом участке памяти готовится следующий, потом происходит переключение и пока вам показывается новый кадр, на месте старого участка памяти идет подготовка следующего. В GDI от вас это все скрыто, в DirectX вы буферами чуть не в ручную управляете. Принтера управляются через операционную систему, но смысл тот же самый, есть язык PostScript, на котором формируется страница - она записывается в память принтера, он её разбирает печатает, освобождает память. Если у операционной системы есть еще что распечатать, она ему еще пришлет (запишет в память), нет - процесс печати прекратиться. У принтеров памяти что-то в районе 6Мб, у видео-карт уже на гигабайты счет идет... хотя для двойной буферизации монитора 1920x1200 хватило бы и 20Мб (но в неё подтаскиваются текстуры, шейдеры, в общем там сейчас довольно сложно).
PS Раньше, кстати, до Windows, программы могли писать непосредственно в память устройства в обход драйвера (если знали что и как писать). Сейчас так делают в Linux при разработке свободных драйверов, понятно, только базовые свойства устройства, так как редко публикуют все подробности по внутренней работе (опасаются конкурентов). | |
|
|
|
|
|
|
|
для: cheops
(05.12.2011 в 14:11)
| | Ну вот к примеру если в память принтера записать произвольную последовательность байт(среди которых будут и ascii символы), что произойдёт?Ведь принтер же ещё должен ответить компьютеру, об успехе или неудаче печати.... | |
|
|
|
|
|
|
|
для: dump
(05.12.2011 в 16:10)
| | Вообще говоря да, но принтер не обладает зверской интеллектуальностью и операционной системой, если в памяти будет абра-кодабра, он в лучшем случае зависнет, возможно, у драйвера есть алгоритм, что делать в случае если принтер начал дурить, но вряд ли на все случаи жизни. Т.е. сигналы он конечно, посылает и принимает (в том числе об успехе и неудачи), и драйвер их интерпретирует, сообщая операционной системе о состоянии принтера. Однако, вряд ли у него есть механизмы противостояния тому, чтобы в его память были записаны только правильные инструкции - это забота операционной системы не позволять пользователю слишком сильно измываться над устройствами, а действовать через ограничивающие драйверы. Но при должном упорстве возможно все, можно записать абра-кодабру и посмотреть что произойдет... | |
|
|
|