zx_vmar_assigned

摘要

分配新的子区域。

声明

#include <zircon/syscalls.h>

zx_status_t zx_vmar_allocate(zx_handle_t parent_vmar,
                             zx_vm_option_t options,
                             size_t offset,
                             size_t size,
                             zx_handle_t* child_vmar,
                             zx_vaddr_t* child_addr);

说明

parent_vmar 指定的 VMAR 中创建新的 VMAR。

options 是一个位矢量,包含以下一项或多项:

  • ZX_VM_COMPACT 对内核进行分配和映射的提示 新创建子区域内的多个资源应该保持在一起。请参阅 “NOTES”部分以供讨论。
  • ZX_VM_SPECIFIC 使用 offset 可放置映射,如果 parent_vmar 没有 ZX_VM_CAN_MAP_SPECIFIC 权限。偏移值 是相对于父区域基地址的偏移量。这是一个错误 以指定与其他 VMAR 或映射重叠的地址范围。
  • ZX_VM_OFFSET_IS_UPPER_LIMIT 将“偏移量”解释为上限 用于限制内核对偏移的选择,如果 parent_vmar,则无效 没有 ZX_VM_CAN_MAP_SPECIFIC 权限。生成的映射 将具有偏移量 + size 且 <= offset。此选项不能 如果使用了 ZX_VM_SPECIFIC,则指定此参数。
  • ZX_VM_CAN_MAP_SPECIFIC 新的 VMAR 可以有子区域/映射 使用ZX_VM_SPECIFIC创建。如果父级 没有 ZX_VM_CAN_MAP_SPECIFIC 权限。
  • ZX_VM_CAN_MAP_READ 新的 VMAR 可以包含可读的映射。 如果父级没有 ZX_VM_CAN_MAP_READ 权限,则会发生错误。
  • ZX_VM_CAN_MAP_WRITE新的 VMAR 可以包含可写映射。 如果父级没有 ZX_VM_CAN_MAP_WRITE 权限,则会发生错误。
  • ZX_VM_CAN_MAP_EXECUTE新的 VMAR 可以包含可执行映射。 如果父级没有 ZX_VM_CAN_MAP_EXECUTE 权限,则会发生错误。

如果 options 不包含 ZX_VM_SPECIFIC,则 offset 必须为 0,或 已设置 ZX_VM_OFFSET_IS_UPPER_LIMIT

此外,还可以添加以下二次幂对齐标志:

  • ZX_VM_ALIGN_1KBchild_addr 与至少 1K 字节的 2 次方对齐。
  • ZX_VM_ALIGN_2KBchild_addr 与至少 2K 字节的 2 幂对齐。
  • ZX_VM_ALIGN_4KBchild_addr 与至少 4K 字节的 2 次方对齐。
  • ZX_VM_ALIGN_8KBchild_addr 与至少 8K 字节的 2 幂对齐。

并持续到

  • ZX_VM_ALIGN_4GBchild_addr 与至少 4G 字节的 2 次方对齐。

在以下情况下,将 ZX_VM_ALIGN 标志与 ZX_VM_SPECIFIC 搭配使用将失败: parent_vmar 基址 + offset 与所请求的地址不符 值。

权限

如果optionsZX_VM_CAN_MAP_READparent_vmar 的类型必须为 ZX_OBJ_TYPE_VMAR 且包含 ZX_RIGHT_READ

如果optionsZX_VM_CAN_MAP_WRITEparent_vmar 的类型必须为 ZX_OBJ_TYPE_VMAR 且包含 ZX_RIGHT_WRITE

如果optionsZX_VM_CAN_MAP_EXECUTEparent_vmar 的类型必须为 ZX_OBJ_TYPE_VMAR 且包含 ZX_RIGHT_EXECUTE

返回值

zx_vmar_allocate() 会返回 ZX_OK,即 子区域(通过 child_addr)和新子区域的句柄(通过 child_vmar)。基础地址将是页面对齐地址,且为非零地址。 如果失败,则返回负的错误值。

错误

ZX_ERR_BAD_HANDLE parent_vmar 不是有效的句柄。

ZX_ERR_WRONG_TYPE parent_vmar 不是 VMAR 句柄。

ZX_ERR_BAD_STATE parent_vmar 是指已销毁的 VMAR。

ZX_ERR_INVALID_ARGS 表示以下任意一项: - child_vmarchild_addr 无效, - 未指定 ZX_VM_SPECIFICZX_VM_OFFSET_IS_UPPER_LIMIT 时,offset 为非零值。 - ZX_VM_OFFSET_IS_UPPER_LIMITZX_VM_SPECIFIC 一起指定。 - offsetsize 表示由于超出区域边界而不能满足的分配 - offsetsize 未页面对齐,或 size 为 0。

ZX_ERR_NO_MEMORY 这可能是因为:

  • 所请求的大小的可用地址范围在 内不可用 parent_vmar
  • 系统内存资源不足。

ZX_ERR_ACCESS_DENIED权限不足,无法完成请求的分配。

备注

取消分配

VMAR 占用的地址空间将保持分配状态(在其内部 父级 VMAR)直到通过调用 zx_vmar_destroy() 销毁 VMAR。

请注意,仅关闭 VMAR 句柄不会取消分配地址 VMAR 占用的空间。

COMPACT 标志

内核会将此标志解释为一个请求,以减少分配中的扩张。 虽然这并不需要降低 那么分配之间可能存在非常高的相关性。 开发者需要做出权衡取舍来扩大 分配,并减少必要的页面表的数量(如果他们愿意的话) 提高某些地址的相关性

另请参阅