共用方式為


SPB 連接鎖

連線鎖定有助於讓兩個用戶端在 簡單周邊匯流排 (SPB) 上共用目標周邊裝置的存取權。 兩個用戶端都可以開啟與相同目標裝置的邏輯連線,並在任一用戶端需要對裝置的獨佔存取權以執行一系列 I/O 作業時使用連線鎖定。 當一個用戶端保留連線鎖定時,第二個用戶端存取裝置的要求會自動延遲,直到第一個用戶端釋放鎖定為止。

用戶端會使用 IOCTL_SPB_LOCK_CONNECTIONIOCTL_SPB_UNLOCK_CONNECTION 要求來取得和釋放 SPB 上目標裝置上的連線鎖定。 用戶端會將這些 I/O 控制 (IOCTL) 要求傳送至裝置的檔案物件。

SPB 連線周邊裝置的驅動程式通常是 User-Mode 驅動程式架構 (UMDF) 驅動程式或 Kernel-Mode 驅動程式架構 (KMDF) 驅動程式。 若要將 IOCTL 要求傳送至 SPB 連線的周邊裝置,UMDF 驅動程式會呼叫 IWDFIoRequest::Send 之類的方法。 KMDF 驅動程式會呼叫 WdfIoTargetSendIoctlSynchronously 等方法。

一般而言,連線鎖定是不必要的。 大部分的用戶端驅動程式一律具有 SPB 上目標裝置的獨佔存取權。 只有在相對罕見的情況下,才需要連線鎖定,其中兩個用戶端必須共用相同目標裝置的存取權,而且一個或兩個用戶端有時必須具有裝置的獨佔存取權,才能進行一系列 I/O 作業。

根據預設,如果兩個用戶端共用目標裝置, SPB 架構延伸模組 (SpbCx) 會根據裝置到達 SpbCx 要求佇列的順序,序列化裝置的 I/O 要求。 連線鎖定會覆蓋請求的預設順序。 在一個用戶端取得連線鎖定之後,SpbCx 會保留它從第二個用戶端接收的 I/O 要求,直到第一個用戶端釋放鎖定為止。

在目前的 SpbCx 實作中,連線鎖定的主要用途是讓目標裝置的用戶端驅動程式與 ACPI 驅動程式共用裝置的存取權,Acpi.sys。 Acpi.sys 是系統提供的驅動程式,可代表硬體平臺的 ACPI 韌體管理特定核心資源裝置。 例如,使用系統單晶片 (SoC) 的平臺也可能包含電源管理積體電路 (PMIC),可由 Acpi.sys 和用戶端驅動程式存取。

用戶端驅動程式負責判斷它是否需要為要求獨佔存取的 I/O 作業進行連線鎖定。 如果驅動程式在某些硬體平臺或平臺設定中需要連線鎖定,但在其他平臺或平臺設定中不需要,驅動程式開發人員和平臺開發人員必須同意驅動程式特定的機制,以判斷何時使用連線鎖定。 一般而言,是否使用連線鎖定的相關資訊會包含在平台韌體中。 例如,裝置 ACPI 資源描述元中廠商定義的資訊區塊可能包含旗標位,以指出驅動程式是否與 Acpi.sys共用裝置。

連線鎖定範例

連線鎖定的典型用途是實作原子性讀取-修改-寫入作業。 如果兩個用戶端在簡單外圍匯流排(SPB)上共用對同一目標裝置的存取,則任一用戶端都可以使用連線鎖定,將讀取作業和寫入作業合併為單一原子性的讀取-修改-寫入作業。 連線鎖定可防止其他用戶端在讀取和寫入作業之間存取目標裝置。

下列清單描述用戶端可能傳送至 SPB 連線目標裝置的一系列 I/O 要求,以在裝置上執行讀取-修改-寫入作業:

  1. IOCTL_SPB_LOCK_CONNECTION – 取得並鎖定目標裝置的連線。
  2. IRP_MJ_READ – 從裝置位址讀取資料區塊,以便用戶端可以解譯和修改資料。
  3. IRP_MJ_WRITE — 將修改後的資料區塊寫入裝置位址。
  4. IOCTL_SPB_UNLOCK_CONNECTION – 釋放目標裝置上的連線鎖定。

上述清單可能適用於實作單一裝置函式的簡單裝置。

不過,更複雜的裝置可能會實作數個裝置功能。 此裝置可能包含用戶端在資料傳輸開始時載入的功能位址暫存器。 對於此裝置, IOCTL_SPB_EXECUTE_SEQUENCE 請求可以將函數位址暫存器的載入和隨後的資料傳輸結合到單一原子匯流排操作中。 如需詳細資訊,請參閱 Atomic Bus Operations 中範例 I2C 裝置的說明。

與控制器鎖定的比較

用戶端使用連線鎖定來取得對目標裝置的獨佔存取權,但連線鎖定不會防止匯流排上其他裝置之間的資料傳輸。

若要將一系列的資料傳輸作為原子性匯流排操作來執行,用戶端通常會使用 IOCTL_SPB_EXECUTE_SEQUENCE 要求。 執行原子匯流排作業的一種不太常見的方法是使用控制器鎖定。 用戶端會傳送 IOCTL_SPB_LOCK_CONTROLLERIOCTL_SPB_UNLOCK_CONTROLLER 要求,以取得及釋放控制器鎖定。

控制器鎖定與連線鎖定不同。 控制器鎖定可以讓匯流排上與目標裝置之間的 I/O 傳輸序列被作為單一原子匯流排作業來執行。 當控制器鎖定生效時,與匯流排上其他裝置的傳輸會被延遲,直到控制器鎖定解除。 如需詳細資訊,請參閱 原子性總線作業

備註

在某些實作中,連線鎖定可能會作為副作用,防止傳輸至匯流排上的其他裝置。 不過,此行為取決於實作,用戶端驅動程式不應該依賴它。 相反地,控制器鎖定會可靠地防止另一個用戶端存取與持有控制器鎖定的用戶端相同的目標裝置,而且用戶端可以安全地相依於此行為。

用戶端可能需要同時取得連線鎖定和控制器鎖定,才能在目標裝置上執行一組 I/O 作業。 連線鎖定可防止共用相同目標裝置存取權的第二個用戶端在裝置上執行 I/O 作業,而控制器鎖定可防止匯流排上其他裝置的用戶端在這些其他裝置上執行 I/O 作業。 (在持有這些鎖定期間,被防止發生的 I/O 作業將被延後,直到鎖定釋放為止。)

當用戶端同時取得 SPB 上目標裝置的連線鎖定和控制器鎖定時,用戶端必須先取得連線鎖定,才能取得控制器鎖定,而且必須先釋放控制器鎖定,才能釋放連線鎖定。 在用戶端取得連線鎖定後,用戶端可以在必要時多次取得並釋放控制器鎖定,然後再釋放連線鎖定。

連線鎖定的巢狀取得是非法的。 在用戶端取得連線鎖定之後,用戶端不得再次嘗試取得鎖定,直到用戶端第一次釋放鎖定為止。 同樣地,不允許巢狀獲取控制器鎖定。