Что такое драйвер?

Сложно дать одно точное определение термина "драйвер". В самом фундаментальном смысле драйвер — это программный компонент, который позволяет операционной системе и устройству взаимодействовать друг с другом.

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

Схема: приложение, операционная система и драйвер.

Развертывание определения

Наше объяснение до сих пор упрощено несколькими способами:

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

    Во многих случаях устройство разработано в соответствии с опубликованным стандартом оборудования. Таким образом, драйвер может быть написан корпорацией Майкрософт, и конструктор устройств не должен предоставлять драйвер.

  • Не все драйверы взаимодействуют напрямую с устройством.

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

    Схема: приложение, операционная система, три драйвера и устройство.

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

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

    Дополнительные сведения о стеках см. в разделе Стеки драйверов.

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

Мы можем расширить определение драйвера , заявив, что драйвер — это любой программный компонент, который наблюдает или участвует в обмене данными между операционной системой и устройством.

Драйверы программного обеспечения

Наше расширенное определение является достаточно точным, но по-прежнему неполным, так как некоторые драйверы вообще не связаны с каким-либо аппаратным устройством.

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

На этой схеме показано приложение в пользовательском режиме, взаимодействующее с программным драйвером в режиме ядра.

Схема, показывающая приложение и программный драйвер.

Программные драйверы всегда работают в режиме ядра. Основной причиной написания программного драйвера является получение доступа к защищенным данным, доступным только в режиме ядра. Однако драйверам устройств не всегда требуется доступ к данным и ресурсам в режиме ядра. Поэтому некоторые драйверы устройств работают в пользовательском режиме.

Дополнительные сведения о режимах процессора см. в разделах Пользовательский режим и Режим ядра.

Водители автобусов

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

Сведения о деревьях устройств, узлах устройств и драйверах шины см. в разделе Узлы устройств и стеки устройств.

Дополнительные сведения о драйверах функций

Наше объяснение до сих пор упрощено определение драйвера функции. Мы сказали, что драйвер-функция для устройства — это драйвер в стеке, который напрямую взаимодействует с устройством. Это верно для устройства, которое подключается напрямую к шине PCI. Драйвер функции для устройства PCI получает адреса, сопоставленные с ресурсами порта и памяти на устройстве. Драйвер функции напрямую взаимодействует с устройством, записывая их на эти адреса.

Однако во многих случаях устройство не подключается напрямую к шине PCI. Вместо этого устройство подключается к адаптеру шины узла, который подключен к шине PCI. Например, USB-тостер подключается к адаптеру шины узла (называемому контроллером узла USB), который подключен к шине PCI. Usb-тостер имеет драйвер функции, а USB-контроллер узла также имеет драйвер функции. Драйвер функции для тостера косвенно взаимодействует с тостером, отправляя запрос драйверу функции для контроллера узла USB. Затем драйвер функции для хост-контроллера USB взаимодействует напрямую с оборудованием USB-контроллера узла, которое взаимодействует с тостером.

Схема: драйверы USB-тостера и драйвер хост-контроллера USB.