Скачиваний:
21
Добавлен:
09.05.2014
Размер:
354.82 Кб
Скачать

1. Просматривается таблица файлов для того, чтобы убедиться в том, что ни

одному из процессов не требуется, чтобы устройство было открыто. Чтобы

установить, что вызов функции close для устройства является последним,

недостаточно положиться на значение счетчика ссылок в таблице файлов,

поскольку несколько процессов могут обращаться к одному и тому же уст-

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

таточно положиться на значение счетчика в таблице индексов, поскольку

одному и тому же устройству могут соответствовать несколько файлов уст-

ройства. Например, команда ls -l покажет, что одному и тому же устройст-

ву символьного типа ("c" в начале строки) соответствуют два файла уст-

ройства, старший и младший номера у которых (9 и 1) совпадают. Значение

счетчика связей для каждого файла, равное 1, говорит о том, что имеется

два индекса.

crw--w--w- 1 root vis 9, 1 Aug 6 1984 /dev/tty01

crw--w--w- 1 root unix 9, 1 May 3 15:02 /dev/tty01

Если процессы открывают оба файла независимо один от другого, они обра-

тятся к разным индексам одного и того же устройства.

2. Если устройство символьного типа, ядро запускает процедуру закрытия уст-

ройства и возвращает управление в режим задачи. Если устройство блочного

типа, ядро просматривает таблицу результатов монтирования и проверяет,

не располагается ли на устройстве смонтированная файловая система. Если

такая система есть, ядро не сможет запустить процедуру закрытия устройс-

тва, поскольку не был сделан последний вызов функции close для устройст-

ва. Даже если на устройстве нет смонтированной файловой системы, в бу-

ферном кеше еще могут находиться блоки с данными, оставшиеся от смонти-

рованной ранее файловой системы и не переписанные на устройство, пос-

кольку имели пометку "отложенная запись". Поэтому ядро просматривает бу-

ферный кеш в поисках таких блоков и переписывает их на устройство перед

запуском процедуры закрытия устройства. После закрытия устройства ядро

вновь просматривает буферный кеш и делает недействительными все буферы,

которые содержат блоки для только что закрытого устройства, в то же вре-

мя позволяя буферам с актуальной информацией остаться в кеше.

3. Ядро освобождает индекс файла устройства.

Короче говоря, процедура закрытия устройства разрывает связь с устройст-

вом и инициализирует заново информационные структуры драйвера и аппаратную

часть устройства с тем, чтобы ядро могло бы позднее открыть устройство

297

вновь.

10.1.2.3 Read и Writе

Алгоритмы чтения и записи ядром на устройстве похожи на аналогичные ал-

горитмы для файлов обычного типа. Если процесс производит чтение или запись

на устройстве посимвольного ввода-вывода, ядро запускает процедуры read или

write, определяемые типом драйвера. Несмотря на часто встречающиеся ситуа-

ции, когда ядро осуществляет передачу данных непосредственно между адресным

пространством задачи и устройством, драйверы устройств могут буферизовать

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

ных используют символьные списки (раздел 10.3.1). В таких случаях драйвер

устройства выделяет "буфер", копирует данные из пространства задачи при вы-

полнении процедуры write и выводит их из "буфера" на устройство. Процедура

записи, управляемая драйвером, регулирует объем выводимой информации (т.н.

управление потоком данных): если процессы генерируют информацию быстрее, чем

устройство выводит ее, процедура записи приостанавливает выполнение процес-

сов до тех пор, пока устройство не будет готово принять следующую порцию

данных. При чтении драйвер устройства помещает данные, полученные от устрой-

ства, в буфер и

Память

| |

+-----+

160110| CSR | +------+ +---------tty00

| RDB +---------+ dz00 +-+---------tty01

| TDB | +------+ | ...

+-----+ +---------tty07

160120| CSR | +------+ +---------tty08

160122| RDB +---------+ dz01 +-+---------tty09

160126| TDB | +------+ | ...

+-----+ +---------tty15

| |

Рисунок 10.5. Отображение в памяти ввода-вывода с использова-

нием контроллера VAX DZ11

копирует их из буфера в пользовательские адреса, указанные в вызове систем-

ной функции.

Конкретный метод взаимодействия драйвера с устройством определяется осо-

бенностями аппаратуры. Некоторые из машин обеспечивают отображение ввода-вы-

вода в памяти, подразумевающее, что конкретные адреса в адресном пространст-

ве ядра являются не номерами ячеек в физической памяти, а специальными ре-

гистрами, контролирующими соответствующие устройства. Записывая в указанные

регистры управляющие параметры в соответствии со спецификациями аппаратных

средств, драйвер осуществляет управление устройством. Например, контроллер

ввода-вывода для машины VAX-11 содержит специальные регистры для записи ин-

формации о состоянии устройства (регистры контроля и состояния) и для пере-

дачи данных (буферные регистры), которые формируются по специальным адресам

в физической памяти. В частности, терминальный контроллер VAX DZ11 управляет

8 асинхронными линиями терминальной связи (см. [Levy 80], где более подробно

объясняется архитектура машин VAX). Пусть регистр контроля и состояния (CSR)

для конкретного терминала DZ11 имеет адрес 160120, передающий буферный ре-

гистр (TDB) - адрес 120126, а принимающий буферный регистр (RDB) - адрес

160122 (Рисунок 10.5). Для того, чтобы передать символ на терминал

"/dev/tty09", драйвер терминала записывает единицу (1 = 9 по модулю 8) в

298

указанный двоичный разряд регистра контроля и состояния и затем записывает

символ в передающий буферный регистр. Запись в передающий буферный регистр

является передачей данных. Контроллер DZ11 выставляет бит "выполнено" в ре-

гистре контроля и состояния, когда готов принять следующую порцию данных.

Дополнительно драйвер может выставить бит "возможно прерывание передачи" в

регистре контроля и состояния, что заставляет контроллер DZ11 прерывать ра-

боту системы, когда он готов принять следующую порцию данных. Чтение данных

из DZ11 производится аналогично.

На других машинах имеется программируемый ввод-вывод, подразумевающий,

что в машине имеются инструкции по управлению устройствами. Драйверы управ-

ляют устройствами, выполняя соответствующие инструкции. Например, в машине

Соседние файлы в папке материалы к собеседованию