I/O 佇列的電源管理

當架構收到導向至其中一個驅動程式裝置的 I/O 要求時,架構會將要求放在 I/O 佇列中。 驅動程式可以藉由提供要求處理常式或輪詢佇列,從 I/O 佇列取得 I/O 要求。 如需 I/O 佇列的詳細資訊,請參閱 Framework Queue Objects

當您設計驅動程式時,您應該將驅動程式將接收的 I/O 要求分組成兩個類別:

  1. 要求要求裝置處於其運作 (D0) 狀態,包括:

    • 讀取或寫入要求,要求裝置的函式驅動程式從裝置讀取資料,或將資料寫入裝置。
    • 裝置控制要求函式或匯流排驅動程式在沒有存取裝置的情況下無法提供服務。
  2. 不需要裝置處於其運作 (D0) 狀態的要求,包括:

    • 裝置控制要求函式或匯流排驅動程式可在不存取裝置的情況下提供服務。
    • 篩選驅動程式可能收到的所有要求。
    • 如果堆疊支援未與任何硬體通訊的軟體專用裝置,則驅動程式堆疊中的所有驅動程式都會收到的所有要求。

除非您撰寫篩選驅動程式,或未與硬體通訊之堆疊的驅動程式,否則您的驅動程式可能會收到一些要求,要求裝置處於其運作狀態,以及一些沒有的要求。

為了支援這兩種類型的要求,架構會提供兩種類型的 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