Главная » Статьи » Операционные системы » Общее |
Понятие «специальный файл» появилось в операционной системе
UNIX. Специальный файл, называемый также виртуальным файлом, связан с некоторым
устройством ввода-вывода и представляет его для остальной части операционной
системы и прикладных процессов в виде неструктурированного набора байт, то есть
в виде обычного файла. Однако в отличие от обычного файла специальный файл не
хранит статичные данные, а является интерфейсом к одному из аппаратных
драйверов ОС. Использование специальных файлов во многих случаях
существенно упрощает программирование операций с внешними устройствами. Со
специальным файлом можно работать так же, как и с обычным, то есть открывать,
считывать из него или же записывать в него определенное количество байт, а
после завершения операции закрывать. Для этого используются привычные многим
программистам системные вызовы для работы с обычными файлами: open,
create, read, write и close. Кроме того, имеется несколько системных
вызовов, используемых только при работе со специальными файлами, например вызов
loctl, с помощью которого можно передать команду контроллеру устройства. Для
того чтобы вывести на алфавитно-цифровой терминал, с которым связан специальный
файл /dev/tty3, сообщение «Hello, friendsl», достаточно открыть этот файл с
помощью системного вызова open: fd =open (7dev/tty3", 2) Затем можно вывести сообщение с помощью системного вызова
write: write (fd, "Hello, friends! ", 15) Для устройств прямого доступа имеет смысл также указатель
текущего положения в файле, которым можно управлять с помощью системного вызова
lseek. Очевидно, что представление устройства в виде файла и
использование для управления устройством файловых системных вызовов позволяет
выполнять только простые операции управления, которые сводятся к передаче в
устройство последовательности байт. Для некоторых устройств такие операции
вполне адекватны—в основном это устройства, отображающие строки символов
(алфавитно-цифровые терминалы, алфавитно-цифровые принтеры) или принимающие от
пользователя строки символов (клавиатура). Форматирование ввода-вывода в
устройствах этого класса осуществляется с помощью служебных символов начала
кодовой таблицы и их последовательностей, например для перевода строки и
возврата каретки принтера или терминала достаточно к последовательности
символов текста добавить восьмеричные коды <12> <15>. Для устройств с более сложной организацией информации,
например графических дисплеев, от управляющего интерфейса требуется поддержка
более сложных операций, таких как заполнение цветом области или вывод на экран
основных графических примитивов, и аппаратные драйверы таких устройств их
действительно выполняют. Тем не менее файловый интерфейс, оперирующий только с
неструктурированным потоком байт, оказывается полезным и для устройств со
сложной организацией информации. Такой интерфейс в силу своей простоты и
универсальности дает возможность строить над ним другой, более сложный
интерфейс с произвольной организацией. Файловый интерфейс доступен пользователю, поэтому прикладной
программист может воспользоваться им для создания собственного интерфейса к
какому-либо устройству, обходя лежащие над аппаратным драйвером данного
устройства слои высокоуровневых драйверов. Например, если прикладного
программиста по какой-то причине не устраивают файловые системы, поддерживаемые
некоторой операционной системой, то он может обратиться к диску как к
устройству с помощью интерфейса специального файла, который будет вызывать
аппаратный драйвер диска, поддерживающий модель диска в виде последовательности
байт (рис. 8.1). С помощью такого аппаратного драйвера прикладной программист
может организовать данные в каком-либо разделе диска оригинальным способом,
соответствующим его потребностям. При этом ему не нужно разрабатывать
высокоуровневый драйвер для собственной файловой системы, что является более
сложной задачей по сравнению с разработкой прикладной программы. Рис. 8.1. Работа с диском как со специальным
файлом В UNIX специальные файлы традиционно помещаются в каталог
/dev, хотя ничто не мешает созданию их в любом каталоге файловой системы. При
появлении нового устройства и соответственно нового драйвера администратор
системы может создать новую запись с помощью команды mknod. Например, следующая
команда создает блок-ориентированный специальный файл для представления
третьего раздела на втором диске четвертого SCSI-контроллера: mknod
/dev/dsk/scs1 b 32 33 Связь специального файла с драйвером устанавливается за счет
информации, находящейся в индексном дескрипторе специального файла. Во-первых, в индексном дескрипторе хранится признак того,
что файл является специальным, причем этот признак позволяет различить класс
соответствующего устройству драйвера, то есть он определяет, является ли
драйвер байт-ориентированным или блок-ориентированным. Во-вторых, в индексном дескрипторе хранится адресная
информация, позволяющая выбрать нужный драйвер и нужное устройство. Эта
информация заменяет стандартную адресную информацию обычного файла, состоящую
из номеров блоков файла на диске. Адресная информация специального файла состоит из двух
элементов:
Значение major (номер драйвера) определяет выбор драйвера,
обслуживающего данный специальный файл, а значение minor (номер устройства)
передается драйверу в качестве параметра вызова и указывает ему на одно из
нескольких однотипных устройств, которыми драйвер может управлять. Например,
для дисковых драйверов номер устройства задает не только диск, но и раздел на
диске. В приведенном выше примере команды создания специального
файла /dev/dsk/scsi аргумент b определяет создание специального файла для
блок-ориентированного драйвера, аргумент 32 определяет номер драйвера, который
будет вызываться при открытии устройства /dev/dsk/scsi, а аргумент 33
декодируется самим драйвером (в нем закодированы данные о том, что нужно
управлять третьим разделом на втором диске четвертого SCSI-контроллера). ОС UNIX использует для хранения информации об установленных
аппаратных драйверах две системные таблицы:
Номер драйвера (major) является индексом соответствующей
таблицы. При открытии специального файла операционная система обнаруживает, что
она имеет дело со специальным файлом только после того, как прочитает с диска
или найдет в системном буфере его индексный дескриптор. При этом она узнает,
является ли вызываемый драйвер блок- или байт-ориентированным, после чего
использует номер драйвера для обращения к определенной строке одной из двух
таблиц: bdevsw или cdevsw (рис. 8.2). Таблицы bdevsw и cdevsw содержат адреса программных секций
драйверов, причем одна строка таблицы описывает один драйвер. Такая организация
логической связи между ядром UNIX и драйверами позволяет легко настраивать
систему на новую конфигурацию внешних устройств путем модификации таблиц bdevsw
и cdevsw. Концепция специальных файлов ОС UNIX была реализована во
многих операционных системах, хотя для связи с драйверами в них часто
используются механйзмы, отличные от описанного выше. Так, в OG Windows NT для
связи виртуальных устройств (аналогов специальных файлов) с драйверами
используется механизм объектов. При этом в объектах-устройствах имеются ссылки
на объекты-драйверы, за счет чего при открытии виртуального устройства система
находит нужный драйвер. | |
Просмотров: 1859 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |