- •Подсистема ввода/вывода
- •Драйверы устройств
- •Типы драйверов
- •Базовая архитектура драйверов
- •Файловый интерфейс
- •Vnode а также inode физической файловой системы, где расположен специальный файл устройства, и соответствующий ему vnode.
- •Встраивание драйверов в ядро
- •Блочные устройства
- •Символьные устройства
- •Интерфейс доступа низкого уровня
- •Буферизация
- •Архитектура терминального доступа
- •Псевдотерминалы
Архитектура терминального доступа
Алфавитно-цифровой терминал -- последовательное устройство и операционная система производит обмен данными с терминалом через последовательный интерфейс, называемый терминальной линией. терминальной линией в UNIX ассоциирован специальный файл символьного устройства /dev/ttyxx.
Терминальные драйверы выполняют ту же функцию, что и остальные драйверы: управление передачей данных от/на терминалы. Однако терминалы имеют одну особенность, связанную с тем, что они обеспечивают интерфейс пользователя с системой. Обеспечивая интерактивное использование системы UNIX, терминальные драйверы имеют свой внутренний интерфейс с модулями, интерпретирующими ввод и вывод строк. Модуль, отвечающий за такую обработку, называется дисциплиной линии (line discipline).
Существуют два режима терминального ввода/вывода:
1.Канонический режим. В этом режиме ввод с терминала обрабатывается в виде законченных строк.
2.Неканонический режим, при котором ввод не интерпретируется.
В каноническом режиме интерпретаторы строк преобразуют неструктурированные последовательности данных, введенные с клавиатуры, в каноническую форму (то есть в форму, соответствующую тому, что пользователь имел в виду на самом деле) прежде, чем послать эти данные принимающему процессу. Например, программисты работают на клавиатуре терминала довольно быстро, но иногда допускают ошибки. На этот случай имеется клавиша стирания, и пользователь имеет возможность удалять часть введенной строки и вводить коррективы. Драйвер терминала получает всю введенную последовательность, включая и символы стирания. В каноническом режиме модуль дисциплины линии буферизует информацию в строку (набор символов, заканчивающийся символом возврата каретки) и стирает символы в буфере, прежде чем переслать исправленную последовательность считывающему процессу. В таком режиме, например, работает командный интерпретатор shell.
В режиме без обработки строковый интерфейс передает данные между
процессами и терминалом без каких-либо преобразований. Например,
текстовый редактор работает с драйвером в неканоническом режиме, благодаря чему любой символ, введенный пользователем интерпретируется
самим процессом.
В функции модуля дисциплины линии входят:
-
строчный разбор введенных последовательностей.
-
обработка символов стирания.
обработка символов удаления, отменяющих всех предыдущих символов.
-
отображение символов, полученных терминалом
-
расширение выходных данных, например, преобразование символов
табуляции последовательности пробелов.
Предоставление возможности не обрабатывать специальные символы, такие как символы стирания, удаления и возврата каретки.
Существует дополнительная возможность обработки данных, получаемых
И передаваемых устройству — отображение вводимых и выводимых символов
в символы, определенные таблицей отображения. Данную возможность поддерживает утилита mapchan.
Псевдотерминалы
Псевдотерминалы являются специальным устройством, эмулирующим стандартную терминальную линию. Псевдотерминалы напоминаю каналы как средство межпроцессного взаимодействия, позволяющее двум процессам обмениваться данными. Однако в отличие от каналов, псевдотерминалы обеспечивают дополнительную функциональность, специфичную для терминальных линий. Схематически архитектура псевдотерминала представлена на рисунке 5.11
Ярким примером использования псевдотерминалов является регистрация в системе по сети с использованием серверов удаленного доступа rlogin(1) или telnet(1), или использование графического эмулятора терминала xterm в системе X Window System. Когда пользователь регистрируется в системе подобным образом, псевдотерминал эмулирует обычную терминальную линию, поэтому пользователь не видит различия между удаленной и локальной работой с помощью терминала, подключенного по последовательной линии. Например, пользователь может установить различные режимы обработки и использовать соответствующие комбинации клавиш для генерации сигналов, как он это делает в случае обычного терминала.
Псевдотерминал по существу представляет собой два отдельных драйверв. Один из них выглядит как обычный терминальный драйвер и носит название подчиненного устройства (slave). Второй драйвер называется основным (master).
Поскольку подчиненное устройство имеет все характеристики терминала,
процесс может связать свои стандартные потоки ввода, вывода и вывода
ошибок с этим устройством. Однако в отличие от обычного терминала, в
случае которого запись процесса приводит к отображению данных на фи
зическомм устройстве, а ввод данных пользователем с клавиатуры может
быть получен чтением терминальной линии, все данные, записанные в
подчиненное устройство, передаются основному и наоборот — почти так,
как работает канал. Однако модуль дисциплины линии позволяет обеспе-
чить дополнительные возможности этого канала, которые могут потребо-
боваться некоторым приложениям, например, командному интерпретатору
shell.
В качестве иллюстрации использования псевдотерминала, рассмотрим схему работы в режиме командной строки пользователя, находящегося на некоторой удаленной системе в сети.
Польльзователь удаленной системы запускает программу удаленного доступа rlogin(l), которая формирует запрос и передает его по сети на требуемый компьютер. Там этот запрос доставляется серверу удаленного доступа rlogind(l), который (после надлежащей проверки) запускает программу iogin(l). При этом стандартные потоки ввода, вывода и вывода ошибок программы login(l) связываются не с терминальным файлом, как в случае входа в систему с помощью сервера getty(lM), а с подчиненным устройством псевдотерминала. Основное же устройство оказывается связанным с сервером rhgind(l). Программа login(l) запрашивает имя пользователя и его пароль точно так же, как она это делает при входе через getty(lM). Более того, login(l) и "не представляет", что на самом деле работает с эмулятором терминала, а не с традиционной терминальной линией. Весь ввод login(l) поступает серверу rlogind(l) и затем передается по сети клиентской * rtogin(l) на удаленном компьютере. Далее работа ничем не отличается от работы локального пользователя, подключенного к системе с помощью обыкновенного терминала или консоли. Если имя пользователя и пароль были введены правильно, программа login(l) запустит требуемый интерпретатор (login shell), который также не заметит подмены. Действительно, по всем характеристикам терминал будет неотличим от традиционной последовательной линии, включая различные установки и генерацию сигналов при нажатии определенных клавиш клавиатуры. Следует , правда, оговориться, что поскольку псевдотерминал не является “полноценным” терминальным устройством, часть установок для него не имеет смысла (например, скорость передачи, четность и т. д.) и просто игнорируются.
На рисунке 5.12 приведена схема работы удаленного пользователя в системе с
использованием псевдотерминала.