Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гл.7 ОС буклет.doc
Скачиваний:
5
Добавлен:
11.11.2018
Размер:
455.68 Кб
Скачать

7.3.3 Многоуровневые драйверы

Первоначально термин «драйвер» применялся в достаточно узком смысле: под драйвером понимался программный модуль, который:

  • входит в состав ядра операционной системы, работая в привилегированном режиме;

  • непосредственно управляет внешним устройством, взаимодействуя с его кон­троллером с помощью команд ввода-вывода компьютера;

  • обрабатывает прерывания от контроллера устройства;

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

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

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

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

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

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

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

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

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

В вертикальной подсистеме сетевых устройств, приведенной на рис. 7.2, аппа­ратными драйверами являются драйверы сетевых адаптеров, которые выполня­ют функции низкоуровневых канальных протоколов, таких как Ethernet, Frame Relay, ATM и других. Эти драйверы выполняют простые функции — они органи­зуют передачу кадров данных между компьютерами одной сети. Над ними рас­полагается слой модулей, которые реализуют функции более интеллектуальных протоколов сетевого уровня — IP и IPX, которые могут обеспечить взаимодейст­вие компьютеров разных сетей с произвольной топологией связей. Модули IP и IPX также могут быть оформлены как драйверы, хотя они находятся в промежу­точном программном слое и непосредственно с аппаратурой не взаимодействуют. Вообще, вертикальная подсистема управления сетевыми устройствами являет­ся примером эффективного многоуровнего подхода к организации драйверов -просто в силу того, что в ее основе лежит хорошо продуманная семиуровневая модель взаимодействия открытых систем OSI. И, хотя все семь уровней модели OSI обычно не выделяются в самостоятельные программные уровни, четыре уровня» драйверов чаще всего присутствуют в подсистеме управления сетевыми устройствами. Над слоем драйверов сетевых протоколов располагается слой драйверов транспортных протоколов, таких как TCP/UDP, SPX и NetBEUI, ко­торые отвечают за надежную связь между компьютерами сети. Еще выше распо­ложен слой драйверов протоколов прикладного уровня (на рисунке — http, ftp и SMB), которые предоставляют пользователям сети конечные услуги по доступу к гипертекстовой информации, архивам файлов и многие другие.

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

В подсистеме управления дисками аппаратные драйверы поддерживают для верх­них уровней представление диска как последовательного набора блоков одина­кового размера, преобразуя вместе с контроллером номер блока в более сложный адрес, состоящий из номеров цилиндра, головки и сектора. Однако такие поня­тия, как «файл» и «файловая система», аппаратные драйверы дисков не поддер­живают — эти удобные для пользователя и программиста логические абстракции создаются на более высоком уровне программным обеспечением файловых сис­тем, которое в современных ОС также оформляется как драйвер, только высоко­уровневый. Наличие универсальной среды, создаваемой менеджером ввода-выво­да, позволяет достаточно просто решить проблему поддержки в ОС нескольких файловых систем одновременно. Для этого в ОС устанавливается несколько вы­сокоуровневых драйверов (на рисунке это драйверы файловых систем ufs, NTFS и FAT), работающих с общими аппаратными драйверами, но по-своему организую­щими хранение данных в блоках диска и по-своему представляющими файловую систему пользователю и прикладным процессам. Для унификации представле­ния различных файловых систем в подсистеме ввода-вывода может использо­ваться общий драйвер верхнего уровня, играющий роль диспетчера нескольких драйверов файловых систем. На рисунке в качестве примера показан диспетчер VFS (Virtual File System), применяемый в операционных системах UNIX, реали­зованных на основе кода System V Release 4.

Необязательно все модули подсистемы ввода-вывода оформляются в виде драй­веров. Например, в подсистеме управлениями дисками обычно имеется такой модуль, как дисковый кэш, который служит для кэширования блоков дисковых файлов в оперативной памяти. Достаточно специфические функции кэша дела­ют нецелесообразным оформление его в виде драйвера, взаимодействующего с другими модулями ОС только с помощью услуг менеджера ввода-вывода. Дру­гим примером модуля, который чаще всего не оформляется в виде драйвера, является диспетчер окон графического интерфейса. Иногда этот модуль вообще вы­носится из ядра ОС и реализуется в виде пользовательского процесса. Таким об­разом был реализован диспетчер окон (а также высокоуровневые графические драйверы) в Windows NT 3.5 и 3.51, но этот микроядерный подход заметно за­медлял графические операции, поэтому в Windows NT 4.0 диспетчер окон и вы­сокоуровневые графические драйверы, а также графическая библиотека GDI были перенесены в пространство ядра.

Аппаратные драйверы после запуска операции ввода-вывода должны своевремен­но реагировать на завершение контроллером заданного действия, и для решения этой задачи они взаимодействуют с системой прерываний. Драйверы более вы­соких уровней вызываются уже не по прерываниям, а по инициативе аппарат­ных драйверов или драйверов вышележащего уровня. Не все процедуры аппа­ратного драйвера нужно вызывать по прерываниям, поэтому драйвер обычно име­ет определенную структуру, в которой выделяется секция обработки прерываний (Interrupt Service Routine, ISR), которая и вызывается при поступлении запроса от соответствующего устройства диспетчером прерываний. Диспетчер прерыва­ний можно считать частью подсистемы ввода-вывода, как это показано на рис. 7.2, а можно считать и независимым модулем ядра ОС, так как он служит не только для вызова секций обработки прерываний драйверов, но и для диспетчеризации прерываний других типов.

В унификацию драйверов большой вклад внесла операционная система UNIX. В ней все драйверы были разделены на два больших класса: блок-ориентирован­ные (block-oriented) драйверы и байт-ориентированные (character-oriented) драйверы. Это деление является более общим, чем показанное на рис. 7.2 деле­ние на вертикальные подсистемы. Например, драйверы графических устройств и драйверы сетевых устройств относятся к классу байт-ориентированных.

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

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

Значительность отличий блок-ориентированных и байт-ориентированных драй­веров иллюстрирует тот факт, что среда STREAMS разработана только для байт-ориентированных драйверов и включить в нее блок-ориентированный драйвер невозможно.

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

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

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

Выводы

□ Основными задачами подсистемы ввода-вывода являются:

    • организация параллельной работы процессора и устройств ввода-вывода при обеспечении приемлемого уровня реакции каждого драйвера и мини­мизации общей загрузки процессора;

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

    • разделение устройств ввода-вывода между процессами;

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

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

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

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

  • Аппаратные драйверы делятся на блок-ориентированные, обеспечивающие до­ступ к устройствам с поблочной непосредственной адресацией, и байт-ориен­тированные, управляющие устройствами, поддерживающими побайтный не адресуемый обмен.

Задачи и упражнения

  1. За счет каких устройств удается распараллелить ввод-вывод даже в однопро­цессорных системах?

  2. Какие функции выполняет менеджер ввода-вывода?

  3. Какие из следующих утверждений правильны?

    1. драйвер выполняет низкоуровневые функции по управлению устройст­вом ввода-вывода;

    2. драйвер выполняет функций управления файловой системой;

    3. все функции драйвера вызываются по прерываниям;

    4. драйвер является частью подсистемы ввода-вывода;

    5. драйвер организует взаимодействие модулей ядра операционной системы;

    6. драйвер работает в привилегированном режиме.

4. Какие два типа ресурсов, связанных с диском, требуется выделить процессу, чтобы он выполнил запись данных на диск?

5. Каким из двух типов драйверов — блок-ориентированным или байт-ориенти­рованным — обслуживается диск?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]