摘要
使用一组选项创建 IOBuffer。
声明
#include <zircon/syscalls.h>
zx_status_t zx_iob_create(uint64_t options,
const zx_iob_region_t* regions,
size_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[32];
};
};
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_EP0_CAN_MEDIATED_READ
,用于向端点 0 授予执行中介读取的权限ZX_IOB_ACCESS_EP0_CAN_MEDIATED_WRITE
,用于向端点 0 授予执行中介写入的权限ZX_IOB_ACCESS_EP1_CAN_MAP_READ
,用于向端点 1 授予将区域映射为可读的权限ZX_IOB_ACCESS_EP1_CAN_MAP_WRITE
,用于向端点 1 授予将该区域映射为可写的权限ZX_IOB_ACCESS_EP1_CAN_MEDIATED_READ
,用于向端点 1 授予执行中介读取的权限ZX_IOB_ACCESS_EP1_CAN_MEDIATED_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 {
uint32_t options;
uint32_t padding1;
uint64_t padding2[3];
};
options 必须为 0
学科类型
如需了解详情,请参阅 zx_iob_discipline_type_t
。
返回值
zx_iob_create()
会在成功时返回 ZX_OK
。如果失败,系统会返回负错误值。
错误
ZX_ERR_INVALID_ARGS
ep_out0 或 ep_out1 是无效的指针或 NULL,options 是 0 以外的任何值,或者区域配置无效(例如,如果区域不可访问,既不是映射可写入,也不是配置为中介访问,或者学科无效)。
ZX_ERR_NO_MEMORY
由于缺少内存来分配请求的缓冲区而失败。
ZX_ERR_OUT_OF_RANGE
区域数量超出上限 (64)。