Главная » Статьи » Операционные системы » Общее |
Драйвер блок-ориентированного устройства состоит из
следующих функций:
Указатели на эти функции (то есть их адреса) составляют
строку в таблице bdevsw, описывающую один драйвер системы. Ядро UNIX вызывает
нужную функцию драйвера, передавая ей параметры, необходимые для работы.
Например, при вызове функции open ей передается номер устройства (minor), режим
открытия (для чтения, для записи, для чтения и записи и т. д.), а также
указатель на идентификаторы безопасности процесса, открывающего файл. Процедуры обработки прерываний драйвера в таблице bdevsw не
указываются, их адреса помещаются в специальную системную структуру — таблицу
прерываний. В UNIX все обработчики прерываний, в том числе и обработчики
прерываний аппаратных драйверов, состоят из двух процедур, называемых
соответственно top_half — верхняя часть обработчика прерываний и bottom_half —
нижняя часть обработчика прерываний. Верхняя часть обработчика прерываний
соответствует по назначению ISR-процедуре драйвера Windows NT — она вызывается
при возникновении аппаратного запроса прерывания от устройства. В обязанности
верхней части входит быстрая реакция на событие в устройстве, вызвавшее
генерирование сигнала прерывания. При обработке верхних половин все прерывания с
более низкими приоритетами блокируются аппаратно, за счет управления
контроллером прерываний (или аналогичным по назначению блоком компьютера).
Верхняя половина отвечает также за постановку в очередь на выполнение нижней
половины обработчика прерываний драйвера, который выполняет менее срочную и
более трудоемкую работу. Нижние половины драйверов выполняются с низким уровнем
приоритета, так что любые запросы прерываний устройств могут прервать их
обработку. Нижние половины обработчиков прерываний драйверов UNIX по назначению
соответствуют DPC-процедурам драйверов Windows NT. Часто единственной
обязанностью верхней половины обработчика прерываний является постановка в
очередь нижней половины для последующего выполнения. Примером разделения функций между верхней и нижней
половинами является обработчик прерываний от таймера. Верхняя часть, вызываемая
100 раз в секунду, наращивает переменную, хранящую количество тактов системных
часов с момента последней загрузки системы, а также две переменные,
подсчитывающие, сколько тактов прошло с момента последнего вызова нижней
половины и сколько из них пришлось на период работы в режиме системы. Затем
верхняя половина ставит в очередь диспетчера прерываний нижнюю половину и
завершает свою работу. Нижняя половина обработчика прерываний таймера
занимается вычислением статистики на основании данных о тактах, собранных
верхней половиной. Нижняя половина вычисляет такие статистические показатели,
как средняя загрузка системы в пользовательском и системном режимах, обновляет
глобальную переменную системного времени, а также уменьшает оставшееся значение
кванта времени текущего процесса. Затем нижняя половина просматривает очередь
процедур, ожидающих своего вызова по времени, в число которых входит и
планировщик процессов. Функция стратегии драйвера strategy выполняет чтение и
запись блока данных на основании информации в буфере — особой структуре ядра с
именем buf, управляющей обменом данных с диском. Функция strategy выполняет
обмен только с системной памятью, так как блок-ориентированный драйвер
непосредственно не взаимодействует с пользовательским процессом. Между ним и
пользовательским процессом всегда работает промежуточный программный слой или
слои — либо слой дискового кэша вместе со слоем файловой системы, либо слой
байт-ориентированного драйвера диска, с помощью которого пользовательский
процесс может открыть специальный файл, соответствующий диску. В число наиболее важных элементов
структуры buf входят следующие:
Функция strategy при вызове получает указатель на структуру
buf, описывающую требуемую операцию. На рис. 8.4 приведен пример блок-схемы
двух функций драйвера диска — стратегии (hd_strategy) и нижней половины
обработчика прерываний (hd_bottom). Функция hd_strategy преобразует логический
номер блока в номера цилиндра, головки и сектора и помещает эту информацию в
заголовок запроса операции для передачи ее контроллеру диска. В заголовок
запроса помещается также другая информация, необходимая для работы контроллера,
— это операция чтения или записи, адрес системной памяти, куда нужно поместить
прочитанную информацию или откуда контроллеру нужно считать записываемые
данные. Драйвер ведет две очереди для передачи запросов на выполнение операций
чтения и записи контроллеру диска: рабочую очередь, в которой находятся
обрабатываемые контроллером запросы, и очередь приостановленных запросов, куда
помещаются новые запросы в том случае, если рабочая очередь заполнена, а ее
размер зависит от возможностей контроллера по параллельной обработке запросов. | |
Просмотров: 1644 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |