Управление питанием для очередей ввода-вывода

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

При разработке драйвера следует сгруппировать запросы ввода-вывода, которые будет получать драйвер, в две категории:

  1. Запросы, требующие, чтобы устройство было в рабочем (D0) состоянии, в том числе:

    • Запросы на чтение или запись, требующие, чтобы драйвер функции устройства считывал данные с устройства или записывывайте данные на устройство.
    • Управление устройством запрашивает, что драйвер функции или шины не может обслужить без доступа к устройству.
  2. Запросы, которые не требуют, чтобы устройство было в рабочем (D0) состоянии, в том числе:

    • Управление устройством запрашивает, что драйвер функции или шины может обслуживать без доступа к устройству.
    • Возможно, все запросы, которые получает драйвер фильтра.
    • Все запросы, которые получают все драйверы в стеке драйверов, если стек поддерживает программное устройство, которое не взаимодействует с каким-либо оборудованием.

Если вы не пишете драйвер фильтра или драйвер для стека, который не взаимодействует с оборудованием, скорее всего, ваш драйвер будет получать некоторые запросы, требующие, чтобы устройство было в рабочем состоянии, а некоторые — нет.

Для поддержки этих двух типов запросов платформа предоставляет два типа очередей ввода-вывода: те, которые управляются питанием , и те, которые не являются. Когда драйвер создает каждую из своих очередей ввода-вывода, он задает элемент PowerManaged в структуре WDF_IO_QUEUE_CONFIG очереди как WdfTrue или WdfFalse , чтобы указать одно из следующих значений:

  • Если драйвер задает для Параметра PowerManaged значение WdfTrue, очередь управляется питанием.

    Когда запросы ввода-вывода доступны в очереди, управляемой питанием, платформа доставляет запросы драйверу только в том случае, если устройство находится в рабочем (D0) состоянии. Поэтому всякий раз, когда драйвер получает запрос из очереди, управляемой питанием, платформа гарантирует доступность устройства. Если устройство не находится в рабочем состоянии, платформа сохраняет запросы в очереди, пока устройство не станет доступным.

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

    Если устройство находится в состоянии с низким энергопотреблением, так как система не находится в рабочем (S0) состоянии, и если платформа помещает запрос ввода-вывода в одну из очередей, управляемых питанием вашего драйвера, платформа ожидает, пока устройство вернется в рабочее (D0) состояние, а затем доставляет запрос вашему драйверу.

    Так как платформа не доставляет драйверу запросы ввода-вывода из очереди, управляемой питанием, если устройство не находится в рабочем состоянии, драйверы, расположенные надвладельцем политики питанияв стеке драйверов, не должны использовать очереди ввода-вывода, управляемые питанием. Если драйвер, расположенный над владельцем политики управления питанием, использует очередь, управляемую питанием, и если устройство находится в состоянии с низким энергопотреблением, драйвер не получает запрос и не может передать его владельцу политики питания. Поэтому владелец политики управления питанием, который управляет состоянием питания устройства, не выводит устройство из спящего режима.

  • Если драйвер задает для PowerManaged значение WdfFalse, очередь не управляется питанием.

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

Дополнительные сведения об управляемых питанием очередях ввода-вывода см. в статье Использование Power-Managed очередей ввода-вывода.

Для некоторых драйверов требуется прямой контроль над Plug and Play (PnP) и операциями управления питанием. Эти драйверы могут использовать самоуправляемые ввод-вывод. Дополнительные сведения см. в разделе Использование Self-Managed ввода-вывода.