В вычислительной технике драйвер устройства — это компьютерная программа , которая управляет или управляет устройством определенного типа , подключенным к компьютеру или автомату . [1] Драйвер обеспечивает программный интерфейс для аппаратных устройств, позволяя операционным системам и другим компьютерным программам получать доступ к функциям оборудования без необходимости знать точные сведения об используемом оборудовании.
Драйвер связывается с устройством через компьютерную шину или подсистему связи, к которой подключается оборудование. Когда вызывающая программа вызывает подпрограмму в драйвере, драйвер передает команды устройству (управляет им). Как только устройство отправляет данные обратно драйверу, драйвер может вызывать процедуры исходной вызывающей программы.
Драйверы зависят от оборудования и операционной системы. Обычно они обеспечивают обработку прерываний , необходимую для любого необходимого асинхронного аппаратного интерфейса, зависящего от времени. [2]
Основная цель драйверов устройств — обеспечить абстракцию, действуя в качестве переводчика между аппаратным устройством и приложениями или операционными системами , которые его используют. [1] Программисты могут писать код приложений более высокого уровня независимо от того, какое конкретное оборудование использует конечный пользователь. Например, приложение высокого уровня для взаимодействия с последовательным портом может просто иметь две функции: «отправка данных» и «получение данных». На более низком уровне драйвер устройства, реализующий эти функции, будет взаимодействовать с конкретным контроллером последовательного порта, установленным на компьютере пользователя. Команды, необходимые для управления UART 16550, сильно отличаются от команд, необходимых для управления преобразователем последовательного порта FTDI , но каждый драйвер устройства, специфичный для конкретного оборудования, абстрагирует эти детали в один и тот же (или аналогичный) программный интерфейс.
Написание драйвера устройства требует глубокого понимания того, как аппаратное и программное обеспечение работает для конкретной функции платформы . Поскольку для работы драйверам требуется низкоуровневый доступ к функциям оборудования, драйверы обычно работают в среде с высокими привилегиями и могут вызвать проблемы в работе системы, если что-то пойдет не так. Напротив, большую часть программного обеспечения пользовательского уровня в современных операционных системах можно остановить, не оказывая существенного влияния на остальную часть системы. Даже драйверы, работающие в пользовательском режиме, могут привести к сбою системы, если устройство запрограммировано ошибочно . Эти факторы делают диагностику проблем более трудной и опасной. [3]
Таким образом, задача написания драйверов обычно ложится на плечи инженеров-программистов или компьютерных инженеров , работающих в компаниях, занимающихся разработкой аппаратного обеспечения. Это потому, что они имеют лучшую информацию о конструкции своего оборудования, чем большинство посторонних. Более того, традиционно считалось, что в интересах производителя оборудования гарантировать, что его клиенты смогут использовать свое оборудование оптимальным образом. Обычно драйвер логического устройства (LDD) пишется поставщиком операционной системы, а драйвер физического устройства (PDD) реализуется поставщиком устройства. Однако в последние годы производители, не являющиеся поставщиками, написали множество драйверов для проприетарных устройств, в основном для использования со свободными операционными системами и операционными системами с открытым исходным кодом . В таких случаях важно, чтобы производитель оборудования предоставил информацию о том, как устройство обменивается данными. Хотя вместо этого эту информацию можно получить путем реверс-инжиниринга , с аппаратным обеспечением это гораздо сложнее, чем с программным обеспечением.
Microsoft попыталась снизить нестабильность системы из-за плохо написанных драйверов устройств, создав новую среду для разработки драйверов, называемую Windows Driver Frameworks (WDF). Сюда входит платформа драйверов пользовательского режима (UMDF), которая поощряет разработку определенных типов драйверов — в первую очередь тех, которые реализуют протокол на основе сообщений для связи со своими устройствами — в качестве драйверов пользовательского режима. Если такие драйверы работают неправильно, они не вызывают нестабильности системы. Модель Kernel-Mode Driver Framework (KMDF) по-прежнему позволяет разрабатывать драйверы устройств режима ядра, но пытается предоставить стандартные реализации функций, которые, как известно, вызывают проблемы, включая отмену операций ввода-вывода, управление питанием, а также подключение и подключение. поддержка игровых устройств.
У Apple есть платформа с открытым исходным кодом для разработки драйверов для macOS , которая называется I/O Kit.
В средах Linux программисты могут создавать драйверы устройств как части ядра , отдельно как загружаемые модули или как драйверы пользовательского режима (для определенных типов устройств, где существуют интерфейсы ядра, например для устройств USB). Makedev включает список устройств в Linux, включая ttyS (терминал), lp ( параллельный порт ), hd (диск), цикл и звук (к ним относятся микшер , секвенсор , dsp и аудио). [4]
Файлы Microsoft Windows .sys и файлы Linux .ko могут содержать загружаемые драйверы устройств. Преимущество загружаемых драйверов устройств состоит в том, что их можно загружать только при необходимости, а затем выгружать, что позволяет экономить память ядра.
В зависимости от операционной системы драйверам устройств может быть разрешен запуск с различными уровнями привилегий . Выбор уровня привилегий, на котором находятся драйверы, во многом определяется типом ядра , которое использует операционная система. Операционная система, использующая монолитное ядро , например ядро Linux , обычно запускает драйверы устройств с теми же привилегиями, что и все другие объекты ядра. Напротив, системы, разработанные на основе микроядра , такие как Minix , будут размещать драйверы как процессы, независимые от ядра, но которые используют его для основных функций ввода-вывода и для передачи сообщений между пользовательскими программами и друг другом. [5] В Windows NT , системе с гибридным ядром , драйверы устройств обычно работают либо в режиме ядра , либо в пользовательском режиме . [6]
Наиболее распространенным механизмом разделения памяти на различные уровни привилегий является использование защитных колец . Во многих системах, например, с процессорами x86 и ARM , переключение между кольцами приводит к снижению производительности. Этот фактор учитывают разработчики операционных систем и инженеры встроенного программного обеспечения при создании драйверов для устройств, которые предпочитают работать с низкой задержкой, таких как сетевые устройства . интерфейсные карты . Основным преимуществом запуска драйвера в пользовательском режиме является повышение стабильности, поскольку плохо написанный драйвер устройства пользовательского режима не может привести к сбою системы из-за перезаписи памяти ядра. [7]
Из-за разнообразия современного [обновлять]оборудования и операционных систем драйверы работают в самых разных средах. [8] Драйверы могут взаимодействовать с:
Общие уровни абстракции для драйверов устройств включают:
Поэтому выбор и установка правильных драйверов устройств для данного оборудования часто является ключевым компонентом конфигурации компьютерной системы. [10]
Драйверы виртуальных устройств представляют собой особый вариант драйверов устройств. Они используются для эмуляции аппаратного устройства, особенно в средах виртуализации , например, когда программа DOS запускается на компьютере Microsoft Windows или когда гостевая операционная система запускается, например, на хосте Xen . Вместо того, чтобы разрешить гостевой операционной системе взаимодействовать с оборудованием, драйверы виртуальных устройств берут на себя противоположную роль и эмулируют часть оборудования, так что гостевая операционная система и ее драйверы, работающие внутри виртуальной машины, могут создать иллюзию доступа к реальному оборудованию. Попытки гостевой операционной системы получить доступ к оборудованию направляются драйверу виртуального устройства в хостовой операционной системе, например, в виде вызовов функций . Драйвер виртуального устройства также может отправлять в виртуальную машину моделируемые события уровня процессора, такие как прерывания .
Виртуальные устройства также могут работать в невиртуализированной среде. Например, виртуальный сетевой адаптер используется с виртуальной частной сетью , а устройство виртуального диска используется с iSCSI . Хорошим примером драйверов виртуальных устройств могут быть Daemon Tools .
Существует несколько вариантов драйверов виртуальных устройств, таких как VxD , VLM и VDD.
Описания наиболее часто используемых драйверов устройств Solaris :
Устройство на шине PCI или USB идентифицируется двумя идентификаторами, каждый из которых состоит из 4 шестнадцатеричных чисел. Идентификатор поставщика идентифицирует поставщика устройства. Идентификатор устройства идентифицирует конкретное устройство от этого производителя/поставщика.
Устройство PCI часто имеет пару идентификаторов для основного чипа устройства, а также пару идентификаторов подсистемы, которая идентифицирует поставщика, который может отличаться от производителя чипа.
Устройства часто имеют большое количество разнообразных и настраиваемых драйверов устройств, работающих в ядре операционной системы (ОС), и часто содержат различные ошибки и уязвимости , что делает их мишенью для эксплойтов . [17] Принесите свой собственный уязвимый драйвер (BYOVD) использует подписанные старые драйверы, содержащие недостатки, которые позволяют хакерам вставлять вредоносный код в ядро. [18]
Существует нехватка эффективных инструментов обнаружения уязвимостей ядра, особенно для операционных систем с закрытым исходным кодом, таких как Microsoft Windows [19] , где исходный код драйверов устройств в основном не является общедоступным (с открытым исходным кодом) [20] и драйверы часто также имеют множество привилегии. [21] [22] [23] [24]
Подобные уязвимости также существуют в драйверах ноутбуков, [25] драйверах Wi-Fi и Bluetooth, [26] [27] игровых/графических драйверах, [28] и драйверах принтеров. [29]
Группа исследователей безопасности считает отсутствие изоляции одним из основных факторов , подрывающих безопасность ядра , [30] и опубликовала структуру изоляции для защиты ядер операционной системы, в первую очередь монолитного ядра Linux , которое, по их словам, получает ~80 000 коммитов / год своим водителям. [31] [32]
Важным фактором при проектировании ядра является поддержка, которую оно обеспечивает для защиты от ошибок ( отказоустойчивость ) и от вредоносного поведения ( безопасность ). Эти два аспекта обычно четко не разграничиваются, и принятие этого разграничения при проектировании ядра приводит к отказу от иерархической структуры защиты . [33]
Механизмы или политики, предоставляемые ядром, можно классифицировать по нескольким критериям, включая: статические (применяются во время компиляции ) или динамические (применяются во время выполнения ); упреждающее или постобнаружение; в соответствии с принципами защиты, которым они удовлетворяют (например, Деннинг [34] [35] ); поддерживаются ли они аппаратно или на основе языка; являются ли они скорее открытым механизмом или обязательной политикой; и многое другое.Драйверы для контроллеров HP (ранее Compaq) Smart Array, которые обеспечивают возможность аппаратного RAID.
{{cite book}}
: |work=
игнорируется ( помощь ) [ постоянная мертвая ссылка ]Улучшенный модуль Gigabaud Link (GLM) предназначен для двунаправленной передачи данных между хост-устройством и последовательной средой передачи.