- •Глава 8. Обслуживание ввода-вывода
- •1. Задачи ос по управлению файлами и устройствами
- •1.1. Организация параллельной работы устройств ввода-вывода и процессора
- •1.2. Согласование скоростей обмена и кэширование данных
- •1.3. Разделение устройств и данных между процессами
- •1.4. Обеспечение удобного логического интерфейса между устройствами и остальной частью системы
- •1.5. Поддержка широкого спектра драйверов и простота включения нового драйвера в систему
- •1.6. Динамическая загрузка и выгрузка драйверов
- •1.7. Поддержка нескольких файловых систем
- •1.8. Поддержка синхронных и асинхронных операций ввода-вывода
- •2. Многослойная модель подсистемы ввода-вывода
- •2.1 Общая схема
- •2.2 Менеджер ввода-вывода
- •2.3 Многоуровневые драйверы
- •2.4 Специальные файлы
1.4. Обеспечение удобного логического интерфейса между устройствами и остальной частью системы
Разнообразие устройств ввода-вывода делают особенно актуальной функцию ОС по созданию экранирующего логического интерфейса между периферийными устройствами и приложениями.
Файловая модель периферийных устройств
Практически все современные операционные системы поддерживают в качестве основы такого интерфейса файловую модель периферийных устройств, когда любое устройство выглядит для прикладного программиста последовательным набором байт, с которым можно работать с помощью унифицированных системных вызовов (например, read и write), задавая имя файла-устройства и смещение от начала последовательности байт. Для поддержания такого интерфейса подсистема ввода-вывода должна проделать немалую работу, учитывая разницу в организации операций обмена данными, например, с жестким диском и графическим терминалом.
Привлекательность модели файла-устройства состоит в ее простоте и унифицированности для устройств любого типа, однако во многих случаях для программирования операций ввода-вывода некоторого устройства она является слишком бедной. Поэтому данная модель часто используется только в качестве базиса, над которым подсистема ввода-вывода строит более содержательную модель устройств конкретного типа. Подсистема ввода-вывода предоставляет, как правило, специфический интерфейс для вывода графической информации на дисплей или принтер, для программирования операций сетевого обмена и т. п. При этом разработчик специфического интерфейса всегда может опираться на имеющийся базовый интерфейс.
1.5. Поддержка широкого спектра драйверов и простота включения нового драйвера в систему
Достоинством подсистемы ввода-вывода любой универсальной ОС является наличие разнообразного набора драйверов для наиболее популярных периферийных устройств. Прекрасно спланированная и реализованная операционная система может потерпеть неудачу на рынке только из-за того, что в ее состав не включен достаточный набор драйверов и администраторы и пользователи вынуждены искать нужный им драйвер для имеющегося у них внешнего устройства у производителей оборудования или, что еще хуже, заниматься его разработкой. Именно в такой ситуации оказались пользователи первых версий OS/2, и, возможно, это обстоятельство послужило в свое время не последней причиной сдачи позиций этой неплохой операционной системы, богатой на драйверы ОС Windows.
Чтобы операционная система не испытывала недостатка в драйверах, необходимо наличие четкого, удобного и открытого интерфейса между драйверами и другими компонентами ОС. Такой интерфейс нужен для того, чтобы драйверы писали не только непосредственные разработчики данной операционной системы, но и большая армия программистов по всему миру, в первую очередь – тех предприятий, которые выпускают внешние устройства для компьютеров. Открытость интерфейса драйверов, то есть доступность его описания для независимых разработчиков программного обеспечения (а возможно, также и разработка его на основе согласительных процедур между ведущими коллективами разработчиков), является необходимым условием успешного развития операционной системы.
Драйвер взаимодействует, с одной стороны, с модулями ядра ОС (модулями подсистемы ввода-вывода, модулями системных вызовов, модулями подсистем управления процессами и памятью и т. д.), а с другой стороны – с контроллерами внешних устройств. Поэтому существуют два типа интерфейсов:
интерфейс «драйвер-ядро» (Driver Kernel Interface, DKI). Интерфейс «драйвер-ядро» должен быть стандартизован в любом случае,
интерфейс «драйвер-устройство» (Driver Device Interface, DDI). Интерфейс «драйвер-устройство» имеет смысл стандартизировать тогда, когда подсистема ввода-вывода не разрешает драйверу непосредственно взаимодействовать с аппаратурой контроллера, а выполняет эти операции самостоятельно. Экранирование драйвера от аппаратуры является весьма полезной функцией, так как драйвер в этом случае становится независимым от аппаратной платформы.
Обычно подсистема ввода-вывода поддерживает большое количество системных функций, которые драйвер может вызывать для выполнения некоторых типовых действий. Примерами могут служить операции обмена с регистрами контроллера, ведение буферов для промежуточного хранения данных ввода-вывода, синхронизация работы нескольких драйверов, копирование данных из пользовательского пространства в пространство системы и т. д. Для поддержки процесса разработки драйверов обычно выпускается так называемый пакет DDK (Driver Development Kit), представляющий собой набор соответствующих инструментальных средств – библиотек, компиляторов и отладчиков.