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

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

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

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

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

Вот как IRP обрабатывается на каждом этапе нумерованного на схеме:

  1. IRP создается Disk.sys, которая является драйвером-функцией в стеке устройств для узла My USB Storage Device (Устройство хранилища USB). Disk.sys передает IRP в стек устройств в Usbstor.sys.

  2. Обратите внимание, что Usbstor.sys является драйвером PDO для узла My USB Storage Device и драйвером FDO для узла ЗАПОМИНАющее устройство USB. На этом этапе не важно решать, принадлежит ли IRP паре (PDO, Usbstor.sys) или паре (FDO, Usbstor.sys). IRP принадлежит драйверу, Usbstor.sys, и драйвер имеет доступ к PDO и FDO.

  3. Когда Usbstor.sys завершит обработку 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, он передает его паре (Usbuhci.sys, Usbport.sys).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пары мини-драйверов и драйверов

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