Что такое драйвер
Понять, что такое
драйвер, мы попробуем на типовом примере взаимодействия прикладной программы
с драйвером.
Код прикладной программы исполняется в пользовательском режиме работы
процессора. В этом случае имеется ряд серьезных ограничений, связанных
с доступом к памяти, аппаратным обеспечением и привилегированными инструкциями
процессора. Когда возникает необходимость в преодолении этих ограничений,
прикладная программа обращается к ядру ОС, код которого исполняется процессором
в режиме ядра. Режим ядра лишен всех упомянутых ограничений. Для расширения
функциональных возможностей ядра служат драйверы ядра (kernel mode drivers).
Как они работают?
В отличие от прикладной программы, драйвер не является процессом и не
имеет потока исполнения. Вместо этого любая функция драйвера выполняется
в контексте того потока и процесса, в котором она была вызвана. При этом
вызов может происходить от прикладной программы или драйвера, либо возникать
в результате прерывания. В первом случае контекст исполнения драйвера
точно известен - это прикладная программа. В третьем случае контекст исполнения
случайный, поскольку прерывание (и, соответственно, исполнение кода драйвера)
может произойти при выполнении любой прикладной программы. Во втором случае
контекст исполнения может быть как известным, так и случайным - это зависит
от контекста исполнения функции вызывающего драйвера.
Под вызовом драйвера здесь подразумевается не обычный вызов функции, а
передача так называемого запроса ввода/вывода.
Различают несколько классов драйверов:
- Драйвер, получающий запросы ввода/вывода из прикладной программы, называют драйвером высшего уровня. Если такой драйвер не пользуется услугами других драйверов, он называется монолитным.
- Драйвер, получающий запросы ввода/вывода от другого драйвера, называют промежуточным, если он пользуется услугами других драйверов, или драйвером низшего уровня, если он не пользуется услугами других драйверов.