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


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

Каждый драйвер устройства поддерживает один тип устройства или, максимум, класс близких устройств. Например, драйвер дисков может поддерживать различные диски, отличающиеся размерами и скоростями. Однако мышь и джойстик отличаются настолько силь­но, что обычно требуют использования различных драйверов.

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

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

Рис. 7. Логическое расположение драйверов устройств

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

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

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

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

Драйвер устройства выполняет несколько функций:

1)  обработку абстрактных запросов чтения и записи независи­мого от устройств и расположенного над ними программного обес­печения;

2)  инициализацию устройства;

3)  управление энергопотреблением устройства и регистрацией событий;

4)  проверку входных параметров. Если они не удовлетворяют оп­ределенным критериям, драйвер возвращает ошибку. В противном случае драйвер преобразует абстрактные термины в конкретные. На­ пример, дисковый драйвер может преобразовывать линейный номер блока в номера головки, дорожки и секторы;

5)  проверку использования устройства в данный момент. Если ус­тройство занято, запрос может быть поставлен в очередь. Если уст­ройство свободно, проверяется его состояние. Возможно, требуется включить устройство или запустить двигатель, прежде чем начнется перенос данных. Как только устройство готово, может начинаться собственно управление устройством.

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

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

Например, для скроллинга экрана в символьном режиме нужно за­писать лишь несколько байтов в регистры контроллера. Вся опера­ция занимает несколько наносекунд.

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

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

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

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

 

Вопросы для самоконтроля:

1.Переключение контекста .

2.Опишите суть способа переключения контекста.

3.Дайте определение ядра ОС и назовите его основные функции.

 

Рекомендуемая литература:

1.Таненбаум Э. Современные операционные системы. СПб: Питер, 2002.

2.Олифер Н. А., Олифер В. Г. Сетевые операционные системы. СПб: Питер, 2001.