I/O キューの電源管理
フレームワークは、ドライバーのデバイスの 1 つに送信された I/O リクエストを受信すると、フレームワークは I/O キューにリクエストを入れます。 ドライバーは、リクエストハンドラーを提供するか、キューをポーリングすることによって、I/O キューから I/O リクエストを取得できます。 I/Oキューの詳細については、フレームワーク キュー オブジェクトをご参照ください。
ドライバーを設計するときは、ドライバーが受信する I/O リクエストを次の 2 つのカテゴリにグループ化する必要があります:
デバイスを動作中 (D0) 状態にする必要があるリクエストには、次のものが含まれます:
- デバイスの関数 ドライバーがデバイスからデータを読み取ったり、デバイスにデータを書き込んだりする必要がある読み取りまたは書き込みリクエスト。
- デバイスにアクセスしないと関数またはバス ドライバーがサービスを提供できないデバイス制御リクエスト。
デバイスを動作中 (D0) 状態にする必要がないリクエストには、次のものが含まれます:
- デバイスにアクセスしなくても関数またはバス ドライバーがサービスを提供できるデバイス制御リクエスト。
- おそらく、フィルター ドライバーが受信するすべてのリクエスト。
- スタックがハードウェアと通信しないソフトウェアのみのデバイスをサポートしている場合の、ドライバー スタック内のすべてのドライバーが受信するすべてのリクエスト。
フィルター ドライバーや、ハードウェアと通信しないスタックのドライバーを書かない限り、ドライバーは、デバイスを動作状態にする必要があるいくつかのリクエストを受信する可能性があります。そうでないものもあります。
この 2 つのタイプのリクエストをサポートするために、フレームワークは、電源管理された I/O キューとそうでない I/O キューの 2 つのタイプを提供します。 ドライバーは、各 I/O キューを作成するときに、次のいずれかを示すために、キューのWDF_IO_QUEUE_CONFIG 構造のPowerManagedメンバーを WdfTrue またはWdfFalse に設定します。
ドライバーが PowerManagedをWdfTrueに設定する場合、キューは電源管理されます。
電源管理キューで I/O リクエストを使用できる場合、フレームワークは、デバイスが動作中 (D0) 状態の場合にのみ、ドライバーにリクエストを配信します。 そのため、ドライバーが電源管理されたキューからリクエストを受信するたびに、フレームワークはデバイスが使用可能であることを保証します。 デバイスが動作状態でない場合、フレームワークはデバイスが使用可能になるまでキューにリクエストを格納します。
デバイスがアイドルのため低電力状態にある場合と、フレームワークがドライバーのいずれかの電源管理されたキューに I/O リクエストを配置した場合、フレームワークはドライバーにリクエストを配信する前に、デバイスを動作状態に復元するようにドライバー スタックに要求します。
システムが動作中 (S0) 状態ではないためにデバイスが低電力状態にある場合と、フレームワークがドライバーの電源管理されたキューのいずれかに I/O リクエストを配置した場合、フレームワークはデバイスが動作中 (D0) 状態に戻るまで待機し、そしてそのリクエストをドライバーに配信します。
デバイスが動作状態でない場合、フレームワークは電源管理キューからドライバーに I/O 要求を配信しないため、ドライバー スタック内の 電源ポリシー所有者 上にあるドライバーは、電源マネージド I/O キューを使用できません。 電源ポリシー所有者の上にあるドライバーが電源管理されたキューを使用する場合と、デバイスが低電力状態の場合、ドライバーはリクエストを受信し、電源ポリシー所有者に渡すことはできません。 そのため、デバイスの電源状態を制御する電源ポリシー所有者は、デバイスをウェイクアップしません。
ドライバーがPowerManagedをWdfFalseに設定する場合、キューは電源管理されません。
電源管理されていないキューで I/O リクエストを使用できる場合、フレームワークは、デバイスが動作中 (D0) 状態であるかどうかに関係なく、ドライバーにリクエストを配信します。 デバイスへのアクセスを必要としないリクエストのみを受信するようにキューを設定している場合、ドライバーは、デバイスが使用できない場合でも、各リクエストを処理できます。
電源管理された I/O キューの詳細については、Using Power-Managed I/O Queuesをご参照ください。
いくつかのドライバーでは、プラグ アンド プレイ (PnP) と電源管理操作を直接制御する必要があります。 これらのドライバーは、自己管理 されたI/Oを使用できます。 詳細については、Using Self-Managed I/Oをご参照ください。