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


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

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

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

  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 ввода-вывода".