Драйверы внешних устройств

Драйвер (driver) представляет собой спец программный модуль, управляющий наружным устройством. Слово driver происходит от глагола to drive (вести) и переводится с британского языка как извозчик либо шофер: тот, кто ведет тс. Драйверы обеспечивают единый интерфейс для доступа к разным устройствам, тем устраняя зависимость пользовательских программ и ядра ОС от Драйверы внешних устройств особенностей аппаратуры. Драйвер не непременно должен управлять любым физическим устройством. Многие ОС предоставляют также драйверы виртуальных устройств либо псевдоустройств – объектов, которые ведут себя аналогично устройству ввода-вывода, но не соответствуют никакому физическому устройству. В виде псевдоустройств реализуются трубы в системах семейства Unix и почтовые ящики в VMS. Еще одним примером полезного Драйверы внешних устройств псевдоустройства являются устройства /dev/null в Unix и аналогичное ему \DEV\NUL в MS DOS\Windows\OS/2.

Прикладные программки, использующие собственные драйверы, не так редки – примерами таких программ могут быть GhostScript (свободно распространяемый интерпретатор языка PostScript, способный выводить программки на этом языке на разные устройства.

Большая часть Драйверы внешних устройств ОС общего предназначения воспрещают пользовательским программкам конкретный доступ к аппаратуре. Это делается для увеличения надежности и обеспечения безопасности в многопользовательских системах. В таких системах драйверы являются для прикладных программ единственным методом доступа к наружному миру. Еще одна принципиальная функция драйвера – это взаимоисключение доступа к устройству в средах с вытесняющей многозадачностью Драйверы внешних устройств. Допускать одновременный неконтролируемый доступ к устройству нескольких параллельно исполняющихся процессов просто нельзя, так как для большинства наружных устройств даже простые операции ввода-вывода не являются атомарными. К примеру, в большинстве аппаратных реализации поочередного порта RS232 передача б состоит из 4 шагов: записи значения в регистр данных, записи команды “передавать” в регистр команды Драйверы внешних устройств, ожидания прерывания по концу передачи и проверки удачливости передачи методом считывания статусного регистра устройства. Нарушение последовательности шагов может приводить к противным последствиям – к примеру, перезапись регистра данных после подачи команды, но до окончания передачи, может привести к остановке передачи либо, что еще ужаснее, передаче искаженных данных и т. д Драйверы внешних устройств. Нельзя также забывать о неприятностях более высочайшего уровня – к примеру, смешивании вывода различных процессов на печати либо данных – на устройстве наружной памяти. Потому оказывается нужно связать с каждым наружным устройством некий разграничитель доступа во времени. В современных ОС эта функция возлагается конкретно на драйвер. Обычно одна Драйверы внешних устройств из нитей драйвера представляет собой процесс-монитор, выполняющий асинхронно поступающие запросы на доступ к устройству. В Unix, OS/2 и Windows NT/2000/XP этот процесс именуется стратегической функцией. При определении интерфейса драйвера разработчики ОС должны отыскать верный баланс меж противоречивыми требованиями:

1. рвением как можно посильнее упростить драйвер, чтоб облегчить его разработку Драйверы внешних устройств и (косвенно) уменьшить возможность небезопасных ошибок;

2. желанием предоставить гибкий и умственный интерфейс к различным устройствам.

Драйверы обычно разрабатываются не поставщиками операционной системы, а посторонними фирмами – разработчиками и изготовителями периферийного оборудования. Потому интерфейс драйвера является никак более наружным, чем то, что обычно считается наружным интерфейсом ОС – интерфейс системных вызовов. Соответственно, к Драйверы внешних устройств нему предъявляются те же требования, что и к хоть какому другому наружному интерфейсу: он должен быть довольно обычным, исчерпывающе документированным и размеренным – не изменяться непредсказуемо от одной версии ОС к другой. Безупречным вариантом была бы полная сопоставимость драйверов хотя бы снизу ввысь, чтоб драйвер предшествующей версии ОС мог употребляться Драйверы внешних устройств со всеми следующими версиями. Утрата сопоставимости в этом случае значит, что все независящие изготовители оборудования должны будут обновить свои драйверы. Организация такового обновления оказывается сложной, непризнательной и нередко просто неосуществимой задачей – к примеру, поэтому, что изготовитель оборудования уже не существует как организация либо отказался от поддержки данного устройства. Таким Драйверы внешних устройств макаром, интерфейс драйвера нередко оказывается более ограниченной частью ОС. К огорчению – невзирая даже на то, что в общих чертах архитектура драйвера в большинстве современных ОС умопомрачительно похожа – мысль эта, по-видимому, нереализуема. Даже для близкородственных ОС – к примеру, систем семейства Unix – драйверы 1-го и такого же устройства Драйверы внешних устройств не всегда могут быть просто перенесены из одной ОС в другую, не говоря уж о способности использования без модификаций. Еще больше необычным является тот факт, что две полосы ОС – Windows 95/98/МЕ и Windows NT/2000/XP – поставляемых одной и той же компанией Microsoft и реализующих практически один и тот же интерфейс системных вызовов Драйверы внешних устройств, – Win32 – имеют совершенно различный интерфейс драйвера. Неувязка тут в том, что интерфейс меж драйвером и ядром ОС всегда двухсторонний: не только лишь прикладные программки и ядро вызывают функции драйвера, да и, напротив, драйвер должен вызывать функции ядра. Таким макаром, до того времени, пока употребляются ОС различной архитектуры, разработка Драйверы внешних устройств универсального интерфейса драйвера, если на теоретическом уровне и вероятна, то фактически навряд ли осуществима.

Функции драйверов

Сначала, драйвер обязан иметь функции, вызываемые ядром при загрузке и выгрузке модуля и при подключении модуля к определенным устройствам. К примеру, в Sun Solaris это перечисленные функции:

1. – инициализация драйвера. Эта функция вызывается при загрузке модуля Драйверы внешних устройств. Драйвер должен зарезервировать все нужные ему системные ресурсы и проинициализировать собственные глобальные переменные. Инициализация устройства на этом шаге не происходит.

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

3. – инициализация Драйверы внешних устройств копии драйвера, управляющей определенным устройством. Эту функцию можно рассматривать как аналог конструктора объекта в объектноориентированном программировании. Если в системе находится несколько устройств, управляемых одним драйвером, некие ОС загружают несколько копий кода драйвера, но в системах семейства Unix эта функция просто вызывается неоднократно.Любая из инициализированных копий драйвера имеет свой блок локальных Драйверы внешних устройств переменных, в каких хранятся переменные состояния устройства. При вызове инициализации драйвер должен прочесть конфигурационный файл, где записаны характеристики устройства (номенклатура этих характеристик находится в зависимости от устройства и от драйвера), расположить и проинициализировать блок переменных состояния, зарегистрировать обработчики прерываний, проинициализировать само устройство и, в конце концов, зарегистрировать устройство как доступное Драйверы внешних устройств для пользовательских программ, создав для него минорную запись (minor node). В ряде всевозможных случаев драйвер делает для 1-го устройства несколько таких записей. Пример: в большинстве систем семейства Unix лентопротяжные устройства имеют две минорные записи. Одно из этих устройств при открытии перематывает ленту к началу, другое не перематывает. В Драйверы внешних устройств реальности оба устройства управляются одним и этим же драйвером, который определяет текущий режим работы зависимо от обозначенной минорной записи.

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

5. – выгрузка драйвера. Драйвер должен высвободить все ресурсы, которые он занял на шаге инициализации модуля, также все ресурсы, занятые им во время работы на уровне модуля (не привязанные к определенному управляемому устройству).

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

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

Нередка ситуация, когда драйвер не может производить управление устройством на сто процентов без помощи других. Как пример можно разглядеть драйвер лентопротяжного устройства конструктива SCSI. Для выполнения хоть какой операции над устройством таковой драйвер должен сформировать команду либо последовательность команд SCSI, передать Драйверы внешних устройств ее устройству, дождаться ответа и проанализировать его. Подобные ситуации появляются и с другими устройствами. К примеру, с IBM PC-совместимыми компьютерами могут работать три главных типа устройств позиционного ввода: мыши, использующие протокол обмена, совместимый с Microsoft Mouse, мыши с протоколом Logitech, планшеты и дигитайзеры с протоколом Summagraphics. Устройства всех Драйверы внешних устройств этих, также нескольких наименее всераспространенных типов могут подсоединяться как минимум к четырем разным периферийным портам: специальному “мышиному” разъему PS/2, к поочередной шине USB и к поочередному порту RS232, при этом в качестве порта RS232, может употребляться как один из 4 стандартных портов IBM PC, так и, к примеру, один из выходов Драйверы внешних устройств мультипортовой платы. В данном случае также целенаправлено воплотить четыре самостоятельных драйвера транспортных портов (тем паче что к этим портам могут подключаться и другие устройства) и три драйвера протоколов обмена, способных работать с хоть каким транспортным портом. Объединение этих драйверов в одном модуле может сделать некие – достаточно, вобщем, непонятные – удобства админу Драйверы внешних устройств системы, в какой употребляется стандартная композиция порта и мыши, но поставит в безнадежное положение админа системы, в какой композиция необычная, к примеру, не позволяя использовать мышь, присоединенную к мультипортовой плате.

Загрузка драйверов

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

На практике время от времени – в особенности при использовании многоуровневых драйверов – оказывается вероятным перенести отдельные функции работы Драйверы внешних устройств с устройствами в контекст пользовательского процесса. Одна из относительно успешных попыток такового переноса была осуществлена в 70-е годы при разработке экранного редактора vi для ОС Unix. По плану разработчиков этот редактор был должен работать с огромным количеством различных видеотерминалов, использовавших разные несопоставимые системы команд для перемещения курсора и редактирования текста Драйверы внешних устройств в буфере терминала и настолько же несопоставимые схемы кодировки особых кнопок (стрелочек, многофункциональных кнопок и пр.). Как и в примере с мышами, различные терминалы могли подключаться к компу через разные типы поочередных портов: “токовую петлю”, позже – RS232 и др. В данном случае тоже было естественно поделить Драйверы внешних устройств драйвер терминала на драйвер порта и модуль, занимающийся генерацией команд и анализом приходящих от терминала кодов расширенных кнопок. Заместо разработки отдельного модуля, решающего вторую часть задачки, была сотворена системная база данных для систем команд различных терминалов. Для работы с терминальной базой данных позже было сотворено несколько библиотек подпрограмм. Для терминалов описанный Драйверы внешних устройств подход оказался если и не безупречным, то, во всяком случае, применимым. Но, к примеру, для графических устройств он не подошел – системы команд разных устройств оказались очень непохожими и не сводимыми к единой системе “параметров”. В обоих случаях “драйвер” оказывается разбит на две части: фактически драйвер, исполняющийся в режиме ядра, который Драйверы внешних устройств занимается только обменом данными с устройством, и программку, интерпретирующую приобретенные данные и/либо формирующую команды для устройства. Эта программка может быть достаточно сложной, но ошибка в ней не будет фатальной для системы, потому что она исполняется в пользовательском кольце доступа. Проще всего происходит загрузка драйверов в системах, в каких Драйверы внешних устройств ядро собирается в статический загрузочный модуль. В их драйвер просто присоединяется редактором связей к виду ядра и без каких-то дополнительных усилий оказывается в памяти в процессе загрузки системы. В системах с динамической подгрузкой модулей ядра, драйвер представляет собой перемещаемый загрузочный либо объектный модуль, время от времени такого Драйверы внешних устройств же формата, что и стандартные объектные либо загрузочные модули в системе, а время от времени и спец. В данном случае ядро должно содержать редактор связей, может быть являющийся многофункциональным подмножеством настоящего системного линкера.


doza-oblucheniya-rentgeneffekt.html
dozatori-pitateli-sipuchih-materialov.html
dozhd-i-saatchi-saatchi-viigrali-lvov-boris-belenkij-mne-nravitsya-kogda-teatri-rabotayut-s-detmi-talantlivo-28.html