Share via


在 UMDF 驅動程式中管理緩衝區存取方法

如果您要撰寫 UMDF 驅動程式, 您可以指定 架構用於讀取和寫入要求的 緩衝區存取方法 喜好設定,以及裝置 I/O 控制要求。 UMDF 驅動程式所提供的值只是喜好設定,而且不保證架構會使用。

指定慣用的緩衝區存取方法

從 UMDF 2.0 版開始,UMDF 驅動程式會呼叫 WdfDeviceInitSetIoTypeEx 來註冊讀取/寫入要求和裝置 I/O 控制要求的慣用存取方法。

如果驅動程式未呼叫 WdfDeviceInitSetIoTypeEx,UMDF 會針對此裝置的 I/O 要求使用緩衝方法。

架構會使用下列規則來判斷要使用的存取方法:

  • 驅動程式堆疊中的所有 UMDF 驅動程式都必須使用相同的方法來存取裝置的緩衝區,而架構會提供緩衝 I/O 的喜好設定。

    如果 UMDF 判斷某些驅動程式偏好緩衝 I/O 或裝置的直接 I/O,而其他驅動程式則只偏好緩衝處理裝置的 I/O,UMDF 會針對所有驅動程式使用緩衝 I/O。 如果一或多個堆疊的驅動程式只偏好緩衝 I/O,而其他驅動程式則只偏好直接 I/O,UMDF 會將事件記錄到系統事件記錄檔,而不會啟動驅動程式堆疊。

    您的驅動程式可以呼叫 WdfDeviceGetDeviceStackIoType 來判斷 UMDF 指派給裝置讀取/寫入要求和 I/O 控制要求的緩衝區存取方法。

  • 在某些情況下,UMDF 會將直接 I/O 指派給裝置,但為了達到最佳效能,請針對一或多個裝置的要求使用緩衝 I/O。 例如,如果 UMDF 可以將資料複製到驅動程式的緩衝區,而不是對應緩衝區以進行直接存取,則 UMDF 會針對小型緩衝區使用緩衝 I/O。

    您可以選擇性地在驅動程式呼叫WdfDeviceInitSetIoTypeEx時提供DirectTransferThreshold值。 架構會使用此值來判斷架構將使用直接 I/O 的最小緩衝區大小。 一般而言,您不需要提供此值,因為架構會使用提供最佳效能的設定。

  • UMDF 只會針對開始和結束于記憶體分頁界限的緩衝區空間使用直接 I/O。 如果緩衝區的開頭或結尾不在頁面界限上,UMDF 會針對緩衝區的該部分使用緩衝 I/O。 換句話說,UMDF 可能會針對由數個 I/O 要求組成的大型資料傳輸使用緩衝 I/O 和直接 I/O。

  • 針對裝置 I/O 控制要求,只有在 I/O 控制項程式碼 (IOCTL) 指定直接 I/O 時,UMDF 才會使用直接 I/O,而且只有在該裝置的所有 UMDF 驅動程式都呼叫 WdfDeviceInitSetIoTypeEx 來指定直接存取方法時。

擷取 I/O 要求的 Access 方法

驅動程式會使用相同的要求物件方法來存取資料緩衝區,而不論緩衝區存取方法為何。 因此,大部分驅動程式通常不需要知道 UMDF 是針對 I/O 要求使用緩衝 I/O 還是直接 I/O。

在某些情況下,如果您知道 I/O 要求的存取方法,您可以改善驅動程式的效能。 例如,請考慮通常會使用直接 I/O 的高輸送量裝置。 當驅動程式收到 I/O 要求時,它會將資料從共用緩衝區空間複製到本機驅動程式記憶體以進行驗證。

不過,驅動程式偶爾可能會收到使用緩衝 I/O 的緩衝區。 因為 I/O 管理員已經將此資料複製到中繼緩衝區,所以驅動程式不需要在本機複製參數。 藉由避免複製作業,驅動程式可改善效能。

UMDF 驅動程式會呼叫 WdfRequestGetEffectiveIoType 來取得 I/O 要求的緩衝區存取方法。 如上所述,特定要求的 I/O 類型可能與裝置的架構指派 I/O 類型設定不同。

從未緩衝的 I/O 或直接 I/O 轉換

UMDF 驅動程式無法使用 「neither」 方法。

不過,某些裝置 I/O 控制代碼 的定義 (IOCTLs) 指定要求使用「兩者」方法。 選擇性地,UMDF 驅動程式可以將這類裝置 I/O 控制要求的緩衝區存取方法轉換為緩衝 I/O 或直接 I/O。 使用下列步驟:

  1. UmdfMethodNeitherAction 指示詞包含在驅動程式 INF 檔案的 INF DDInstall 區段中 。 您可以設定 指示詞的值,指出 UMDF 應該將使用「兩者」存取方法的裝置 I/O 控制要求傳遞給驅動程式。 (否則,UMDF 會以錯誤狀態值完成這些 I/O 要求。)

  2. 使用 UMDF 針對 緩衝 I/O直接 I/O提供的物件方法,存取 I/O 要求的緩衝區。

只有在您確定 UMDF 可以將存取方法轉換成緩衝 I/O 或直接 I/O 時,才應該啟用 IOCTL 要求的支援。 例如,如果 IOCTL 指定未遵循緩衝區規格規則的自訂要求,則 I /O 控制代碼的緩衝區描述中所述,UMDF 無法轉換緩衝區。