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 拥有的唯一 ID。

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_infoZX_INFO_IOB_REGIONS 用于确定区域的实际大小。

discipline 用于指定要采用的内存访问规则 由内核中介的操作。有效规则如下: - ZX_IOB_DISCIPLINE_TYPE_NONE:无内核中介操作的自由形式区域。

区域类型

ZX_IOB_REGION_TYPE_PRIVATE

指定 IOB 唯一拥有的私有内存对象支持的区域。 此内存对象只能通过对、 所有者的 IOO 中

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 失败,原因是缺少分配给 请求的缓冲区。