Драйверы внешних устройств
|
Когда я на почте служил ямщиком .
Ко мне постучался косматый геолог,
И глядя на карту на белой стене,
он усмехнулся мне.
Г. Самойлов |
Драйвер (driver) представляет
собой специализированный программный модуль, управляющий внешним устройством.
Слово driver происходит от глагола to drive (вести) и переводится с английского
языка как извозчик или шофер: тот, кто ведет транспортное средство. Драйверы
обеспечивают единый интерфейс для доступа к различным устройствам, тем
самым устраняя зависимость пользовательских программ и ядра ОС от особенностей
аппаратуры.
Драйвер не обязательно должен управлять каким-либо физическим устройством.
Многие ОС предоставляют также драйверы виртуальных устройств или псевдоустройств
— объектов, которые ведут себя аналогично устройству ввода-вывода, но
не соответствуют никакому физическому устройству.
В виде псевдоустройств реализуются трубы в системах семейства Unix и почтовые
ящики в VMS. Еще одним примером полезного псевдоустройства являются устройства
/dev/null в Unix и аналогичное ему \DEV\NUL в MS DOS\Windows\OS/2. В современных
системах семейства Unix в виде псевдоустройств, размещенных в псевдофайловой
системе /ргос, реализован доступ к большинству параметров системы -- адресным
пространствам активных процессов, статистике и параметрам настройки ядра,
данным отдельных подсистем, например таблице маршрутизации сетевого протокола
IP.
Прикладные программы, использующие собственные драйверы, не так уж редки
- примерами таких программ могут быть GhostScript (свободно распространяемый
интерпретатор языка PostScript, способный выводить программы на этом языке
на различные устройства, как печатающие, так и экранные) или LATEX,
который также способен печатать на самых разнообразных устройствах. Однако
эта глава посвящена преимущественно драйверам, используемым ядром ОС.
Большинство ОС общего назначения запрещают пользовательским программам
непосредственный доступ к аппаратуре. Это делается для повышения надежности
и обеспечения безопасности в многопользовательских системах. В таких системах
драйверы являются для прикладных программ единственным способом доступа
к внешнему миру.
Еще одна важная функция драйвера- это взаимоисключение доступа к устройству
в средах с вытесняющей многозадачностью. Допускать одновременный неконтролируемый
доступ к устройству нескольких параллельно исполняющихся процессов просто
нельзя, потому что для большинства внешних устройств даже простейшие операции
ввода-вывода не являются атомарными.
Например, в большинстве аппаратных реализаций последовательного порта
RS232 передача байта состоит из четырех шагов: записи значения в регистр
данных, записи команды "передавать" в регистр команды, ожидания
прерывания по концу передачи и проверки успешности передачи путем считывания
статусного регистра устройства. Нарушение последовательности шагов может
приводить к неприятным последствиям — например, перезапись регистра данных
после подачи команды, но до завершения передачи, может привести к остановке
передачи или, что еще хуже, передаче искаженных данных и т. д.
Нельзя также забывать о неприятностях более высокого уровня — например,
смешивании вывода разных процессов на печати или данных — на устройстве
внешней памяти. Поэтому оказывается необходимо связать с каждым внешним
устройством какой-то разграничитель доступа во времени. В современных
ОС эта функция возлагается именно на драйвер. Обычно одна из нитей драйвера
представляет собой процесс-монитор, выполняющий асинхронно поступающие
запросы на доступ к устройству. В Unix, OS/2 и Windows NT/2000/XP этот
процесс называется стратегической функцией. Подробнее этот механизм обсуждается
в разд.
Содержание раздела