名稱
IOBuffer - 具有非對稱存取控管和規範的共用記憶體端點
劇情概要
IOBuffer (IOB) 是對等 Zircon 核心物件,專為高輸送量、低延遲通訊而設計,並用於程序間的共用記憶體傳輸。這項技術結合了對等互連工作階段管理、多區域封裝、非對稱存取控管,以及核心介導的存取權規範。
說明
IOBuffer 一律以一對端點 (端點 0 和端點 1) 運作。這項功能可讓兩個程序透過共用多個獨立記憶體區域 (最多 64 個,由 ZX_IOB_MAX_REGIONS 定義) 進行通訊,每個區域都設定了特定存取權限和行為。
對等互連生命週期和信號
與通道和 Socket 類似,IOBuffer 端點會對等互連。
- 端點會控管支援記憶體區域的生命週期。- 參照追蹤:從端點建立的有效虛擬記憶體對應,會與該端點的開啟控制代碼一起計為參照。- 對等互連關閉:當一個端點的所有參照 (包括開啟的控制代碼和有效的虛擬記憶體對應) 都關閉時,系統會在對向端點上聲明 ZX_IOB_PEER_CLOSED 信號。
區域:私人與共用
IOBuffer 可以封裝多個記憶體區域:
- 私人區域 (ZX_IOB_REGION_TYPE_PRIVATE):由 IOBuffer 配對專屬的私人 VmObject 支援。用於獨立的點對點通訊。共用區域 (ZX_IOB_REGION_TYPE_SHARED) (實驗性):指向獨立的 shared_region 物件。多個獨立的 IOBuffer 配對可以參照同一個共用區域,實現多對一模式 (例如,多個用戶端記錄寫入器將資料傳送至單一讀取器)。
非對稱存取控管
您可以為每個區域設定 Endpoint 0 和 Endpoint 1 的不同權限。權限包括:
- 直接對應:允許程序將區域對應至虛擬位址空間 (VMAR),以進行直接讀取/寫入存取。
- ZX_IOB_ACCESS_EP0_CAN_MAP_READ / _WRITE
- ZX_IOB_ACCESS_EP1_CAN_MAP_READ / _WRITE
- 核心仲介存取:限制直接對應,要求所有存取權都必須透過核心系統呼叫 (例如 zx_iob_writev)。這可防範檢查時間到使用時間 (TOCTOU) 攻擊。- ZX_IOB_ACCESS_EP0_CAN_MEDIATED_READ / _WRITE
- ZX_IOB_ACCESS_EP1_CAN_MEDIATED_READ / _WRITE
有效權利和處理互動
驗證記憶體作業時,核心會將區域的存取權限 (邏輯 AND) 與端點控制代碼權限相交。區域層級權限無法覆寫控制代碼層級權限。
- 地圖作業:有效讀取/寫入權限分別為
uRn & hRn和uWn & hWn,其中u代表對應權限,而h代表控點權限。 - 中介作業:有效讀取/寫入權分別為
kRn & hRn和kWn & hWn,其中k代表中介權限,h代表控制代碼權限。
中介方向性與絕對權限
與直接對應不同,核心仲介存取作業是在邏輯/方向感上運作,而非絕對硬體權限。舉例來說,邏輯中介讀取作業 (例如從環狀緩衝區擷取資料) 可能需要核心在幕後寫入同一區域的簿記結構。由於核心會做為可信賴的仲介者強制執行邏輯,因此允許這類內部記帳寫入作業,適用於唯讀仲介端點。
記憶體存取規範
學科會定義區域內核心中介作業的結構化記憶體配置和行為:
- 無 (ZX_IOB_DISCIPLINE_TYPE_NONE):任意形式的原始位元組緩衝區。No
kernel-mediated operations.
- ID 分配器 (ZX_IOB_DISCIPLINE_TYPE_ID_ALLOCATOR) (實驗功能):安全無虞的執行緒結構,可將大小適中的資料 Blob 對應至依序分配的數字 ID。有助於追蹤中的字串實習。
- 中介寫入環形緩衝區 (ZX_IOB_DISCIPLINE_TYPE_MEDIATED_WRITE_RING_BUFFER) (實驗性):環形緩衝區,專為多個用戶端和單一使用者空間讀取器 (例如高效率系統記錄) 的並行、核心中介寫入作業而設計。
透過 VMAR 對應
系統會透過 zx_vmar_map_iob 將 IOBuffer 區域對應至 VMAR。僅支援下列 VMAR 選項:
- ZX_VM_SPECIFIC
- ZX_VM_SPECIFIC_OVERWRITE
- ZX_VM_OFFSET_IS_UPPER_LIMIT
- ZX_VM_PERM_READ
- ZX_VM_PERM_WRITE
- ZX_VM_MAP_RANGE
其他 VMAR 選項一律會傳回 ZX_ERR_INVALID_ARGS。
查詢物件屬性和區域
IOBuffer 支援透過 zx_object_get_info 進行標準屬性查詢。
ZX_INFO_IOB
使用 zx_iob_info_t 傳回整體 IOBuffer 執行個體的相關資訊:
- options:建立時使用的選項。
- region_count:封裝的記憶體區域數量。
ZX_INFO_IOB_REGIONS
以 zx_iob_region_info_t 陣列的形式傳回每個區域的相關資訊。- 存取位元交換:傳回時,核心會交換存取修飾符位元,讓端點 0 存取位元反映執行查詢的端點控制代碼權限,端點 1 存取位元則反映對等互連的權限。這樣一來,與端點無關的程式庫就能動態驗證權限。
ZX_INFO_PROCESS_VMOS
核心會在這個主題下回報支援私有 IOB 區域的記憶體物件,例如標準 VMO。根據預設,支援 VMO 會共用父項 IOBuffer 的名稱。
權限
IOBuffer 控制代碼預設具有下列權限:
- ZX_RIGHT_TRANSFER
- ZX_RIGHT_DUPLICATE
- ZX_RIGHT_WAIT
- ZX_RIGHT_INSPECT
- ZX_RIGHT_READ
- ZX_RIGHT_WRITE
- ZX_RIGHT_MAP
- ZX_RIGHT_SIGNAL
- ZX_RIGHT_SIGNAL_PEER
- ZX_RIGHT_GET_PROPERTY
- ZX_RIGHT_SET_PROPERTY
屬性
IOBuffers 支援下列屬性:
- ZX_PROP_NAME:用於診斷及歸因記憶體。
訊號
系統可以為 IOBuffer 端點設定下列信號:
- ZX_IOB_PEER_CLOSED:對等端點已關閉 (包括所有控制代碼和有效對應)。
- ZX_IOB_SHARED_REGION_UPDATED (實驗功能):當共用區域因仲介寫入而更新時,系統會引發此事件。
系統呼叫
zx_iob_create()- 建立新的對等 IOBuffer 配對zx_iob_create_shared_region()(實驗功能) - 建立獨立的共用區域zx_iob_writev()- 執行核心仲介寫入作業至區域zx_iob_allocate_id()(實驗功能) - 在 ID 分配器區域中分配 IDzx_vmar_map_iob()- 將 IOBuffer 區域對應至 VMAR