Поделиться через


Стеки драйверов

Большинство запросов, отправляемых драйверам устройств, упаковываются в пакеты запросов ввода-вывода (IRPs). Каждое устройство представлено узлом устройства, а каждый узел устройства имеет стек устройств. Дополнительные сведения см. в разделе "Узлы устройств" и стеки устройств. Чтобы отправить запрос на чтение, запись или управление на устройство, диспетчер ввода-вывода находит узел устройства для устройства, а затем отправляет IRP в стек устройств этого узла. Иногда несколько стеков устройств участвуют в обработке запроса ввода-вывода. Независимо от того, сколько стеков устройств задействовано, общая последовательность драйверов, участвующих в запросе ввода-вывода, называется стеком драйверов для запроса. Мы также используем стек драйверов терминов для ссылки на многоуровневый набор драйверов для определенной технологии.

Запросы ввода-вывода, обрабатываемые несколькими стеками устройств

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

схема четырех узлов устройств, каждая из которых содержит стек устройств.

Ниже показано, как IRP обрабатывается на каждом нумерованном этапе на схеме:

  1. IRP создается Disk.sys, который является драйвером функции в стеке устройств для узла устройства хранилища USB. Disk.sys передает IRP вниз по стеку устройств в Usbstor.sys.

  2. Обратите внимание, что Usbstor.sys является драйвером PDO для узла устройства хранилища USB и драйвера FDO для узла устройства хранилища USB. На этом этапе не важно решить, принадлежит ли IRP парой (PDO, Usbstor.sys) или парой FDO, Usbstor.sys. IRP принадлежит драйверу, Usbstor.sys, и драйвер имеет доступ как к PDO, так и к FDO.

  3. Когда Usbstor.sys завершит обработку IRP, он передает IRP в Usbhub.sys. Usbhub.sys — это драйвер PDO для узла устройства хранилища usb и драйвера FDO для узла корневого концентратора USB. Не важно решить, принадлежит ли IRP парой (PDO, Usbhub.sys) или парой FDO, Usbhub.sys. IRP принадлежит драйверу, Usbhub.sys, а драйвер имеет доступ как к PDO, так и к FDO.

  4. Когда Usbhub.sys завершит обработку IRP, он передает IRP в пару (Usbuhci.sys, Usbport.sys).

    Usbuhci.sys является драйвером минипорта, и Usbport.sys является драйвером порта. Пара (минипорт, порт) играет роль одного драйвера. В этом случае драйвер минипорта и драйвер порта написаны корпорацией Майкрософт. Пара (Usbuhci.sys, Usbport.sys) — это драйвер PDO для узла КОРНЕВОго концентратора USB, а пара (Usbuhci.sys, Usbport.sys) также является драйвером FDO для узла контроллера USB-узла. Пара (Usbuhci.sys, Usbport.sys) выполняет фактическое взаимодействие с оборудованием контроллера узла, которое, в свою очередь, взаимодействует с физическим USB-устройством хранения.

Стек драйверов для запроса ввода-вывода

Рассмотрим последовательность четырех драйверов, участвующих в запросе ввода-вывода, показанном на предыдущей схеме. Мы можем получить другое представление последовательности, сосредоточив внимание на драйверах, а не на узлах устройства и их отдельных стеках устройств. На следующей схеме показаны драйверы последовательности сверху вниз. Обратите внимание, что Disk.sys связан с одним объектом устройства, но каждый из трех других драйверов связан с двумя объектами устройства.

схема стека драйверов, показывающая верхний драйвер, связанный только с fdo, и остальные три драйвера, связанные с pdo и fdo.

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

Обратите внимание, что стек драйверов для запроса ввода-вывода отличается от стека устройств для узла устройства. Кроме того, обратите внимание, что стек драйверов для запроса ввода-вывода не обязательно остается в одной ветви дерева устройств.

Стеки драйверов технологий

Рассмотрим стек драйверов для запроса ввода-вывода, показанного на предыдущей схеме. Если присвоить каждому из драйверов понятное имя и внести некоторые незначительные изменения в схему, у нас есть блок-схема, аналогичная многим из тех, которые отображаются в документации по комплекту драйверов Windows (WDK).

Схема стека драйверов с понятными именами драйверов: драйвер класса диска сверху, за которым следует драйвер порта usb, а затем драйвер usb hub и драйвер usb-концентратора (usb 2 минипорт, usb-порт).

На схеме стек драйверов разделен на три раздела. Мы можем рассматривать каждый раздел как принадлежащий определенной технологии или к определенному компоненту или части операционной системы. Например, можно сказать, что первый раздел в верхней части стека драйверов принадлежит диспетчеру томов, второй раздел принадлежит компоненту хранилища операционной системы, а третий раздел принадлежит основной части USB операционной системы.

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

схема, показывающая стек драйверов технологии для возможного блока usb-ядра.

Блок-схема, показывающая все драйверы для определенной технологии или определенного компонента или части операционной системы, называется стеком драйверов технологии. Как правило, стеки драйверов технологии имеют такие имена, как стек драйверов USB Core, стек носителей, стек драйверов 1394 и стек звуковых драйверов.

Примечание. Схема блоков USB-ядра в этой статье показывает один из возможных способов проиллюстрировать стеки драйверов технологии для USB 1.0 и 2.0. Официальные схемы стека драйверов USB 1.0, 2.0 и 3.0 см. в разделе "Архитектура стека драйверов USB".

Узлы устройств и стеки устройств

Мини-drivers и пары драйверов

Основные понятия для всех разработчиков драйверов