摘要
映射附加到 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 handle 指的是已销毁的 VMAR。
如果出现以下任一情况,则为 ZX_ERR_INVALID_ARGS:
- mapped_addr 或 options 无效。
- 如果未指定 ZX_VM_SPECIFIC、ZX_VM_SPECIFIC_OVERWRITE 或 ZX_VM_OFFSET_IS_UPPER_LIMIT,则 vmar_offset 不为零。
- 同时指定了 ZX_VM_SPECIFIC_OVERWRITE 和 ZX_VM_MAP_RANGE。
- ZX_VM_OFFSET_IS_UPPER_LIMIT 与 ZX_VM_SPECIFIC 或 ZX_VM_SPECIFIC_OVERWRITE 一起指定。
- 指定了 ZX_VM_FAULT_BEYOND_STREAM_SIZE。
- 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 因内存不足而导致的失败。
用户空间无法很好地处理此(不太可能发生的)错误。
在未来的 build 中,此错误将不再发生。
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。区域的访问权限规范可能会修改或限制这些操作,如规范中所述。