I/O 队列的电源管理

当框架收到定向到驱动程序设备之一的 I/O 请求时,框架会将该请求置于 I/O 队列中。 驱动程序可以通过提供请求处理程序或轮询队列从 I/O 队列获取 I/O 请求。 有关 I/O 队列的详细信息,请参阅 框架队列对象

在设计驱动程序时,应将驱动程序收到的 I/O 请求分为两类:

  1. 要求设备处于其工作 (D0) 状态的请求,包括:

    • 需要设备函数驱动程序从设备读取数据或向设备写入数据的读取或写入请求。
    • 设备控制请求函数或总线驱动程序在没有访问设备的情况下无法提供服务。
  2. 不需要设备处于其工作状态的请求 (D0) 状态,包括:

    • 设备控制请求函数或总线驱动程序可以在不访问设备的情况下提供服务。
    • 可能是筛选器驱动程序接收的所有请求。
    • 驱动程序堆栈中所有驱动程序接收的所有请求(如果堆栈支持不与任何硬件通信的仅限软件的设备)。

除非你正在为不与硬件通信的堆栈编写筛选器驱动程序,否则驱动程序可能会收到一些要求设备处于其工作状态的请求,以及一些不工作的请求。

为了支持这两种类型的请求,框架提供了两种类型的 I/O 队列:电源管理的队列和未 托管 的 I/O 队列。 当驱动程序创建其每个 I/O 队列时,它会将队列WDF_IO_QUEUE_CONFIG结构中的 PowerManaged 成员设置为 WdfTrueWdfFalse 以指示以下其中一项:

  • 如果驱动程序将 PowerManaged 设置为 WdfTrue,则队列由电源管理。

    当 I/O 请求在电源托管队列中可用时,框架仅当设备处于其工作 (D0) 状态时,才会将请求传送到驱动程序。 因此,每当驱动程序收到来自电源托管队列的请求时,框架都保证设备可用。 如果设备未处于工作状态,框架会将请求存储在队列中,直到设备可用。

    如果设备由于处于空闲状态而处于低功耗状态,并且框架将 I/O 请求置于驱动程序的电源托管队列之一中,框架会要求驱动程序堆栈在将请求传递到驱动程序之前将设备还原到其工作状态。

    如果设备由于系统不处于工作 (S0) 状态而处于低功耗状态,并且如果框架将 I/O 请求放入驱动程序的电源管理队列之一,框架将等待,直到设备返回到其工作 (D0) 状态,然后将请求传递给驱动程序。

    由于如果设备未处于工作状态,框架不会将 I/O 请求从电源管理的队列传递到驱动程序,因此位于驱动程序堆栈中电源策略所有者上方的驱动程序不得使用电源管理的 I/O 队列。 如果位于电源策略所有者上方的驱动程序使用电源管理的队列,并且设备处于低功耗状态,则驱动程序不会接收请求,并且无法将其传递给电源策略所有者。 因此,控制设备的电源状态的电源策略所有者不会唤醒设备。

  • 如果驱动程序将 PowerManaged 设置为 WdfFalse,则队列不是电源管理的。

    当 I/O 请求在非电源管理的队列中可用时,框架会将请求传递给驱动程序,而不考虑设备是否处于其工作 (D0) 状态。 如果已将队列设置为仅接收不需要访问设备的请求,则即使设备不可用,驱动程序也可以处理每个请求。

有关电源管理的 I/O 队列的详细信息,请参阅 使用 Power-Managed I/O 队列

一些驱动程序需要对即插即用 (PnP) 和电源管理操作进行一些直接控制。 这些驱动程序可以使用 自我管理的 I/O。 有关详细信息,请参阅 使用 Self-Managed I/O