名称
IOBuffer - 具有非对称访问权限控制和规范的共享内存端点
Synopsis
IOBuffer (IOB) 是一种对等 Zircon 内核对象,专为进程之间的高吞吐量、低延迟通信和共享内存传输而设计。它将对等会话管理与多区域封装、非对称访问权限控制和内核介导的访问规范相结合。
说明
IOBuffer 始终作为一对端点(端点 0 和端点 1)运行。它允许两个进程通过共享多个独立的内存区域(最多 64 个,由
ZX_IOB_MAX_REGIONS 定义)进行通信,每个内存区域都配置有特定的访问权限和行为。
对等生命周期和信令
与通道和套接字类似,IOBuffer 端点也是对等的。
- 端点控制着后备内存区域的生命周期。
- 引用跟踪:从
端点创建的活跃虚拟内存映射与该端点的打开句柄一起计为引用。
- 对等关闭:当对一个端点的所有引用(包括打开的句柄和活跃的虚拟
内存映射)都关闭时,系统会在对等端点上断言
ZX_IOB_PEER_CLOSED信号。
区域:私有与共享
IOBuffer 可以封装多个内存区域:
- 私有区域 (ZX_IOB_REGION_TYPE_PRIVATE):由 IOBuffer 对唯一拥有的私有
VmObject 提供支持。用于隔离的
点对点通信。
- 共享区域 (ZX_IOB_REGION_TYPE_SHARED) (实验性):指向独立的 shared_region 对象。多个独立的 IOBuffer 对可以
引用同一个共享区域,从而实现多对一模式(例如,
多个客户端日志写入器向单个读取器发送数据)。
非对称访问权限控制
您可以为端点 0 和端点 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):自由格式的原始字节缓冲区。没有
内核介导的操作。
- 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
属性
IOBuffer 支持以下属性:
- 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 中