Общие сведения об объектах контроллера
Как следует из названия, объект контроллера обычно представляет физический контроллер устройства с подключенными устройствами. Драйвер самого низкого уровня, отличный от WDM, для набора аналогичных устройств, координируемых физическим контроллером, может создать объект контроллера и использовать его для синхронизации операций ввода-вывода между подключенными устройствами. Драйвер реализует подпрограмму ControllerControl и вызывает подпрограммы поддержки объекта контроллера диспетчера ввода-вывода.
Примечание
Использование объектов контроллера не поддерживается в драйверах WDM.
Как правило, драйверы используют объекты контроллера для синхронизации операций с подключенными устройствами, если применяются следующие критерии:
Контроллер не выполняет длительные операции без прерывания, поэтому драйверу не нужно создавать выделенный для устройства поток или использовать потоки системных рабочих ролей.
Устройства, подключенные к контроллеру, похожи. То есть они не являются устройствами с совершенно разными физическими свойствами или функциональными возможностями, такими как клавиатура и мышь, которые могут быть подключены к клавиатуре и вспомогательному контроллеру устройства.
Драйвер разработан как монолитный: одноуровневый по отношению к контроллеру устройства и подключенным физическим устройствам, а не как драйвер порта (для контроллера) с одним или несколькими драйверами класса (для подключенных устройств), наложенными на драйвер порта.
Драйверы устройств с каналами ввода-вывода и набором логических объектов устройств также могут использовать объект контроллера для синхронизации операций ввода-вывода между или между каналами такого устройства.
Объект контроллера не имеет имени и, следовательно, не является целевым объектом для запросов ввода-вывода. Это просто механизм синхронизации для сериализации операций ввода-вывода из набора объектов устройства. Так как объект контроллера не имеет имени, он невидим для защищенных в пользовательском режиме подсистем, которые не могут выполнять запросы ввода-вывода устройства без получения дескриптора для файлового объекта, представляющего целевой объект устройства. Объект контроллера также невидим для драйверов более высокого уровня, которые не могут присоединять собственные объекты устройства к объекту контроллера. Иными словами, ни диспетчер операций ввода-вывода, ни драйвер более высокого уровня не могут настроить IRP, запрашивающий ввод-вывод, на устройстве, представленном объектом контроллера. Запросы ввода-вывода всегда выдаются объектам устройства. Только драйвер может использовать объект контроллера.
Синхронизация и перекрытие операций ввода-вывода
Монолитные драйверы физических устройств с такими функциями, как у контроллера диска AT, не обязаны использовать объект контроллера для синхронизации операций ввода-вывода устройства. Например, модуль записи драйверов может попробовать не использовать объект контроллера, а использовать следующий метод синхронизации:
Настройка именованных объектов устройств для представления устройств, которые являются целевыми объектами для запросов ввода-вывода.
Храните сведения о состоянии (например, набор флагов "Занято устройство" в каждом расширении устройства или в одном расширении устройства), указывающие, какой объект устройства является целевым объектом текущей операции ввода-вывода.
Выполняйте операции ввода-вывода для текущего занятого объекта устройства и повторно введите в очередь входящие irP для других объектов устройства до завершения текущего IRP.
Предыдущий метод синхронизации сериализует обработку IRP для всех целевых объектов устройства драйвера. Обратите внимание, что он также заставляет драйвер выполнить текущее IRP до того, как его подпрограмма StartIo сможет начать обработку следующего IRP, что, к сожалению, снижает производительность драйвера.
Если некоторые операции устройства могут перекрываться, использование объекта контроллера может увеличить пропускную способность ввода-вывода драйвера, так как этот метод синхронизации позволяет драйверу определить, может ли он перекрывать операции непосредственно перед настройкой физического устройства. Например, контроллер диска может позволить драйверу перекрывать операции поиска на одном диске с операциями чтения и записи на другом диске.
Кроме того, использование объекта контроллера — это относительно простой способ синхронизации операций ввода-вывода для нескольких целевых объектов устройства с помощью одного физического устройства, например контроллера диска "AT". Использование объекта контроллера позволяет монолитному драйверу синхронизировать операции ввода-вывода в наборе именованных объектов устройства без необходимости поддерживать состояние каждого устройства и контроллера устройства в одном или нескольких расширениях устройств, а также без необходимости повторной отправки irP.
Однако некоторые устройства, предназначенные для перекрывающих операций ввода-вывода, такие как полнодуплексные последовательные контроллеры или адаптеры master шины, обычно имеют драйверы, которые настраивают внутренние очереди для irP.