Приемы профессиональной работы в UNIX


ПРОТОКОЛ ОПЕРАЦИЙ ВВОДА/ВЫВОДА ТЕРМИНАЛА


Протокол работы терминала представляет собой согласованный набор сигналов, позволяющих системе правильно интерпретировать вводимые с клавиатуры строки. Протокол необходим по четырем причинам. Первой является поддержка входной обработки специальных символов, таких как символы удаления и прекращения работы программы. Во-вторых, нам необходимо поддерживать обработку выводимой информации, например, вставку символов задержки или изменение последовательности возврат каретки/перевод строки. Третьей причиной является поддержка режимов необработанного и "канонического" ввода. Эти два режима позволяют пользовательским программам получать данные или по одному символу, или по одной строке. Последняя причина введения терминального протокола - желание сделать так, чтобы пользователь мог сам изменять параметры конфигурации терминала.

Содержимое терминальной подсистемы показано на рис. 7-2. Рисунок разбит на три части: слева - область пользователя, посредине - область ядра и справа - область устройства. Этот рисунок показывает, как передаются данные между терминалами и программами пользователя.

Рисунок 7-2.
Управление протоколом терминала

Когда какой-либо процесс читает символы с устройства, данные начинают двигаться от буфера драйвера устройства, который называется dbuf. Из этого буфера данные попадают в приемный буфер, управляемый ядром. Приемный буфер читается подпрограммой ядра с именем ttin(), и данные помещаются в структуру clist, называемую необработанной очередью. (Слово "необработанная" означает, что над символами пока что не производилось никакой обработки.) В то же время символы также помещаются в выходную очередь, что позволяет системе выполнять эхо-отображение символов по мере их ввода.

После этого подпрограмма canon() превращает необработанную очередь в каноническую. ("Каноническая" означает применение правил, которые в данный момент установлены системой для выполнения специальных функций над строкой текста, например для обработки символа удаления.) Такая обработка позволяет преобразовать данные перед тем, как их получит процесс пользователя. Последней подпрограммой является ttread(), которая читает символы из канонического буфера в буфер пользовательского процесса в области данных процесса.

Когда символы записываются из процесса пользователя на терминал, они проделывают почти такой же маршрут в обратном направлении: от области процесса к области драйвера устройства. Основное отличие в подпрограмме записи заключается в том, что эти данные проходят на один буфер меньше. От процесса пользователя символы передаются в выходную очередь ядра подпрограммой ttwrite(), а затем в буфер передачи с помощью подпрограммы ttout(). Из буфера передачи они пересылаются непосредственно в приемный буфер драйвера устройства с помощью подпрограммы dzxint().



Содержание раздела