Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка и реализация ОС.doc
Скачиваний:
82
Добавлен:
24.11.2018
Размер:
3.09 Mб
Скачать

5.1.2.2. Обработчики прерываний

Прерывания должны быть упрятаны как можно глубже во внутренностях операционной системы, что бы о них знала как можно меньшая ее часть. Лучший способ завуалировать их заключается в блокировке драйвера, начавшего операцию ввода-вывода, вплоть до окончания этой операции и получения прерывания. Драйвер может заблокировать себя сам, выполнив на семафоре процедуру down, процедуру wait на переменной состояния, процедуру receive на сообщении или что-либо подобное. Когда происходит прерывание, начинает работу обработчик прерываний. По ее окончании он может разблокировать драйвер-инициатор. В некоторых случаях это реализуется через процедуру up на семафоре. В других ситуациях обработчик прерываний вызывает процедуру монитора signal с переменной состояния.

Или же он посылает заблокированному драйверу сообщение. В любом случае результат один - драйвер разблокируется и продолжает работу. Эта схема лучше всего работает в драйверах, являющихся процессами с собственными состоянием, стеком и счетчиком команд.

5.1.2.3. Драйверы устройств

У каждого контроллера устройства есть регистры, в которые можно записывать команды, считывать состояние устройства или делать и то и другое. Число регистров и смысл команд значительно изменяются от устройства к устройству. Например, драйвер мыши принимает информацию о ее перемещении и нажатых кнопках. В то же время драйверу диска нужно знать о секторах, дорожках, цилиндрах, головках, их перемещении и времени установки, двигателях и тому подобных вещах.

Поэтому для управления каждым устройством ввода-вывода, подключенным к компьютеру, требуется специальная программа. Эта программа, называемая драйвером устройства, часто пишется производителем устройства и распространяется на компакт-дисках вместе с самим устройством. Поскольку для каждой операционной системы требуются специализированные драйверы, производители обычно поставляют драйверы для нескольких наиболее популярных операционных систем.

Каждый драйвер обслуживает один тип устройств или более крупный класс сходных устройств. Чтобы драйвер имел доступ к аппаратной части устройства, то есть к регистрам контроллера, его традиционно интегрируют в ядро операционной системы. Такой подход обеспечивает максимальную производительность, но минимальную надежность, поскольку ошибка в любом драйвере устройства способна вывести из строя всю систему.

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

5.1.2.4. Независимое от устройств программное обеспечение ввода-вывода

Некоторая часть программного обеспечения предназначена для работы с конкретными устройствами, значительная его часть не зависит от устройств. Точную границу между драйверами и независимым от устройств программным обеспечением проводит система, так как некоторые функции, которые можно реализовать независимо от устройств, часто выполняются прямо в драйверах из различных соображений, в том числе с позиций эффективности. Следующие функции обычно реализуются независимым от устройств программным обеспечением:

- буферизация,

- сообщения об ошибках,

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

- обеспечение аппаратно-независимого размера блока.

Буферизация является важной как для блочных, так и для символьных устройств. Для блочных устройств аппаратное обеспечение обычно требует, чтобы чтение или запись производились большими блоками. Однако для пользовательских программ такого ограничения нет, и они вправе передавать любые объемы информации. Поэтому если пользователь передает только половину блока, операционная система обычно не сразу записывает эти данные на диск, а дожидается передачи оставшейся части блока. Что же касается символьных устройств, то пользователь может передавать данные быстрее, чем устройство в состоянии их воспринять, таким образом, и здесь нужна буферизация. Не исключено также, что данные, поступающие, например, от клавиатуры, могут опережать считывание, и в этом случае также не обойтись без буфера.

В контексте ввода-вывода ошибки — как нигде частое явление. Операционная система должна приложить максимальные усилия к их обработке. Многие ошибки являются специфичными для конкретного устройства и должны обрабатываться драйвером, так как только он знает, что делать (например, повторить попытку, игнорировать ошибку или инициировать сбой системы).

Захват и освобождение выделенных устройств. Некоторые устройства, например привод CD-RW, рассчитаны на монопольное владение процессом в каждый момент времени. Операционная система должна рассмотреть запросы на использование такого устройства и либо принять их, либо отказать в выполнении запроса, в зависимости от доступности запрашиваемого устройства. Простой способ обработки этих запросов заключается в соответствующей реализации системного вызова open по отношению к специальным файлам. Если устройство недоступно, вызов open завершится неуспешно. Обращение к системному вызову close освобождает устройство.

Обеспечение аппаратно-независимого размера блока. У различных дисков могут быть разные размеры сектора. Независимое от устройств программное обеспечение должно скрывать этот факт от верхних уровней и предоставлять им единообразный размер блока, например, объединяя несколько физических сегментов в одну логическую сущность. При этом более высокие уровни имеют дело только с абстрактными устройствами, с одним и тем же размером логического блока, не зависящим от размера физического сектора. Некоторые символьные устройства предоставляют свои данные побайтно (например, модемы), тогда как другие выдают их большими порциями (сетевые интерфейсы). Эти различия также могут быть скрыты.