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


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

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

Узлы устройств и дерево устройств самонастраивающийся

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

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

схема дерева устройств, на которой показаны узлы устройства.

Дерево устройств иллюстрирует связи родительских и дочерних элементов, которые присущи среде 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. Водитель, который служит водителем-функцией для автобуса, также служит водителем автобуса для дочернего устройства автобуса.

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

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

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

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

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

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

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