摘要
映射连接到 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_map
的 options 参数
vmar_offset 相当于 zx_vmar_map
的 vmar_offset 参数。
ep 是包含要映射的区域(在
zx_iob_create
。
region_index 是要映射的内存区域的索引。
region_offset 相当于 zx_vmar_map
的 vmo_offset 参数。
region_len 相当于 zx_vmar_map
的 len 参数。它
不得为零且页面对齐
返回值
zx_vmar_map_iob()
会返回 ZX_OK
以及
映射(通过 addr_out)成功。基准地址将与页面对齐
和非零值。如果失败,则返回负的错误值。
错误
ZX_ERR_BAD_HANDLE
handle 或 iob_ep 不是有效的句柄。
ZX_ERR_WRONG_TYPE
handle 或 iob_ep 分别不是 VMAR 或 IOB 句柄。
ZX_ERR_BAD_STATE
句柄是指已销毁的 VMAR。
ZX_ERR_INVALID_ARGS
表示以下任意一项:
- mapped_addr 或 options 无效。
- vmar_offset 在 ZX_VM_SPECIFIC
、ZX_VM_SPECIFIC_OVERWRITE
或
已指定 ZX_VM_OFFSET_IS_UPPER_LIMIT
。
- 同时指定了 ZX_VM_SPECIFIC_OVERWRITE
和 ZX_VM_MAP_RANGE
。
- ZX_VM_OFFSET_IS_UPPER_LIMIT
与 ZX_VM_SPECIFIC
中的任一项一起指定
或 ZX_VM_SPECIFIC_OVERWRITE
。
- vmar_offset 和 len 表示因超出区域边界而不能满足的分配情况。
- vmar_offset 或 region_offset 未对齐页面。
- region_len 为 0 或未页面对齐。
已指定 ZX_ERR_ALREADY_EXISTS
个ZX_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_protect
,
zx_vmar_op_range
、zx_vmar_destroy
。区域的访问权限规则可能会修改
或者按照规则规范中所述限制这些操作。