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

10.1.3 Программы обработки прерываний

Как уже говорилось выше (раздел 6.4.1), возникновение прерывания побуж-

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

рой лежит соотношение между устройством, вызвавшим прерывание, и смещением в

таблице векторов прерываний. Ядро запускает программу обработки прерываний

для данного типа устройства, передавая ей номер устройства или другие пара-

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

вание. Например, в таблице векторов прерываний на Рисунке 10.6 показаны две

точки входа для обработки прерываний от терминалов ("ttyintr"), каждая из

которых используется для обработки прерываний, поступивших от 8 терминалов.

Если устройство tty09 прервало работу системы, система вызывает программу

обработки прерывания, ассоциированную с местом аппаратного подключения уст-

ройства. Поскольку с одной записью в таблице векторов прерываний может быть

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

устройство, вызвавшее прерывание. На рисунке записи в таблице векторов пре-

рываний, соответствующие прерываниям от терминалов, имеют метки 0 и 1, чтобы

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

используя к примеру этот номер в качестве передаваемого программе параметра.

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

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

устройство tty09, а не tty12, прервало работу системы. Этот пример в упро-

щенном виде показывает то, что имеет место в реальных системах, где на самом

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

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

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

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

ший номер в файле устройства идентифицирует устройство для ядра. Драйвер ус-

тройства устанавливает соответствие между младшим номером устройства и номе-

ром единицы аппаратуры.

10.2 ДИСКОВЫЕ ДРАЙВЕРЫ

Так сложилось исторически, что дисковые устройства в системах UNIX раз-

бивались на разделы, содержащие различные файловые системы, что означало

301

"деление [дискового] пакета на несколько управляемых по-своему частей" (см.

[System V 84b]). Например, если на диске располагаются четыре файловые сис-

темы, администратор может оставить одну из них несмонтированной, одну смон-

тировать только для чтения, а две других только для записи. Несмотря на то,

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

зователи не могут ни обращаться к файлам немонтированной файловой системы,

используя методы доступа, описанные в главах 4 и 5, ни записывать файлы в

файловые системы, смонтированные только для чтения. Более того, так как каж-

дый раздел (и, следовательно, файловая система) занимает на диске смежные

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

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

Дисковый драйвер транслирует адрес файловой системы, состоящий из логи-

ческого номера устройства и номера блока, в точный номер дискового сектора.

Драйвер получает адрес одним из следующих путей: либо стратегическая проце-

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

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

(младший) номер устройства в качестве параметра; они преобразуют адрес сме-

щения в байтах, хранящийся в пространстве задачи, в адрес соответствующего

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

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

внутренним таблицам для поиска сектора, отмечающего начало раздела на диске.

Наконец, он добавляет номер блока в файловой системе к номеру блока, с кото-

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

для ввода-вывода.

+---------------------------------------------+

| Раздел Начальный блок Длина в блоках |

| |

| Размер блока = 512 байт |

| |

| 0 0 64000 |

| 1 64000 944000 |

| 2 168000 840000 |

| 3 336000 672000 |

| 4 504000 504000 |

| 5 672000 336000 |

| 6 840000 168000 |

| 7 0 1008000 |

+---------------------------------------------+

Рисунок 10.7. Разделы на диске RP07

Исторически сложилось так, что размеры дисковых разделов устанавливаются

в зависимости от типа диска. Например, диск DEC RP07 разбит на разделы, ха-

рактеристика которых приведена на Рисунке 10.7. Предположим, что файлы

"/dev/dsk0", "/dev/dsk1", "/dev/dsk2" и "/dev/dsk3" соответствуют разделам

диска RP07, имеющим номера от 0 до 3, и имеют аналогичные младшие номера.

Пусть размер логического блока в файловой системе совпадает с размером дис-

кового блока. Если ядро пытается обратиться к блоку с номером 940 в файловой

системе, хранящейся в "/dev/dsk3", дисковый драйвер переадресует запрос к

блоку с номером 336940 (раздел 3 начинается с блока, имеющего номер 336000;

336000 + 940 = 336940) на диске.

Размеры разделов на диске варьируются и администраторы располагают фай-

ловые системы в разделах соответствующего размера: большие файловые системы

попадают в разделы большего размера и т. д. Разделы на диске могут перекры-

ваться. Например, разделы 0 и 1 на диске RP07 не пересекаются, но вместе они

занимают блоки с номерами от 0 до 1008000, то есть весь диск. Раздел 7 так

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

302

ловые системы, хранящиеся в разделах, размещаются таким образом, что между

ними нет пересечений. Иметь один раздел, включающий в себя все дисковое

пространство, выгодно, поскольку весь том можно быстро скопировать.

Использование разделов фиксированного состава и размера ограничивает

гибкость дисковой конфигурации. Информацию о разделах в закодированном виде

не следует включать в дисковый драйвер, но нужно поместить в таблицу содер-

жимого дискового тома. Однако, найти общее место на всех дисках для размеще-

ния таблицы содержимого дискового тома и сохранить тем самым совместимость с

предыдущими версиями системы довольно трудно. В существующих реализациях

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

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

самое подходящее место для таблицы содержимого тома. И все же дисковый драй-

вер должен иметь закодированную информацию о месте расположения таблицы со-

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

делов переменного размера.

В связи с тем, что для системы UNIX является типичным высокий уровень

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

тем, чтобы обеспечить наилучшую производительность всей системы. Новейшие

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

обращения к диску, позиционируют головку диска и обеспечивают передачу дан-

ных между диском и центральным процессором; иначе это приходится делать дис-

ковому драйверу.

Сервисные программы могут непосредственно обращаться к диску в обход

стандартного метода доступа к файловой системе, рассмотренного в главах 4 и

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