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

Стек обработки запросов ввода-вывода

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

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

Рис.2. Стек обработки запросов ввода-вывода

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

Перед драйвером дискового тома и после него в стек обработки запросов ввода-вывода могут быть встроены один или более виртуальных устройств – фильтров. Фильтры могут реализовать дополнительную обработку данных, например, шифрацию, архивацию, проверку целостности данных и т.п.

  1. Основы организации и работы подсистемы ввода-вывода unix

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

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

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

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

В UNIX-системах определено два типа устройств: блочные устройства и символьные устройства, соответственно, различаются и типы файлов устройств.

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

Символьные устройства ведут ввод-вывод непрерывным неформатированным потоком байтов. Эти байты могут передаваться в устройство и приниматься из него только последовательно – невозможно адресовать конкретный байт или группу байтов. После считывания данные удаляются из устройства. Типичным примером символьного устройства является клавиатура.

Специальные файлы устройств в UNIX создаются с помощью команды mknod:

mknod имя_файла <c,b> major minor

Здесь c или b – код символьного или блочного устройства, major и minor – старший и младший номера устройства соответственно. Назначение и использование номеров устройства будет рассмотрено в дальнейшем.

Чтобы получить файловый дескриптор для доступа к внешнему устройству, процесс должен просто открыть специальный файл устройства, ассоциированный с требуемым устройством. Затем процесс может взаимодействовать с этим устройством, выполняя обычные операции чтения или записи файла с использованием полученного файлового дескриптора. Внешне все выглядит так, как будто процесс просто читает или записывает данные специального файла.

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

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