- •Глава 10. Подсистема управления вводом-выводом
- •10.1 Взаимодействие драйверов с программной и аппаратной средой
- •10.1.1 Конфигурация системы
- •10.1.2 Системные функции и взаимодействие с драйверами
- •1. Просматривается таблица файлов для того, чтобы убедиться в том, что ни
- •2. Если устройство символьного типа, ядро запускает процедуру закрытия уст-
- •Ibm 370 имеется инструкция "Start I/o" (Начать ввод-вывод), которая иниции-
- •10.1.2.4 Стратегический интерфейс
- •10.1.2.5 Ioctl
- •Ioctl(fd,command,arg);
- •10.1.2.6 Другие функции, имеющие отношение к файловой системе
- •10.1.3 Программы обработки прерываний
- •5, Как пользуясь блочным интерфейсом, так и не прибегая к структурированию
- •0, Младший - 21. Файл "/dev/rdsk15" соответствует устройству посимвольного
- •10.3 Терминальные драйверы
- •Ioctl. Когда соответствующие критерии удовлетворены, программа обработки
- •Ioctl для того, чтобы перевести терминал в режим без обработки: он отключает
- •10.3.5 Назначение операторского терминала
- •10.3.6 Драйвер косвенного терминала
- •10.3.7 Вход в систему
- •10.4 Потоки
- •10.4.2 Анализ потоков
10.1.1 Конфигурация системы
Задание конфигурации системы это процедура указания администраторами
значений параметров, с помощью которых производится настройка системы. Неко-
торые из параметров указывают размеры таблиц ядра, таких как таблица процес-
сов, таблица индексов и таблица файлов, а также сколько буферов помещается в
буферном пуле. С помощью других параметров указывается конфигурация устрой-
ств, то есть производятся конкретные указания ядру, какие устройства включа-
ются в данную системную реализацию и их "адрес". Например, в конфигурации
может быть указано, что терминальная плата вставлена в соответствующий разъ-
ем на аппаратной панели.
Существует три стадии, на которых может быть указана конфигурация уст-
ройств. Во-первых, администраторы могут кодировать информацию о конфигурации
в файлах, которые транслируются и компонуются во время построения ядра. Ин-
формация о конфигурации обычно указывается в простом формате, и программа
конфигурации преобразует ее в файл, готовый для трансляции. Во-вторых, адми-
нистраторы могут указывать информацию о конфигурации после того, как система
уже запущена; ядро динамически корректирует внутренние таблицы конфигурации.
Наконец, самоидентифицирующиеся устройства дают ядру возможность узнать, ка-
кие из устройств включены. Ядро считывает аппаратные ключи для самонастрой-
ки. Подробности задания системной конфигурации выходят за пределы этой кни-
ги, однако во всех случаях результатом процедуры задания конфигурации явля-
ется генерация или заполнение таблиц, составляющих основу программ ядра.
Интерфейс "ядро - драйвер" описывается в таблице ключей устройств вво-
да-вывода блоками и в таблице ключей устройств посимвольного ввода-вывода
(Рисунок 10.1). Каждый тип устройства имеет в таблице точки входа, которые
при выполнении системных функций адресуют ядро к соответствующему драйверу.
Функции open и close, вызываемые файлом устройства, "пропускаются" через
таблицы ключей устройств в соответствии с типом файла. Функции mount и
umount так же вызывают выполнение процедур открытия и закрытия устройств, но
для устройств ввода-вывода блоками. Функции read и write, вызываемые устрой-
ствами ввода-вывода блоками и файлами в смонтированных файловых системах,
запускают алгоритмы работы с буферным кешем, инициирующие реализацию страте-
гической процедуры работы с устройствами. Некоторые из драйверов запускают
эту процедуру изнутри из процедур чтения и записи. Более подробно взаимодей-
ствие с каждым драйвером рассматривается в следующем разделе.
Интерфейс "аппаратура - драйвер" состоит из машинно-зависимых управляю-
щих регистров или команд ввода-вывода для управления устройствами и вектора-
ми прерываний: когда происходит прерывание от устройства, система идентифи-
цирует устройство, вызвавшее прерывание, и запускает программу обработки со-
----------------------------------------
(*) И наоборот, системная функция fcntl обеспечивает контроль над действия-
ми, производимыми на уровне дескриптора файла, но не на уровне устройст-
ва. В других реализациях функция ioctl применима для файлов всех типов.
291
ответствующего прерывания. Очевидно, что "программные устройства", такие как
драйвер системы построения профиля ядра (глава 8) не имеют аппаратного ин-
терфейса, однако программы обработки других прерываний могут обращаться к
"обработчику программного прерывания" непосредственно. Например, программа
обработки прерывания по таймеру обращается к программе обработки прерывания
системы построения профиля ядра.
Администраторы устанавливают специальные файлы устройств командой mknod,
в которой указывается тип файла (блочный или символьный), старший и младший
номера устройства. Команда mknod запускает выполнение системной функции с
тем же именем, создающей файл устройства. Например, в командной строке
mknod /dev/tty13 c 2 13
"/dev/tty13" - имя файла устройства, "c" указывает, что тип файла - "сим-
вольный специальный" ("b", соответственно, блочный), "2" - старший номер ус-
тройства, "13" - младший номер устройства. Старший номер устройства показы-
вает его тип, которому соответствует точка входа в таблице ключей устройств,
младший номер устройства - это порядковый номер единицы устройства данного
типа. Если процесс открывает специальный блочный файл с именем "/dev/dsk1" и
кодом 0, ядро запускает программу gdopen в точке 0 таблицы ключей устройств
блочного ввода-вывода (Рисунок 10.2); если процесс читает специальный сим-
вольный файл с именем "/dev/mem" и кодом 3,
Подсистема управления файлами
+------------------------------------------------------------+
| open close |
| open close read write ioctl read write |
| mount umount |
+--+-----+----+-----+-----+------------+-----+-----+-----+---+
| | | | | | | +-+-----+---+
| | | | | | | | функции |
| | | | | | | | работы с |
| | | | | | | | буферным |
| | | | | | | | кешем |
| | | | | | | +-----+-----+
+--+-----+----+-----+-----+-+ ++-----+---------+-----+
| Таблица ключей устройств | | Таблица ключей уст- |
| посимвольного ввода-вывода| | ройств ввода-вывода |
| | | блоками |
+--+-----+----+-----+-----+-+ +--+------+--------+---+
+--+-----+----+-----+-----+-+ +--+------+--------+---+
|open close read write ioctl| Точки | open close strategy|
| | входа | |
| Драйвер | для | Драйвер |
| | драй- | |
|программа обработки преры- | веров | программа обработки |
| ваний от устройства | |прерываний от устройст|
+------------+--------------+ +-----------+----------+
+--------+----------+ +---------+---------+
| Вектор прерывания | | Вектор прерывания |
+--------+----------+ +---------+---------+
+-------------------+----------------+
|
Прерывания от устройств
Рисунок 10.1. Точки входа для драйверов
292
ядро запускает программу mmread в точке 3 таблицы ключей устройств посим-
вольного ввода-вывода. Программа nulldev - это "пустая" программа, использу-
емая в тех случаях, когда отсутствует необходимость в конкретной функции
драйвера. С одним старшим номером устройства может быть связано множество
периферийных устройств; младший номер устройства позволяет отличить их одно
от другого. Не нужно создавать специальные файлы устройств при каждой заг-
рузке системы; их только нужно корректировать, если изменилась конфигурация
системы, например, если к установленной конфигурации были добавлены устройс-
тва.