Прикладные программы, или приложения, относятся к верхнему уровню иерархии программных средств, который обеспечивает потребительские запросы пользователя. Они могут пользоваться сервисами операционной системы, BIOS, а также обращаться к аппаратным средствам компьютера напрямую, адресуясь к портам и ячейкам памяти.
Чем теснее взаимодействие прикладной программы с аппаратными средствами, тем эффективнее ее работа. Вызовы сервисов BIOS, а тем более операционной системы снижают эффективность исполнения программы. Однако использование сервисов благоприятно сказывается на совместимости программного обеспечения с аппаратными средствами компьютера. Прикладные программы обычно загружаются с устройств внешней памяти.
Драйверы устройств
Для нормального функционирования отдельных устройств компьютера требуются программные средства, в качестве которых используются драйверы. Драйвер представляет собой программный модуль, содержащий процедуры работы с различными аппаратными реализациями устройства. Например, дисплейный адаптер может иметь самые разные реализации – от первых монохромных адаптеров до современных видеокарт с трехмерными акселераторами. Основное требование к драйверу – безошибочное и быстрое выполнение требуемой процедуры. Для прикладных программ или операционной системы драйвер представляет собой набор сервисов (служебных функций). Для каждого сервиса известны:
Что такое драйвер и для чего он нужен
- • способ вызова – программное прерывание или точка входа в процедуру (подпрограмму);
- • местоположение входных и выходных данных.
Например, для дисплейных адаптеров базовые сервисы (очистка экрана, вывод символа в определенную позицию и др.) вызываются через прерывание Int 1 Oh. Это прерывание обслуживает BIOS. Параметры в адаптер передаются через регистры процессора.
В зависимости от типа установленного адаптера данный сервис будет обслуживаться либо системной BIOS, либо индивидуальной ROM BIOS, расположенной в самом адаптере (на графической карте). Драйверы, обслуживающие данный сервис, автоматически загружаются в оперативную память на этапе инициализации BIOS, т.е. их специально загружать не требуется. Однако более сложные сервисы дисплейных адаптеров, которыми, например, пользуются в Windows, реализуются отдельными драйверами. Эти драйверы загружаются на этапе установки операционной системы.
Производители аппаратных средств осуществляют поддержку своих изделий для постоянно меняющихся версий операционных систем и прикладных программ путем поставки новых драйверов.
Источник: studme.org
[1.2] Что такое драйвер, типы драйверов и характеристики [1.2.1] Что такое драйвер
Понять, что такое драйвер, попробуем на типовом примере взаимодействия прикладной программы с драйвером.
Код прикладной программы исполняется в пользовательском режиме работы процессора. В этом случае имеется ряд серьезных ограничений на доступ к памяти, аппаратному обеспечению и привилегированным инструкциям процессора. Когда возникает необходимость в преодолении этих ограничений, прикладная программа обращается к ядру ОС, код которого исполняется процессором в режиме ядра.
Что такое драйвер устройства?
Режим ядра лишен всех упомянутых ограничений. Для расширения функциональных возможностей ядра как раз и служат драйверы ядра (kernel mode drivers). Как они работают?
В отличие от прикладной программы, драйвер не является процессом, и не обладает потоком исполнения. Вместо этого любая функция драйвера выполняется в контексте того потока и процесса, в котором она была вызвана. При этом вызов может проистекать от прикладной программы, от драйвера, либо в результате прерывания.
В первом случае контекст исполнения драйвера точно известен – это прикладная программа. В третьем случае контекст исполнения случайный, поскольку прерывание (и, соответственно, исполнение кода драйвера) может произойти при выполнении любой прикладной программы. Во втором случае контекст исполнения может быть как известным, так и случайным, это зависит от контекста исполнения функции вызывающего драйвера.
Под вызовом драйвера здесь подразумевается не обычный вызов функции, а передача так называемого запроса в/в. Более подробно см. лекцию 6.
Различают несколько классов драйверов:
Драйвер, получающий запросы в/в из прикладной программы, называют драйвером высшего уровня. Если такой драйвер не пользуется услугами других драйверов, он называется монолитным.
Драйвер, получающий запросы в/в от другого драйвера, называют промежуточным, если он пользуется услугами других драйверов, или драйвером низшего уровня, если услугами других драйверов он не пользуется.
[1.2.2] Типы драйверов и характеристики
[Дополнительная информация] Ifs kit HelpKernel-Mode DriversDesign GuidePart1 General Kernel ModeWindows 2000 and WDM driversKinds of drivers или в DDK.
В NT существует 2 типа драйверов: драйверы пользовательского режима и драйверы режима ядра. В дальнейшем, говоря «драйвер», мы будем подразумевать драйверы режима ядра. Такие драйверы являются частью исполнительной системы, а более точно – элементами диспетчера в/в (архитектура NT и ее компоненты будут обсуждаться в лекции 2). Как следует из названия, при работе драйвера режима ядра процессор находится в режиме ядра (RING 0) – см. любой справочник по защищенному режиму работы процессора.
Драйвер NT располагается в файле с расширением .sys и имеет стандартный PE-формат (PE — Portable Executable).
Драйверы реализованы как самостоятельные модули с четко определенным интерфейсом взаимодействия с ОС. Все драйверы имеют определенный системой набор стандартных функций драйвера (standard driver routines) и некоторое число внутренних функций, определенных разработчиком.
Все драйверы режима ядра можно разбить на 3 типа:
- Драйверы высшего уровня (highest level drivers)
- Драйверы промежуточного уровня (intermediate drivers)
- Драйверы низшего уровня (lowest level drivers)
Как мы увидим в дальнейшем, такое разбиение обусловлено многоуровневой моделью драйверов (layered driver model). Для сохранения общности изложения, монолитный драйвер можно включить в эту схему, хотя он не использует многоуровневую архитектуру. В этом случае он будет «гибридом» – драйвером, принадлежащим одновременно к нескольким типам. Например, монолитный драйвер, имеющий интерфейс с приложением и осуществляющий доступ к оборудованию, будет одновременно и драйвером высшего, и драйвером низшего уровня.
Кроме того, в зависимости от назначения драйвера, он может являться каким либо специализированным драйвером, т.е. удовлетворять дополнительному набору требований к своей структуре. Можно привести следующие типы специализированных драйверов:
- Драйверы файловой системы
- Сетевые драйверы
Отдельно необходимо упомянуть архитектуру WDM – Windows Driver Model. Эта архитектура позволяет создавать драйверы для Windows 98 и Windows 2000, совместимые на уровне двоичного кода.
Можно привести следующие характеристики драйверов:
- Поддержка динамической загрузки и выгрузки (однако могут быть исключения)
- Необходимость следовать определенным протоколам взаимодействия с системой, нарушение которых чаще всего ведет к BSOD
- Возможность «наслоения» драйверов поверх друг друга. В Win2K эта возможность возведена в абсолют, хотя монолитные драйверы все еще поддерживаются
- Поскольку драйверы являются частью ядра ОС, они могут сделать с системой абсолютно все. Основная проблема – закрытость архитектуры ОС.
Источник: studfile.net
Иллюстрированный самоучитель по программированию систем защиты
Понять, что такое драйвер, мы попробуем на типовом примере взаимодействия прикладной программы с драйвером.
Код прикладной программы исполняется в пользовательском режиме работы процессора. В этом случае имеется ряд серьезных ограничений, связанных с доступом к памяти, аппаратным обеспечением и привилегированными инструкциями процессора.
Когда возникает необходимость в преодолении этих ограничений, прикладная программа обращается к ядру ОС, код которого исполняется процессором в режиме ядра. Режим ядра лишен всех упомянутых ограничений. Для расширения функциональных возможностей ядра служат драйверы ядра (kernel mode drivers). Как они работают?
В отличие от прикладной программы, драйвер не является процессом и не имеет потока исполнения. Вместо этого любая функция драйвера выполняется в контексте того потока и процесса, в котором она была вызвана. При этом вызов может происходить от прикладной программы или драйвера, либо возникать в результате прерывания.
В первом случае контекст исполнения драйвера точно известен – это прикладная программа. В третьем случае контекст исполнения случайный, поскольку прерывание (и, соответственно, исполнение кода драйвера) может произойти при выполнении любой прикладной программы. Во втором случае контекст исполнения может быть как известным, так и случайным – это зависит от контекста исполнения функции вызывающего драйвера.
Под вызовом драйвера здесь подразумевается не обычный вызов функции, а передача так называемого запроса ввода/вывода.
Различают несколько классов драйверов:
- Драйвер, получающий запросы ввода/вывода из прикладной программы, называют драйвером высшего уровня. Если такой драйвер не пользуется услугами других драйверов, он называется монолитным.
- Драйвер, получающий запросы ввода/вывода от другого драйвера, называют промежуточным, если он пользуется услугами других драйверов, или драйвером низшего уровня, если он не пользуется услугами других драйверов.
Источник: samoychiteli.ru