Управление питанием для очередей ввода-вывода
Когда платформа получает запрос ввода-вывода, направленный на одно из устройств драйвера, платформа помещает запрос в очередь ввода-вывода. Драйвер может получать запросы ввода-вывода из очереди ввода-вывода, предоставляя обработчики запросов или опрашив очередь. Дополнительные сведения об очередях ввода-вывода см. в разделе Объекты очередей платформы.
При разработке драйвера следует сгруппировать запросы ввода-вывода, которые будет получать драйвер, в две категории:
Запросы, требующие, чтобы устройство было в рабочем (D0) состоянии, в том числе:
- Запросы на чтение или запись, требующие, чтобы драйвер функции устройства считывал данные с устройства или записывывайте данные на устройство.
- Управление устройством запрашивает, что драйвер функции или шины не может обслужить без доступа к устройству.
Запросы, которые не требуют, чтобы устройство было в рабочем (D0) состоянии, в том числе:
- Управление устройством запрашивает, что драйвер функции или шины может обслуживать без доступа к устройству.
- Возможно, все запросы, которые получает драйвер фильтра.
- Все запросы, которые получают все драйверы в стеке драйверов, если стек поддерживает программное устройство, которое не взаимодействует с каким-либо оборудованием.
Если вы не пишете драйвер фильтра или драйвер для стека, который не взаимодействует с оборудованием, скорее всего, ваш драйвер будет получать некоторые запросы, требующие, чтобы устройство было в рабочем состоянии, а некоторые — нет.
Для поддержки этих двух типов запросов платформа предоставляет два типа очередей ввода-вывода: те, которые управляются питанием , и те, которые не являются. Когда драйвер создает каждую из своих очередей ввода-вывода, он задает элемент PowerManaged в структуре WDF_IO_QUEUE_CONFIG очереди как WdfTrue или WdfFalse , чтобы указать одно из следующих значений:
Если драйвер задает для Параметра PowerManaged значение WdfTrue, очередь управляется питанием.
Когда запросы ввода-вывода доступны в очереди, управляемой питанием, платформа доставляет запросы драйверу только в том случае, если устройство находится в рабочем (D0) состоянии. Поэтому всякий раз, когда драйвер получает запрос из очереди, управляемой питанием, платформа гарантирует доступность устройства. Если устройство не находится в рабочем состоянии, платформа сохраняет запросы в очереди, пока устройство не станет доступным.
Если устройство находится в состоянии с низким энергопотреблением, так как оно бездействует, и если платформа помещает запрос ввода-вывода в одну из очередей, управляемых питанием драйвера, платформа просит стек драйверов восстановить устройство до его рабочего состояния, прежде чем он доставляет запрос вашему драйверу.
Если устройство находится в состоянии с низким энергопотреблением, так как система не находится в рабочем (S0) состоянии, и если платформа помещает запрос ввода-вывода в одну из очередей, управляемых питанием вашего драйвера, платформа ожидает, пока устройство вернется в рабочее (D0) состояние, а затем доставляет запрос вашему драйверу.
Так как платформа не доставляет драйверу запросы ввода-вывода из очереди, управляемой питанием, если устройство не находится в рабочем состоянии, драйверы, расположенные надвладельцем политики питанияв стеке драйверов, не должны использовать очереди ввода-вывода, управляемые питанием. Если драйвер, расположенный над владельцем политики управления питанием, использует очередь, управляемую питанием, и если устройство находится в состоянии с низким энергопотреблением, драйвер не получает запрос и не может передать его владельцу политики питания. Поэтому владелец политики управления питанием, который управляет состоянием питания устройства, не выводит устройство из спящего режима.
Если драйвер задает для PowerManaged значение WdfFalse, очередь не управляется питанием.
Если запросы ввода-вывода доступны в очереди, которая не управляется питанием, платформа доставляет запросы драйверу независимо от того, находится ли устройство в рабочем (D0) состоянии. Если вы настроили очередь так, чтобы она получала только запросы, не требующие доступа к устройству, драйвер может обслуживать каждый запрос, даже если устройство недоступно.
Дополнительные сведения об управляемых питанием очередях ввода-вывода см. в статье Использование Power-Managed очередей ввода-вывода.
Для некоторых драйверов требуется прямой контроль над Plug and Play (PnP) и операциями управления питанием. Эти драйверы могут использовать самоуправляемые ввод-вывод. Дополнительные сведения см. в разделе Использование Self-Managed ввода-вывода.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по