- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •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
Взаимодействие драйверов с компонентами операционной системы и пользовательскими программами
Услуги по доступу к устройству предоставляются операционной системе и пользовательским программам через функции драйвера, но пользовательские программы не могут непосредственно вызывать функции драйвера и получают доступ к ним через системные вызовы. При этом можно выделить три этапа обработки запроса ввода-вывода пользовательской программы: передача запроса драйверу, выполнение запроса драйвером устройства (устройством) и передача результатов выполнения прикладной программе.
На этапе передачи запроса драйверу устройства операционная система выполняет следующие действия:
проверяет корректность параметров, переданных системному вызову;
проверяет полномочия пользовательского процесса на выполнение запрошенной операции;
обеспечивает доступа к пользовательским данным запроса ввода-вывода из системного адресного пространства (например, посредством копирования данных из пользовательского буфера в системный буфер);
в случае необходимости преобразует данные запроса ввода-вывода (например, заменяет символы табуляции на соответствующее число пробелов при выводе текста на печать);
вызывает требуемую функцию драйвера;
блокирует процесс до выполнения запроса и вызывает планировщик для загрузки процессора (в случае синхронного выполнения операции ввода-вывода).
После выполнения запроса ввода-вывода, операционная система передает результат прикладной программе, для чего выполняет следующие действия:
фиксирует прерывание по завершению ввода-вывода от устройства ввода-вывода и вызывает обработчик прерывания драйвера (при асинхронном вводе-выводе);
в случае необходимости преобразует данные, полученные от устройства;
выводит из блокировки процесс, ожидающий завершение ввода-вывода (если ранее он был блокирован);
обеспечивает доступность результатов ввода-вывода в пользовательском адресном пространстве (например, посредством копирования в пользовательский буфер).
Второй этап обработки пользовательского запроса ввода-вывода – выполнение запроса драйвером устройства, требует более детального рассмотрения.
В современных операционных системах драйвер представляет собой стандартный для данной операционной системы набор функций, причем точки входа в эти функции (адреса вызовов функций) заранее известны системе. Операционная система вызывает функции драйвера для выполнения запросов ввода-вывода от пользовательских программ и компонентов самой операционной системы.
Обычно драйвер устройства включает в себя, как минимум, следующие функции:
функцию инициализации драйвера, которая вызывается при загрузке драйвера и передает операционной системе адреса остальных функций драйвера;
функцию обработки прерывания, которая автоматически вызывается всякий раз при возникновении прерывания, связанного с управляемым устройством;
одной или более функций драйвера, осуществляющих пересылку данных и управление устройством;
функцию деинициализации (выгрузки) драйвера, которая вызывается при отключении драйвера без перезапуска операционной системы и освобождает ресурсы, используемые драйвером.
Наличие функций инициализации и деинициализации драйвера позволяет современным операционным системам подключать и отключать внешние устройства и их драйверы по горячему, т.е. без перезапуска операционной системы.
Работа внешних устройств в большинстве случаев не синхронна с ходом выполнения программ в операционной системе. Внешние устройства сигнализируют центральному процессору об изменении своего состояния или о завершении запрошенной операции посредством прерываний, которые обрабатываются специальными функциями в составе драйверов устройств. Так как прерывания от внешних устройств возникают не синхронно с ходом выполнения программ, то компоненты драйверов, выполняющих обработку прерываний, называют асинхронными компонентами драйвера.
С другой стороны, услуги драйверов требуются программам в определенные моменты синхронно с их выполнением. Для получения этих услуг, пользовательские программы явно инициируют системные вызовы, которые, в свою очередь, вызывают соответствующие функции драйверов, которые реализуют синхронные компоненты драйверов устройств.
Таким образом, даже в простейших случаях, драйвер представляет собой совокупность синхронных и асинхронных компонентов, взаимодействующих друг с другом через разделяемые блоки данных, как показано на рис. 1.
Рис.1. Взаимодействие синхронный и асинхронных компонентов драйвера
В многозадачной операционной системе новый запрос к драйверу может поступить до завершения обработки предыдущего запроса. Поэтому в драйвере должна быть реализована очередь запросов. Синхронные функции драйвера должны только ставить запросы в очередь и быстро завершаться, чтобы драйвер был готов принять новые запросы. Синхронные функции обычно не работают с регистрами устройства.
Обслуживанием запросов из очереди занимается стратегическая функция драйвера. Она определяет порядок обслуживания запросов из очереди, реализуя принятую стратегию управления устройством (например, различные стратегии и дисциплины управления дисковым накопителем были рассмотрены в нашем курсе ранее).
Стратегическая функция взаимодействует с устройством, программируя его на выполнение поступивших запросов. При необходимости, стратегическая функция может обмениваться данными с процедурами обработки прерываний через разделяемые переменные в составе драйвера.
Драйвер может также выделить память для использования режима прямого доступа к памяти при работе с большими блоками данных.