Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебное пособие по дисциплине ОССиО.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

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

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

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

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

В любой системе драйвер устройства – это многовходовой программный модуль со своими статическими данными, который умеет инициировать работу с устройством, выполнять заказываемые пользователем обмены (на ввод или вывод данных и обрабатывать прерывания от устройства). В любой операционной системе имеется своя технология разработки драйверов.

Традиционно в ОС UNIX выделяются три типа организации ввода/вывода и, соответственно, три типа драйверов. В частности, в ОС UNIX различаются кроме символьных, блок-ориентированных, еще и потоковые драйверы.

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

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

Наиболее сложной организацией отличаются потоковые драйверы. Фактически, такой драйвер представляет собой конвейер модулей, обеспечивающий многоступенчатую обработку запросов пользователя. Потоковые драйверы в среде ОС UNIX в основном предназначены для реализации доступа к сетевым устройствам, которые должны работать в соответствии с многоуровневыми сетевыми протоколами. Итак, с точки зрения интерфейсов и общесистемного управления различаются два вида драйверов – символьные и блочные. С точки зрения внутренней организации выделяется еще один вид драйверов – потоковые драйверы. Однако по своему внешнему интерфейсу потоковые драйверы не отличаются от символьных.

В ОС UNIX возможны два способа включения драйвера в состав ядра ОС. Первый способ состоит в полном включении драйвера в состав ядра на стадии генерации системы (т.е. драйвер статически объявляется частью ядра системы). Второй способ позволяет обойтись минимальным количеством статических объявлений на стадии генерации ядра. В любой момент работы системы такой драйвер может быть динамически загружен в ядро системы. После появления (статического или динамического) в ядре ОС UNIX драйверы всех разновидностей функционируют единообразно.