次の方法で共有


驚きの Wake-Up

驚きのウェイクアップは、D0 への予期しない移行です。 デバイスが D3cold に入ると、同じ電源レール上の別のデバイスのドライバーが D3cold から D0 への移行を要求すると、副作用として驚きのウェイクアップが発生する可能性があります。 最初のデバイスのドライバーは、デバイスが初期化されていない D0 状態のままにならないように、突然のウェイクアップの通知を受け取る必要があります。

デバイスが D3hot から D3cold に移行すると、他のいくつかのデバイスと共有する電源がオフになっている可能性があります。 これらのデバイスが D3cold に入ってからしばらくすると、いずれかのデバイスのドライバーが D0 への移行を要求する場合があります。 この要求に応じて、親バス ドライバーまたは ACPI フィルター ドライバーが電源をオンにし、電源を共有するすべてのデバイスは、既定の電源オン ハードウェアの状態を入力します。

この電源状態の変更を想定している唯一のデバイス ドライバーは、変更を要求したドライバーです。 他のデバイスのドライバーは、D0 で動作するようにデバイスを適切に初期化できるように、この変更の通知を受け取る必要があります。 この通知を受け取ることができるドライバーのみが、デバイスで D3cold を入力できるようにする必要があります。 それ以外の場合、ドライバーは、デバイスが D0 に入ったときに認識されません。

デバイスがオンになると、既定の初期化されていないハードウェア状態になります。 たとえば、 PCI Express Base 3.0 仕様 では、デバイスが最初に電源を受け取ったときに入力する D0 初期化されていない 状態が定義されています。 この状態の定義は PCI および PCI Express デバイスに固有ですが、他のバスに接続するデバイスは、電源が入ったときに同様のハードウェア状態を入力するように設計されています。

複数の機能を実装する PCI または PCI Express デバイスの場合、これらのデバイス機能は同じ電源レールを共有している可能性があります。 ただし、各関数には個別のドライバーがあり、これらの関数のドライバーが互いに直接通信する可能性はほとんどありません。 これらの関数のいずれかのドライバーが D3cold から D0 への電源状態の変更を要求する場合、他の関数のドライバーはこの変更を想定していません。 これらの他の関数が電源を受け取ったら、D0 で正常に動作するように関数を構成できるように、ドライバーに通知する必要があります。

バス ドライバーは、子デバイスの電源がオンになっていることを検出します。 このデバイスのファンクション ドライバーが D0 への移行を要求しなかった場合、バス ドライバーは、D0 で動作するようにデバイスを初期化する D0 電源 IRP (ターゲット状態 = PowerDeviceD0IRP_MN_SET_POWER要求) 自体を送信するようにデバイス ドライバーに求めます。 この初期化された D0 状態から、デバイス ドライバーはデバイスの D3hot への移行を開始できます。 デバイス ドライバーは、次の方法でバス ドライバーから D0 への突然の遷移の通知を受け取ることができます。

  • ランタイム電源管理フレームワーク (PoFx) のクライアントとして直接または間接的に自身を登録するデバイス ドライバーは、通知コールバックを受け取ります。
  • デバイスをスリープ解除する準備をするデバイス ドライバーの保留中の IRP_MN_WAIT_WAKE 要求は、バス ドライバーによって完了されます。

Windows 8 以降、電源ポリシー所有者として機能するデバイスのファンクション ドライバーは、PoFx のクライアントとして自身を登録できます。 デバイスが D0 への突然の遷移を経験したことをバス ドライバーが PoFx に通知すると、PoFx はデバイスが初期化された D0 状態に移行し、次に D3hot に移行するのに役立ちます。 まず、PoFx は、D0 電源 IRP をデバイス スタックに送信するようにデバイス ドライバーに求めるドライバーの DevicePowerRequiredCallback ルーチンを呼び出します。 次に、PoFx はドライバーの DevicePowerNotRequiredCallback ルーチンを呼び出して、デバイスが D0 状態を維持する必要がないことをデバイス ドライバーに通知します。

Kernel-Mode Driver Framework (KMDF) バージョン 1.11 以降では、単一コンポーネント デバイスの KMDF ドライバーは 、WdfDeviceWdmAssignPowerFrameworkSettings メソッドを呼び出すことによって、PoFx に間接的に登録できます。 この呼び出しでは、ドライバーは、D0 への突然の遷移をドライバーに通知するコールバック ルーチンへのポインターを提供します。 詳細については、「機能電源状態 をサポートする」を参照してください。

PoFx にデバイスを登録していないドライバでも、デバイスがウェイクアップに設定されている場合には、D0 への突然の遷移を通知されることがあります。 バス ドライバーは、デバイスの電源をオンにすると、ドライバーの IRP_MN_WAIT_WAKE 要求を完了します。 これに対して、ドライバーは D0 で動作するようにデバイスを初期化します。 デバイスはアイドル状態である可能性が高く、その場合、ドライバーはしばらくすると、このデバイスを D3hot に移動します。

PoFx に登録せず、デバイスをスリープ解除に備えていないファンクション ドライバーは、D3cold から D0 への突然の遷移の通知を受け取りません。 デバイスは、初期化されていない D0 状態で大量の時間を費やす可能性があります。 この状態では、通常、デバイス内のすべてのコンポーネントがオンになります。 アイドル状態のデバイスによる電力消費量を削減するには、ドライバーは、D0 への突然の遷移の通知を受信できる場合にのみ、D3cold へのエントリを有効にする必要があります。