I/O 队列的电源管理

当框架收到定向到某个驱动程序设备的 i/o 请求时,框架会将该请求放入 i/o 队列。 驱动程序可通过提供请求处理程序或轮询队列来从 i/o 队列获取 i/o 请求。 有关 i/o 队列的详细信息,请参阅 框架队列对象

设计驱动程序时,应将驱动程序将接收的 i/o 请求分组为两个类别:

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

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

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

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

为了支持这两种类型的请求,该框架提供了两种类型的 i/o 队列: 电源管理 的 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