Из предыдущей статьи мы узнали про подсистему ввода / вывода. А в этой разберем один из её компонентов, а именно PnP диспетчер.
PnP-диспетчер
PnP-диспетчер является основным компонентом Windows, который позволяет распознавать подключаемое оборудование и производить с ним некоторые действия.
Поддержка технологии PnP основывается на промышленных стандартах подключаемых к шинам устройств. Например в стандарте USB заложен способ самоидентификации устройств подключенных к шине USB.
PnP-диспетчер реализует следующие возможности:
- Распознает устройства подключенные при загрузке системы, а также при подключении нового оборудования и при его отключении.
- Собирает об устройствах информацию и на её основе выделяет ресурсы для каждого устройства. Ресурсами могут быть: прерывания, диапазон адресов ввода / вывода, регистры ввода / вывода, ресурсы шины и так далее.
- Загружает соответствующие драйвера в систему. Если драйвер есть в системе, он будет загружен. Если подходящего драйвера нет, пользователя попросят указать местоположение драйвера, для его установки.
- Поддерживает сетевые устройства, например принтеры или проекторы. Для этого специальные драйверы шины распознают сеть как шину, и подключают к этой шине сетевые устройства.
Помимо того что система поддерживает PnP, сами драйверы должны поддерживать эту технологию. Если в системе будет драйвер без поддержки PnP, то он может помешать работе всей системе. Так как PnP-диспетчер занимается распределением ресурсов для оборудования и нечего не знает про не PnP-драйвер, то могут возникнуть конфликты. Кроме того, драйверы без поддержки PnP могут помешать системе перейти в спящий режим или режим гибернации.
Перечисление устройств
Перечисление устройств происходит при:
- загрузке системы,
- возобновлении из гибернации,
- получении явного распоряжения, например при нажатии кнопки «Обновить конфигурацию оборудования» в «Диспетчере устройств».
PnP-диспетчер начинает перечисление устройств с виртуального драйвера шины root, который представляет всю систему и играет роль драйвера шины для не PnP-устройств и для абстрактных объектов HAL.
HAL действует как драйвер шины для устройств напрямую подключенных к материнской плате (обычно это шина PCI).
Также корневой драйвер шины обнаруживает другие шины, и вот на этих шинах PnP-диспетчер обнаруживает подключенное оборудование с поддержкой PnP. По мере поступления информации от драйверов шин об обнаруженных устройствах формируется дерево устройств.
В свойствах устройства, в «Диспетчере устройств» можно посмотреть различные сведения об устройстве:
Стек устройств
Есть еще такое понятие — стек устройства. Стек строится снизу вверх, стек каждого устройства состоит как минимум из двух объектов. Внизу драйвер шины создает PDO (Physical Device Object), вверху объект FDO (Functional Device Object) — функциональный драйвер. Между PDO и FDO могут быть различные фильтры (поддраверы). Например:
- снизу PDO — драйвер шины USB,
- сверху FDO — драйвер мышки.
Вот еще пример (с фильтрами):
- снизу PDO — драйвер шины USB,
- далее фильтр — драйвер микрофона,
- затем еще один фильтр — драйвер камеры,
- далее FDO — функциональный драйвер веб камеры.
Реестр для PnP-диспетчера
PnP-диспетчер знает кому какой драйвер нужен благодаря информации из реестра. Вот основные ветки:
- HKLM\System\CurrentControlSet\Enum — известные типы устройств;
- HKLM\System\CurrentControlSet\Control\Class — настройки устройств;
- HKLM\System\CurrentControlSet\Services — настройки драйверов.
Когда драйвер шины обнаруживает новое устройство, он сначала создает PDO, затем оповещает о новом устройстве PnP-диспетчер. Тот в ответ запрашивает у драйвера шины идентификатор устройства и идентификатор экземпляра устройства (чтобы различить два одинаковых устройства). И далее PnP-диспетчер загружает необходимые драйвера (FDO) и фильтры (список берется из реестра). Так создается стек устройства.