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


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

В Windows устройства представлены узлами устройств в дереве устройств Plug and Play (PnP). Как правило, при отправке запроса ввода-вывода на устройство несколько драйверов помогают обрабатывать запрос. Каждый из этих драйверов связан с объектом устройства, и объекты устройства расположены в стеке. Последовательность объектов устройств вместе с связанными драйверами называется стеком устройств. Каждый узел устройства имеет собственный стек устройств.

Узлы устройств и дерево устройств Plug and Play

Windows упорядочивает устройства в структуре дерева, называемой деревом устройств Plug and Playили просто деревом устройств. Как правило, узел в дереве устройств представляет устройство или отдельную функцию на составном устройстве. Однако некоторые узлы представляют программные компоненты, не имеющие связи с физическими устройствами.

Узел в дереве устройства называется узлом устройства. Корневой узел дерева устройств называется корневым узлом устройства. По соглашению узел корневого устройства рисуется в нижней части дерева устройства, как показано на следующей схеме.

схему дерева устройства, отображающую узлы устройства.

Дерево устройств иллюстрирует родительско-дочерние связи, свойственные PnP-среде. Несколько узлов в дереве устройств представляют автобусы с дочерними устройствами, подключенными к ним. Например, узел шины PCI представляет физическую шину PCI на материнской плате. Во время запуска диспетчер PnP просит водителя шины PCI перечислить устройства, подключенные к шине PCI. Эти устройства представлены дочерними узлами узла шины PCI. На предыдущей схеме узел шины PCI имеет дочерние узлы для нескольких устройств, подключенных к шине PCI, включая контроллеры USB-узла, звуковой контроллер и порт PCI Express.

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

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

Объекты устройств и стеки устройств

Объект устройства — это экземпляр структуры DEVICE_OBJECT. Каждый узел устройства в дереве устройств PnP имеет упорядоченный список объектов устройства, а каждый из этих объектов устройства связан с драйвером. Упорядоченный список объектов устройства вместе с связанными драйверами называется стеком устройств для узла устройства.

Вы можете думать о стеке устройств несколькими способами. В самом формальном смысле стек устройств — это упорядоченный список пар (объект устройства, драйвер). Однако в некоторых контекстах может оказаться полезным рассматривать стек устройств как упорядоченный список объектов устройства. В других контекстах может быть полезно рассматривать стек устройств как упорядоченный список драйверов.

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

На следующей схеме узел устройства Proseware Gizmo содержит стек устройств, содержащий три пары (объект устройства, драйвер). Верхний объект устройства связан с драйвером AfterThought.sys, средний объект устройства связан с драйвером Proseware.sys, а нижний объект устройства связан с драйвером Pci.sys. Узел шины PCI в центре схемы содержит стек устройств, содержащий две пары (объект устройства, драйвер) — объект устройства, связанный с Pci.sys и объектом устройства, связанным с Acpi.sys.

диаграмма, показывающая объекты устройств, упорядоченные в стеках устройств в узлах устройств proseware gizmo и pci.

Как создается стек устройств?

Во время запуска диспетчер PnP просит драйвер для каждой шины перечислить дочерние устройства, подключенные к шинам. Например, диспетчер PnP просит водителя шины PCI (Pci.sys) перечислить устройства, подключенные к шине PCI. В ответ на этот запрос Pci.sys создает объект устройства для каждого устройства, подключенного к шине PCI. Каждый из этих объектов устройства называется объектом физического устройства (PDO). Вскоре после того, как Pci.sys создает набор PDOS, дерево устройств выглядит так, как показано на следующей схеме.

диаграмма объектов узла PCI и физических устройств для дочерних устройств.

Диспетчер PnP связывает узел устройства с каждым созданным PDO и ищет в реестре, чтобы определить, какие драйверы должны быть частью стека устройств для узла. Стек устройств должен иметь один (и только один) функциональный драйвер и может иметь один или несколько фильтрующих драйверов . Драйвер функции является основным драйвером для стека устройств и отвечает за обработку запросов на чтение, запись и управление устройствами. Драйверы фильтров играют вспомогательные роли в обработке запросов на чтение, запись и управление устройствами. По мере загрузки каждой функции и драйвера фильтра он создает объект устройства и подключается к стеку устройств. Объект устройства, созданный драйвером функции, называется функциональным объектом устройства (FDO), а объект устройства, созданный драйвером фильтра, называется фильтрующим объектом устройства (Filter DO). Теперь дерево устройств выглядит примерно так, как на схеме.

схему дерева устройств, показывающую объекты фильтра, функций и физического устройства в узле устройства proseware gizmo.

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

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

Примечание При установке драйверов для устройства установщик использует сведения в файле сведений (INF), чтобы определить, какой драйвер является драйвером функции и какие драйверы являются фильтрами. Обычно INF-файл предоставляется корпорацией Майкрософт или поставщиком оборудования. После установки драйверов для устройства диспетчер PnP может определить функции и фильтры драйверов для устройства, выполнив поиск в реестре.

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

На приведенной выше схеме видно, что драйвер Pci.sys играет две роли. Во-первых, Pci.sys связана с FDO в узле устройства шины PCI. На самом деле он создал FDO в узле устройства PCI Bus. Таким образом, Pci.sys является драйвером функции для шины PCI. Во-вторых, Pci.sys связана с PDO в каждом дочернем узле шины PCI. Помните, что он создал PDOS для дочерних устройств. Драйвер, создающий PDO для узла устройства, называется драйвером шины для узла.

Если точка ссылки — шина PCI, то Pci.sys является драйвером функции. Но если ваша точка ссылки является устройством Proseware Gizmo, то Pci.sys является водителем автобуса. Эта двойная роль является типичной в дереве устройств PnP. Водитель, который служит водителем-функцией для автобуса, также служит водителем автобуса для дочернего устройства автобуса.

Стеки устройств в режиме пользователя

До сих пор мы обсуждали стеки устройств в режиме ядра. То есть драйверы в стеках выполняются в режиме ядра, а объекты устройства сопоставляются с системным пространством, которое доступно только коду в режиме ядра. Сведения о разнице между режимом ядра и пользовательским режимом см. в режиме пользователя и режиме ядра.

В некоторых случаях устройство имеет стек устройств в пользовательском режиме в дополнение к стеку устройств в режиме ядра. Драйверы пользовательского режима часто основаны на User-Mode Driver Framework (UMDF), которая является одной из моделей драйверов, предоставляемых Windows Driver Frameworks (WDF). В UMDF драйверы — это библиотеки DLL в пользовательском режиме, а объекты устройства — com-объекты, реализующие интерфейс IWDFDevice. Объект устройства в стеке устройств UMDF называется объектом устройства WDF (WDF DO).

На следующей схеме показан узел устройства, стек устройств в режиме ядра и стек устройств в пользовательском режиме для устройства USB-FX-2. Драйверы в стеках режима пользователя и режима ядра принимают участие в запросах ввода-вывода, направленных на устройство USB-FX-2.

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

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

стеков драйверов