I/O 傳輸順序

SPB 架構延伸模組 (SpbCx) 支援 I/O 傳輸順序。 I/O 傳輸順序是一組已排序的匯流排傳輸, (讀取和寫入作業) 以單一不可部分完成的匯流排作業執行。 I/O 傳輸順序中的所有傳輸都會存取匯流排上的相同目標裝置。 執行序列時,即使 SPB 控制器驅動程式可能會在 I/O 傳輸順序完成之前收到其他裝置的 I/O 要求,仍無法存取匯流排上的其他裝置。

I/O 傳輸順序的範例是寫入讀取作業,也就是匯流排寫入作業,後面接著匯流排讀取作業。 用戶端周邊設備磁碟機可能會使用這種類型的序列,在 SPB 連接的周邊裝置中寫入函式選取暫存器,然後讀取所選裝置函式的值。 這兩個傳輸的長度可能不同。 例如,寫入作業可能會傳輸一個位元組的資料,而讀取作業可能會傳輸許多位元組的資料。

I/O 傳輸序列的類型

用戶端可以使用下列其中一種方式來起始 I/O 傳輸順序:

  1. 用戶端可以在 IOCTL_SPB_EXECUTE_SEQUENCE I/O 控制要求中指定整個序列。 此要求可讓 SPB 控制器驅動程式使用任何硬體特定的效能優化來執行傳輸順序。 如需詳細資訊,請參閱 單一要求序列

  2. 用戶端可以傳送 IOCTL_SPB_LOCK_CONTROLLER I/O 控制要求,以鎖定序列開頭的控制器,並在序列完成時傳送 IOCTL_SPB_UNLOCK_CONTROLLER 。 鎖定控制器時,用戶端會針對序列中的每個讀取或寫入作業傳送個別的 I/O 要求 (IRP_MJ_READIRP_MJ_WRITE) 。 如需詳細資訊,請參閱 用戶端實作的序列

可能的話,用戶端應該使用 IOCTL_SPB_EXECUTE_SEQUENCE 要求,速度較快、較不容易發生錯誤,並大幅減少其他用戶端在匯流排外鎖定的時間。 不過,如果用戶端必須查看序列中其中一個傳輸期間讀取的值,用戶端可以使用 IOCTL_SPB_LOCK_CONTROLLERIOCTL_SPB_UNLOCK_CONTROLLER 要求,才能在序列中起始稍後的傳輸。 在此情況下,需要仔細設計,以避免將其他用戶端鎖定在匯流排中超過必要時間,而且設計不良的周邊驅動程式可能會降低整體系統效能。

Single-Request序列

若要改善效能,SPB 控制器驅動程式應該實作 EvtSpbControllerIoSequence 回 呼函式來處理 IOCTL_SPB_EXECUTE_SEQUENCE 要求。 此方法會對 SPB 控制器驅動程式增加一些複雜度,但可避免要求用戶端以一系列個別讀取和寫入作業的形式執行 I/O 傳輸順序,而其他用戶端則鎖定在匯流排外。

注意

強烈建議實作EvtSpbControllerIoSequence函式,而且可能會成為Windows 8的需求。

傳輸順序的實作類似于簡單讀取或寫入作業的實作,但還需要更新序列中個別傳輸之間的序列作業儲存狀態。 第一次傳輸完成之後,SPB 控制器驅動程式會更新順序狀態,以選取序列中的下一個傳輸。 順序狀態會儲存在裝置內容中,並包含傳遞至EvtSpbControllerIoSequence 回呼的SPBREQUEST控制碼。 SPB 控制器驅動程式會使用此控制碼來取得序列中個別傳輸的緩衝區、長度、方向和位置參數。 如需取得這些參數的詳細資訊,請參閱 SpbRequestGetTransferParameters

如果 SPB 控制器驅動程式無法執行所要求的 IOCTL_SPB_EXECUTE_SEQUENCE 作業,它會以失敗碼完成要求。 如果發生這類失敗,用戶端可以選擇鎖定匯流排,以一系列簡單的 I/O 要求明確地執行 I/O 傳輸順序,然後解除鎖定匯流排。 如需詳細資訊,請參閱 用戶端實作的序列

SpbCx 會針對從周邊設備磁碟機接收的 IOCTL_SPB_XXX要求執行參數檢查。 對於 IOCTL_SPB_EXECUTE_SEQUENCE 要求,SpbCx 會拒絕包含 Null 緩衝區指標或零長度緩衝區的空序列和序列。

SPB 控制器驅動程式應該確認序列中每個傳輸的長度未超過驅動程式指定的限制。 例如,Windows 驅動程式套件中的 SkeletonI2C 範例驅動程式 (WDK) 會失敗 IOCTL_SPB_EXECUTE_SEQUENCE 要求,指定傳輸超過 4K 個位元組,並將此要求的狀態碼設定為STATUS_INVALID_PARAMETER。 在起始 IOCTL_SPB_EXECUTE_SEQUENCE 要求的順序作業之前,驅動程式應該先驗證序列中所有傳輸的參數,以確認作業可以順利完成。

SpbCx 永遠不會在 EvtSpbControllerIoSequence 回呼前面加上 EvtSpbControllerLock 回呼,而且永遠不會遵循 EvtSpbControllerIoSequence 回呼與 EvtSpbControllerUnlock 回呼。

Client-Implemented序列

SPB 控制器驅動程式的用戶端可以明確地執行 I/O 傳輸序列,做為一系列的簡單讀取和寫入。 用戶端可以是核心模式驅動程式或使用者模式驅動程式,可控制連接至匯流排的周邊裝置。 在順序中的第一次傳輸之前,用戶端會將 IOCTL_SPB_LOCK_CONTROLLER 要求傳送至目標裝置,以防止序列中的傳輸之間發生其他不相關的匯流排存取。 接下來,用戶端會傳送 IRP_MJ_READIRP_MJ_WRITE 要求,以循序執行傳輸。 最後,用戶端會傳送 IOCTL_SPB_UNLOCK_CONTROLLER 要求來釋放鎖定。

如果序列中的稍後傳輸相依于先前的傳輸,用戶端可能需要實作這種類型的 I/O 傳輸順序。 例如,第一個讀取可能會指出後續讀取或寫入多少個位元組。 不過,如果不存在這類相依性,用戶端應該將 IOCTL_SPB_EXECUTE_SEQUENCE 要求傳送至 SPB 控制器驅動程式,以便更有效率地執行順序。

在啟動用戶端實作序列的 IOCTL_SPB_LOCK_CONTROLLER 要求與結束順序 的IOCTL_SPB_UNLOCK_CONTROLLER 要求之間,用戶端可以傳送至目標裝置的唯一 I/O 要求是 IRP_MJ_READIRP_MJ_WRITE 要求。 此規則的任何違規都是錯誤。

SPB 鎖定只會用來保證一連串的讀取和寫入會當做不可部分完成的匯流排作業執行,而且應該專門用於該用途。

如需詳細資訊,請參閱 處理Client-Implemented序列