Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000377.doc
Скачиваний:
29
Добавлен:
30.04.2022
Размер:
2.52 Mб
Скачать

Терминальный драйвер

Терминал является одним из наиболее важных внешних устройств, через него осуществляется интерактивное взаимодействие системы с пользователем. Поэтому рассмотрим архитектуру терминального драйвера более внимательно.

Алфавитно-цифровой терминал является последовательным устройством ввода-вывода. Каждому терминалу ставится в соответствие специальный файл устройства /dev/ttyNN и для управления терминалом требуется символьный драйвер.

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

Структура терминального драйвера показана на рис. .8.

Для получения кодов символов, набранных на клавиатуре, процесс читает специальный файл устройства dev/ttyNN с помощью системного вызова read.

Ядро распознает запрос, адресованный специальному файлу устройства, и вызывает через коммутатор символьных устройств функцию read терминального драйвера, предав ей адрес буфера для размещения кодов нажатых клавиш.

Рис.8 Структура терминального драйвера.

Терминальный драйвер UNIX системы может работать в двух режимах: каноническом и неканоническом. От выбранного режима зависит последовательность кодов клавиш, возвращаемая процессу, которая может различаться даже при одной и той же последовательности нажатий клавиш на клавиатуре.

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

В неканоническом режиме процесс получает сырые (raw) коды из низкоуровневой очереди, и сам интерпретирует их в соответствии со своей программой.

В неканоническом режиме работают такие приложения, как текстовые редакторы или игровые программы.

Однако, большинству консольных программ не нужны сырые коды нажатых клавиш. Эти программы должны получать текстовую строку в том виде, в каком она была видна на мониторе при ее вводе. Пользователь может ошибиться при работе на клавиатуре и использовать клавишу забой для удаления неверно введенного символа, может использовать клавиши перемещения курсора для выбора позиции ввода, может заменять введенные символы другими и т.п. Когда пользователь завершает набор текста, он нажимает клавишу <ввод> для передачи введенной строки программе.

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

В каноническом режиме работают командные интерпретаторы. Стандартный текстовый ввод в программах через поток стандартного ввода (stdin) также реализуется в каноническом режиме.

Коды символов для вывода на монитор передаются терминальному драйверу с использованием системного вызова write.

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