zx_iob_create

摘要

使用一組選項建立 IOBuffer。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_iob_create(uint64_t options,
                          const zx_iob_region_t* regions,
                          uint32_t region_count,
                          zx_handle_t* ep0_out,
                          zx_handle_t* ep1_out);

說明

zx_iob_create() 會建立 IOBuffer,這是專為高效點對點通訊設計的記憶體物件。可以將 IOBuffer 視為支援特定容器的共用緩衝區的抽象層,這些讀取和寫入作業可保持資料完整性,並強制執行權限 (可視需要進行核心中介)。

IOBuffer 可能有多個區域,以 region_count 指定。每個區域可設為支援不同的存取模式或由地區設定的權限。

如果將區域設為透過中介服務存取,則會使用關聯容器初始化建立。

地區說明

區域的幾何圖形和設定由 zx_iob_region_t 區域說明結構指定。基本結構包含所有區域類型通用的欄位。

struct zx_iob_region_t {
  zx_iob_region_type_t type;
  zx_iob_access_t access;
  uint64_t size;
  zx_iob_discipline_t discipline;
  union {
    zx_iob_region_private_t private_region;
    uint8_t max_extension[4 * 8];
  };
};

type 會指定支援該物件的地區和記憶體物件類型。有效的類型包括:ZX_IOB_REGION_TYPE_PRIVATE:由 IOB 擁有的私人記憶體支援的區域。

access 會指定每個端點的存取權控管修飾符。這必須是下列一或多個項目的組合:

  • ZX_IOB_ACCESS_EP0_CAN_MAP_READ 會授予端點 0,以便將區域對應到可讀取的區域
  • ZX_IOB_ACCESS_EP0_CAN_MAP_WRITE 會授予端點 0,以便將區域對應為可寫入
  • ZX_IOB_ACCESS_EP1_CAN_MAP_READ 可授予端點 1 將區域對應到可讀取的區域
  • ZX_IOB_ACCESS_EP1_CAN_MAP_WRITE 會授予端點 1 將區域對應為可寫入功能的能力

size 是要求的區域大小,以位元組為單位。系統會將大小四捨五入至下一個系統頁面大小的邊界,由 zx_system_get_page_size() 回報。請使用 zx_object_get_info 搭配 ZX_INFO_IOB_REGIONS 主題來判斷區域的實際大小。

discipline 會指定用於核心中介作業的記憶體存取紀律。有效的學科如下: - ZX_IOB_DISCIPLINE_TYPE_NONE:不含核心中介作業的任意形式區域。

地區類型

ZX_IOB_REGION_TYPE_PRIVATE

指定由 IOB 擁有的私人記憶體物件支援的區域。這個記憶體物件只能經由自身的 IOB 作業及對應作業存取。

struct zx_iob_region_private_t {
  uint64_t options;
};

options 必須為 0

學科類型

詳情請參閱 zx_iob_discipline_type_t

傳回值

zx_iob_create() 在成功時傳回 ZX_OK。失敗時會傳回負值的錯誤值。

錯誤

ZX_ERR_INVALID_ARGS ep_out0ep_out1 是無效的指標或 NULL,options 是 0 以外的任何值,或者地區設定無效 (例如,如果區域無法存取、非對應可寫入或設有中介存取,或是學科無效),

ZX_ERR_NO_MEMORY因記憶體不足而無法分配要求的緩衝區而失敗。