Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Олифер. Сетевые операционные системы.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
16.5 Mб
Скачать

Специальные файлы и аппаратные драйверы Специальные файлы как универсальный интерфейс

Понятие «специальный файл» появилось в операционной системе Unix. Специальный файл, называемый также виртуальным, связан с некоторым устройством ввода-вывода и представляет его для остальной части операционной системы и прикладных процессов в виде неструктурированного набора байтов, то есть в виде обычного файла. Однако в отличие от обычного файла, специальный файл не хранит статичные данные, а является интерфейсом к одному из аппа­ратных драйверов ОС.

Использование специальных файлов во многих случаях существенно упрощает программирование операций с внешними устройствами. Со специальным файлом можно работать так же, как с обычным, то есть открывать, считывать из него или же записывать в него определенное количество байтов, а после завершения операции закрывать. Для этого используются привычные многим программистам системные вызовы, применяемые для работы с обычными файлами: open, create, read, write и close. Помимо этих вызовов, имеется несколько системных вызовов, используемых только при работе со специальными файла­ми, например вызов ioctl, с помощью которого можно передать команду контроллеру устройства. Для того чтобы вывести на алфавитно-цифровой терминал, с которым связан специальный файл /dev/tty3, сообщение «Hello, friends!», достаточно открыть этот файл с помощью системного вызова open:

fd = open ("/dev/tty3", 2)

Затем можно вывести сообщение с помощью системного вызова write:

write(fd, "Hello, friends! ", 15)

Для устройств прямого доступа имеет смысл также указатель текущего положения в файле, которым можно управлять с помощью системного вызова lseek.

Очевидно, что представление устройства в виде файла и использование для управления устройством файловых системных вызовов позволяет выполнять только простые операции управления, которые сводятся к передаче в устройство последовательности байтов. Для некоторых устройств такие операции вполне адекватны — в основном это устройства, отображающие строки символов (алфавитно-цифровые терминалы, алфавитно-цифровые принтеры) или принимающие от пользователя строки символов (клавиатура). Форматирование ввода-вывода в устройствах этого класса осуществляется с помощью служебных символов начала кодовой таблицы и их" последовательностей, например для перевода строки и возврата каретки принтера или терминала достаточно к последовательности символов текста добавить восьмеричные коды <12> <15>.

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

Файловый интерфейс доступен пользователю, поэтому прикладной программист может воспользоваться им для создания собственного интерфейса к какому-либо устройству, обходя слои высокоуровневых драйверов, лежащие над аппаратным драйвером данного устройства. Например, если прикладного программиста по какой-то причине не устраивают файловые системы, поддерживаемые некоторой операционной системой, то он может обратиться к диску как к устройству с помощью интерфейса специального файла, который будет вызывать аппаратный драйвер диска, поддерживающий модель диска в виде по­следовательности байтов (рис. 8.1).

Рис. 8.1. Работа с диском как со специальным файлом

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

В Unix специальные файлы традиционно помещаются в каталог /dev, хотя ничто не мешает созданию их в любом каталоге файловой системы. При появлении нового устройства и, соответственно, нового драйвера администратор системы может создать новую запись с помощью Команды mknod. Например, следующая команда создает блок-ориентированный специальный файл для представления третьего раздела на втором диске четвертого SCSI-контроллера: mknod /dev/dsk/scsi b 32 33

Связь специального файла с драйвером устанавливается за счет информации, находящейся в индексном дескрипторе специального файла.

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

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

Адресная информация специального файла состоит из двух элементов:

  • major — номер драйвера;

  • minor — номер устройства.

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

В приведенном ранее примере команды создания специального файла /dev/dsk/scsi аргумент b определяет необходимость создания специального файла для блок-ориентированного драйвера, аргумент 32 задает номер драйвера, который будет вызываться при открытии устройства /dev/dsk/scsi, а аргумент 33 де­кодируется самим драйвером (в нем закодированы данные о том, что нужно управлять третьим разделом на втором, диске четвертого SCSI-контроллера).

ОС Unix использует для хранения информации об установленных аппаратных драйверах две системные таблицы:

  • bdevsw таблица блок-ориентированных драйверов;

  • cdevsw таблица байт-ориентированных драйверов.

Таблицы bdevsw и cdevsw содержат адреса программных секций драйверов, причем одна строка таблицы описывает один драйвер. Такая организация логи-

Номер драйвера (major) является индексом соответствующей таблицы. При открытии специального файла операционная система обнаруживает, что она имеет дело со специальным файлом только после того, как прочитает с диска или найдет в системном буфере его индексный дескриптор. При этом она узна­ет, является ли вызываемый драйвер блок- или байт-ориентированным, после чего использует номер драйвера для обращения к определенной строке одной из двух таблиц: bdevsw или cdevsw (рис. 8.2).

Рис. 8.2. Организация связи ядра Unix с драйверами

ческой связи между ядром Unix и драйверами позволяет легко настраивать систему на новую конфигурацию внешних устройств путем модификации таблиц bdevsw и cdevsw.

Концепция специальных файлов ОС Unix была реализована во многих операционных системах, хотя для связи с драйверами в них часто используются механизмы, отличные от описанного. Так, в ОС семейства Windows NT для связи виртуальных устройств (аналогов специальных файлов) с драйверами задействуется механизм объектов. При этом в объектах-устройствах имеются ссылки на объекты-драйверы, за счет чего при открытии виртуального устройства система находит нужный драйвер.