封鎖裝置

Fuchsia Block 裝置驅動程式與系統上的其他驅動程式一樣,是以可透過 IPC 存取的使用者空間服務實作。使用區塊裝置的程式會有一或多個控點,指向這些基礎伺服器。與檔案系統用戶端類似,程式會使用 fuchsia.storage.block.Block FIDL 通訊協定做為用戶端,封鎖裝置。檔案系統用戶端可能會在 RPC 訊息中編碼這些要求,然後將「讀取」或「寫入」要求傳送至伺服器。用戶端可透過 FIDL 通訊協定查詢封鎖裝置、開啟封鎖工作階段,以及將 FIFO 交易加入佇列。

fuchsia.storage.block.Block 是任何類似區塊的伺服器提供的通訊協定,而 fuchsia.hardware.block.volume.Service 則是區塊裝置驅動程式 (USB、AHCI / SATA、NVMe、SDMMC、UFS、Virtio、Ramdisk 等) 公開的 FIDL 服務,其 volume 成員會實作 fuchsia.storage.block.Block。非驅動程式的類似區塊伺服器可以實作 fuchsia.storage.block.Block,而不公開磁碟區服務;舉例來說,GPT 元件會為每個分割區公開一個 Block 執行個體。驅動程式和其他區塊伺服器都可以使用 block_server 程式庫實作 fuchsia.storage.block.Block。

快速封鎖 I/O

區塊裝置驅動程式通常負責佔用大量記憶體,並將要求排入特定裝置的佇列,以便「讀取至」或「寫入」部分記憶體。從 RPC 通訊協定傳輸大小有限的訊息到「I/O 交易」時,需要重複複製大型緩衝區,才能存取區塊裝置。

為避免這個效能瓶頸,區塊通訊協定會使用快速的 FIFO 型通訊協定,對共用的 VMO 採取行動,而不是透過 FIDL RPC 傳輸具有大型緩衝區的「讀取」或「寫入」訊息。檔案系統 (或任何其他想與區塊裝置互動的用戶端) 會在區塊裝置上開啟工作階段 (fuchsia.storage.block.Session),取得 FIFO 控制代碼,並將 VMO (AttachVmo) 附加至工作階段。然後,用戶端可以在 FIFO 上傳送快速輕量的控制訊息,指出區塊裝置驅動程式庫應直接對已註冊的 VMO 採取行動。舉例來說,當寫入檔案時,檔案系統 (將檔案表示為 VMO) 可以傳送小型 FIFO 訊息,指出「直接從 VMO Y 的區塊偏移 X 寫入 N 個區塊至磁碟的區塊偏移 Z」,而不是直接透過 IPC 基本類型傳遞位元組,並將其複製到區塊裝置記憶體的新位置。結合「mmap」記憶體對應工具時,這會在存取檔案時,提供從用戶端程式直接到磁碟 (或反向) 的「零複製」路徑。