zx_vmar_map_iob

摘要

映射连接到 IOBuffer 的内存区域。这场通话有 与 zx_vmar_map 的语义类似, 不受支持。

声明

#include <zircon/syscalls.h>

zx_status_t zx_vmar_map_iob(zx_handle_t handle,
                             zx_vm_option_t options,
                             size_t vmar_offset,
                             zx_handle_t iob_ep,
                             uint32_t region_index,
                             size_t region_len,
                             zx_vaddr_t* addr_out);

说明

将指定的 IOBuffer 区域映射到指定的虚拟内存中 地址区域映射区域会保留对已映射区域的引用 也就是说,关闭映射该区域的端点 移除此函数添加的映射。

options 等效于 zx_vmar_mapoptions 参数

vmar_offset 相当于 zx_vmar_mapvmar_offset 参数。

ep 是包含要映射的区域(在 zx_iob_create

region_index 是要映射的内存区域的索引。

region_offset 相当于 zx_vmar_mapvmo_offset 参数。

region_len 相当于 zx_vmar_maplen 参数。它 不得为零且页面对齐

返回值

zx_vmar_map_iob() 会返回 ZX_OK 以及 映射(通过 addr_out)成功。基准地址将与页面对齐 和非零值。如果失败,则返回负的错误值。

错误

ZX_ERR_BAD_HANDLE handleiob_ep 不是有效的句柄。

ZX_ERR_WRONG_TYPE handleiob_ep 分别不是 VMAR 或 IOB 句柄。

ZX_ERR_BAD_STATE 句柄是指已销毁的 VMAR。

ZX_ERR_INVALID_ARGS 表示以下任意一项: - mapped_addroptions 无效。 - vmar_offsetZX_VM_SPECIFICZX_VM_SPECIFIC_OVERWRITE 或 已指定 ZX_VM_OFFSET_IS_UPPER_LIMIT。 - 同时指定了 ZX_VM_SPECIFIC_OVERWRITEZX_VM_MAP_RANGE。 - ZX_VM_OFFSET_IS_UPPER_LIMITZX_VM_SPECIFIC 中的任一项一起指定 或 ZX_VM_SPECIFIC_OVERWRITE。 - vmar_offsetlen 表示因超出区域边界而不能满足的分配情况。 - vmar_offsetregion_offset 未对齐页面。 - region_len 为 0 或未页面对齐。

已指定 ZX_ERR_ALREADY_EXISTSZX_VM_SPECIFIC,但未指定 ZX_VM_SPECIFIC_OVERWRITE,并且请求的范围与另一个映射重叠。

ZX_ERR_NO_RESOURCES 如果在 VMAR 中找不到位置以创建映射。

ZX_ERR_ACCESS_DENIED权限不足,无法完成请求的映射。

ZX_ERR_NOT_SUPPORTED:如果该区域可调整大小、可舍弃或由分页器支持,但 未设置 ZX_VM_ALLOW_FAULTS

ZX_ERR_BUFFER_TOO_SMALL 区域不可调整大小,且映射超出末尾 但 ZX_VM_ALLOW_FAULTS 未设置。

ZX_ERR_NO_MEMORY 因内存不足而失败。 用户空间没有好办法处理这种(不太可能)错误。 在将来的版本中,此错误不会再发生。

ZX_ERR_OUT_OF_RANGE 表示以下任意一项: - region_offset + ROUNDUP(len, PAGE_SIZE) 溢出。 - region_index 对提供的 IOB 无效

备注

VMAR 操作

映射的区域通常支持 VMAR 操作,例如 zx_vmar_protectzx_vmar_op_rangezx_vmar_destroy。区域的访问权限规则可能会修改 或者按照规则规范中所述限制这些操作。

另请参阅