- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •1.1. Взаимодействие процессора с внешними устройствами
- •1.2. Прямой доступ к памяти
- •Драйверы
- •Роль драйверов в операционной системе
- •Взаимодействие драйверов с компонентами операционной системы и пользовательскими программами
- •Стек обработки запросов ввода-вывода
- •Основы организации и работы подсистемы ввода-вывода unix
- •2.1. Драйверы в операционных системах семейства unix
- •Стратегическая функция драйвера блочного устройства
- •Функция обработки прерывания
- •Функция опроса устройства
- •Другие функции драйверов
- •Буферизация в символьных драйверах
- •Терминальный драйвер
- •2.2. Потоковая подсистема ввода-вывода в unix
- •Архитектура и принципы работы подсистемы streams
- •Архитектура и работа модулей потока
- •Функция модуля put
- •Функция модуля service
- •Структура сообщения
- •Основы организации и работы подсистемы ввода-вывода windows
- •3.1. Классификаций драйверов Windows
- •Драйверы пользовательского режима
- •Драйверы режима ядра
- •3.2. Объекты подсистемы ввода-вывода
- •Объект файл
- •Объект устройство
- •Объект драйвер
- •Объект пакет запроса ввода-вывода
- •Объект блок стека запросов ввода-вывода
- •3.3. Передача данных между пользовательским адресным пространством и пространством ядра
- •Буферизированный ввод-вывод
- •Прямой ввод-вывод
- •Ввод-вывод под управлением драйвера
- •3.4. Обработка запросов ввода-вывода
- •Прохождение запроса ввода-вывода вниз через стек обработки запросов ввода-вывода
- •Обработка прерывания по завершению ввода-вывода
- •Обратное прохождение запроса ввода-вывода вверх через стек запросов ввода-вывода
- •3.5. Буферизация запросов ввода-вывода
- •Системная очередь запросов
- •Очереди запросов под управлением драйвера
- •3.6. Диспетчер Plug-And-Play, установка и запуск драйверов
- •3.7. Диспетчер электропитания
- •3.8. Среда сетевых драйверов ndis
- •Драйверы среды ndis Минипорт-драйверы сетевых адаптеров
- •Драйверы протоколов
- •Промежуточные драйверы
- •Структура ndis пакета
- •Запросы к сетевым адаптерам
- •3.9. Порты завершения ввода-вывода
- •Заключение
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
Терминальный драйвер
Терминал является одним из наиболее важных внешних устройств, через него осуществляется интерактивное взаимодействие системы с пользователем. Поэтому рассмотрим архитектуру терминального драйвера более внимательно.
Алфавитно-цифровой терминал является последовательным устройством ввода-вывода. Каждому терминалу ставится в соответствие специальный файл устройства /dev/ttyNN и для управления терминалом требуется символьный драйвер.
Однако терминал является специфическим устройством, предназначенным для взаимодействия с оператором-человеком. Терминал используется практически всеми программами в системе, при этом драйвер терминала выполняет дополнительную обработку проходящего через него байтового потока ввода-вывода.
Структура терминального драйвера показана на рис. .8.
Для получения кодов символов, набранных на клавиатуре, процесс читает специальный файл устройства dev/ttyNN с помощью системного вызова read.
Ядро распознает запрос, адресованный специальному файлу устройства, и вызывает через коммутатор символьных устройств функцию read терминального драйвера, предав ей адрес буфера для размещения кодов нажатых клавиш.
Рис.8 Структура терминального драйвера.
Терминальный драйвер UNIX системы может работать в двух режимах: каноническом и неканоническом. От выбранного режима зависит последовательность кодов клавиш, возвращаемая процессу, которая может различаться даже при одной и той же последовательности нажатий клавиш на клавиатуре.
Клавиатура вырабатывает прерывание при каждом нажатии на клавишу, и функция обработки прерывания в составе драйвера сохраняет все полученные коды в очереди низкого уровня. При этом очередь низкого уровня хранит все коды, в том числе и управляющие, такие как забой, стрелки перемещения курсора и т.п.
В неканоническом режиме процесс получает сырые (raw) коды из низкоуровневой очереди, и сам интерпретирует их в соответствии со своей программой.
В неканоническом режиме работают такие приложения, как текстовые редакторы или игровые программы.
Однако, большинству консольных программ не нужны сырые коды нажатых клавиш. Эти программы должны получать текстовую строку в том виде, в каком она была видна на мониторе при ее вводе. Пользователь может ошибиться при работе на клавиатуре и использовать клавишу забой для удаления неверно введенного символа, может использовать клавиши перемещения курсора для выбора позиции ввода, может заменять введенные символы другими и т.п. Когда пользователь завершает набор текста, он нажимает клавишу <ввод> для передачи введенной строки программе.
В каноническом режиме драйвер терминала после завершения ввода формирует из сырых символов, извлекаемых из очереди низкого уровня, окончательную строку в соответствии с принятым правилом обработки ввода (дисциплиной терминала). При этом анализируются коды стирания символа и перемещения курсора, в соответствии с которыми удаляются стертые символы и переупорядочиваются оставшиеся, и полученная строка символов помещается в очередь высокого уровня драйвера терминала (каноническую очередь), из которой введенные строки символов передаются программам по их запросам.
В каноническом режиме работают командные интерпретаторы. Стандартный текстовый ввод в программах через поток стандартного ввода (stdin) также реализуется в каноническом режиме.
Коды символов для вывода на монитор передаются терминальному драйверу с использованием системного вызова write.
Для того, чтобы набранные на клавиатуре символы сразу же отображались на мониторе, терминальный драйвер поддерживает режим эхопечати, когда код введенного символа сразу же, внутри драйвера, передается в очередь вывода.