zx_vmar_op_range

摘要

对映射到此 VMAR 中的 VMO 执行操作。

声明

#include <zircon/syscalls.h>

zx_status_t zx_vmar_op_range(zx_handle_t handle,
                             uint32_t op,
                             zx_vaddr_t address,
                             size_t size,
                             void* buffer,
                             size_t buffer_size);

说明

zx_vmar_op_range() 对映射到 addressaddress+size 范围内的 VMO 执行操作 op

地址大小必须完全位于此 VMAR 内,并且必须满足 zx_vmo_op_range() 为相应 VMO op(如果有)指定的对齐要求。

bufferbuffer_size 目前未使用,必须为空。

支持的操作包括:

ZX_VMAR_OP_COMMIT - 要求句柄以及用于创建任何受影响映射的 VMO 句柄具有 ZX_RIGHT_WRITE 权限,并且地址范围不得有任何子 VMAR。否则,操作的语义与 zx_vmo_op_range() ZX_VMO_OP_COMMIT 中所述的相同。

ZX_VMO_OP_DECOMMIT - 已弃用。请改用 ZX_VMAR_OP_DECOMMIT

ZX_VMAR_OP_PREFETCH - 要求 handle 以及用于创建任何受影响映射的 VMO handle 具有 ZX_RIGHT_READ。否则,操作的语义与 zx_vmo_op_range() ZX_VMO_OP_PREFETCH 中所述的相同。

ZX_VMAR_OP_DECOMMIT - 要求句柄以及用于创建任何受影响映射的 VMO 句柄具有 ZX_RIGHT_WRITE 权限,并且地址范围不得有任何子 VMAR。否则,操作的语义与 zx_vmo_op_range() ZX_VMO_OP_DECOMMIT 中所述的相同。

ZX_VMAR_OP_MAP_RANGE - 为给定范围内的已提交页面填充 CPU 页表(或架构等效项)中的条目。不填充范围中未提交的网页的条目。跳过范围内任何页面已存在的条目。

ZX_VMAR_OP_ZERO - 将零写入给定范围内的页面。要求范围内的内存可写入。否则,操作的语义与 zx_vmo_op_range() ZX_VMO_OP_ZERO 中所述的相同。

ZX_VMAR_OP_DONT_NEED - 提示指定范围内的页面不再需要,应考虑回收内存。旨在用于通过 zx_pager_create_vmo() 创建的 VMO 的映射;对于其他 VMO 类型的映射,会轻松成功。

如需了解详情,请参阅 zx_vmo_op_range() ZX_VMO_OP_DONT_NEED

ZX_VMAR_OP_ALWAYS_NEED - 指示指定范围内的页面很重要,应防止其被回收内存。旨在用于通过 zx_pager_create_vmo() 创建的 VMO 的映射;对于其他 VMO 类型的映射,会轻松成功。

如需了解详情,请参阅 zx_vmo_op_range() ZX_VMO_OP_ALWAYS_NEED

权限

如果 opZX_VMAR_OP_DECOMMIT,则 handle 必须具有 ZX_RIGHT_WRITE

如果 opZX_VMAR_OP_COMMIT,则 handle 必须具有 ZX_RIGHT_WRITE

如果 opZX_VMAR_OP_ZERO,则 handle 必须具有 ZX_RIGHT_WRITE

如果 opZX_VMAR_OP_PREFETCH,则 handle 必须具有 ZX_RIGHT_READ

返回值

zx_vmar_op_range() 在成功时返回 ZX_OK。如果失败,则返回负错误值。

错误

ZX_ERR_ACCESS_DENIED handle 没有请求的更改所需的适当权限,或者用于创建受影响的映射之一的原始 VMO handle 没有请求的更改所需的权限,或者 VMAR 本身不允许请求的更改。

ZX_ERR_BAD_HANDLE 句柄不是有效的句柄。

ZX_ERR_BAD_STATE handle 不是有效的 VMAR,或者 addresssize 指定的范围跨越了未映射的区域。

ZX_ERR_INVALID_ARGS 因以下任何原因而返回:

  • 缓冲区不为 null。
  • buffer_size 不为零。
  • 大小为零。
  • 地址未与页面对齐。
  • op 不是有效的操作。
  • opZX_VMAR_OP_COMMITZX_VMAR_OP_DECOMMIT,且所请求的范围包含子区域。
  • 所请求的范围与子区域重叠,但 handle 不具有 ZX_RIGHT_OP_CHILDREN

ZX_ERR_NOT_SUPPORTED op 不是 ZX_VMO_OP_DECOMMIT,或者一个或多个映射的 VMO 不支持所请求的 op

ZX_ERR_OUT_OF_RANGE 因以下任何原因而返回:

  • addresssize 指定的范围并非完全位于由 handle 指定的虚拟机地址范围内。
  • 此范围内映射的任何 VMO 都会缩小,以便在指定范围内的访问应生成故障。
  • 此范围内的任何映射都是使用 ZX_VM_FAULT_BEYOND_STREAM_SIZE 创建的,并且具有会在流大小之外生成故障的区域。

ZX_ERR_WRONG_TYPE 标识名不是 VMAR 标识名。

另请参阅