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