低電力状態からの高速スタートアップ
低電力状態からの高速起動を実現するには、リーフ ノード デバイスのドライバーが S0 電源 IRP (つまり、S0 システム電源状態の IRP_MN_SET_POWER IRP) を処理する必要があります。 デバイス階層内のリーフ ノードであるデバイスには、子デバイスがありません。 リーフ ノード デバイスには子デバイスへの依存関係がないため、デバイスのファンクション ドライバーは、オペレーティング システムや他のドライバーに不必要な遅延を引き起こさないよう、デバイスをバックグラウンド タスクとして再初期化できます。 これに対し、バス ドライバーには、電源オン シーケンスを子デバイスと調整するための追加の同期ロジックが必要な依存関係があります。
低電力状態からリーフ ノード デバイスを高速起動するには、以下の手順に従います。
S0 電源 IRP の完了ルーチンを設定します。
デバイス スタックに S0 電源 IRP を送信します。
D0 電源 IRP が完了するまで待機するのではなく、S0 電源 IRP をすぐに完了します。 S0 電源 IRP の完了ルーチンが実行されたら、以下の操作を行います。
D0 電源 IRP (つまり、D0 デバイスの電源状態の IRP_MN_SET_POWER IRP) を要求します。
S0 電源 IRP の完了ルーチンに STATUS_SUCCESS を返します。
ドライバーは、受信するすべての I/O 要求をキューに入れる必要がありますが、D0 電源 IRP の処理が完了するまで、これらの要求の処理を延期します。
D0 電源 IRP の完了ルーチンが実行されたら、デバイスを初期化しますが、このルーチンをデバイスの使用準備に必要なものに制限します。
前の手順が完了すると、既にキューに入っている可能性がある I/O 要求を含め、ドライバーが I/O 要求の処理を開始できます。
注 上記の手順は、PowerSystemWorking (S0) 以外の電源状態の電源 IRP の処理には適用されません。 これらの手順は特に、低電力状態から電源オン (S0) 状態に移行するための電源 IRP の処理に適用されます。
すべてのデバイスが S0 電源 IRP を完了した後、システムの起動が完了します。 これらのデバイスは、システム起動の完了時、D0 電源 IRP を完了したり、完全に機能したりする必要はありません。 カーネル電源マネージャーには、IRP ディスパッチ キューの限られたセットがあり、これらのキューを使用して、システム内のすべてのデバイスに S0 状態への復帰を通知する必要があります。 S0 電源 IRP をすぐに完了できないドライバーがあると、他のデバイスのドライバーが S0 電源 IRP を受け取る妨げとなります。 したがって、設計が不適切なドライバーがあると、同時に実行する必要があるドライバー操作が順次実行されるため、システムの全体的な起動パフォーマンスが低下します。
ドライバーは、S0 電源 IRP を完了した後、デバイスへのハンドルを開いたアプリケーションから I/O 要求を受け取る可能性があります。 ドライバーがこれらの I/O 要求に失敗してはなりません。失敗すると、アプリケーションが応答を停止し、タイムアウト エラー メッセージが生成される可能性があるためです。 代わりに、ドライバーは、デバイスの処理準備ができるまで I/O 要求をキューに入れる必要があります。
バス ドライバーは、リーフ ノード デバイスのドライバーについて説明したのと同様の手法を使用して、低電力状態から高速起動を実現できます。 バス ドライバーは、追加の要件を満たす必要があります。これは、D0 状態になる子デバイスからの要求が保留中としてマークされ、バス デバイスが D0 状態になるまでバス ドライバーによって完了されないようにするためです。
たとえば、USB ハブのバス ドライバーが S0 電源 IRP を受け取ると、ドライバーは D0 電源 IRP を要求し、要求された D0 電源 IRP を受信した後、S0 電源 IRP を完了します。 ただし、S0 電源 IRP が完了すると、ハブの子デバイスが S0 電源 IRP の受け取りと D0 電源 IRP の要求を開始する可能性があります。 バス ドライバーは、ハブ デバイスが D0 に入るまで、子デバイスが D0 に入らないようにする必要があります。 そのため、バス ドライバーは、子デバイスからのすべての D0 電源 IRP を保留中としてマークした後、バス ドライバーがハブの D0 電源 IRP の処理を完了して、ハブ デバイスが完全に初期化されるまで、これらの IRP の完了を待機する必要があります。
電源 IRP の詳細については、次のトピックを参照してください。