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 操作(如果有)指定的对齐要求。

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 - 要求句柄以及用于创建任何受影响的映射的 VMO 句柄具有 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_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_PREFETCH,则 handle 必须包含 ZX_RIGHT_READ

返回值

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

错误

ZX_ERR_ACCESS_DENIED 句柄不具备对所请求更改的适当权限,或者用于创建受影响的映射之一的原始 VMO 句柄不具备对所请求更改的权限,或者 VMAR 本身不允许所请求的更改。

ZX_ERR_BAD_HANDLE handle 不是有效的 handle。

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

ZX_ERR_INVALID_ARGS 以下任一原因都可能会导致返回此错误:

  • buffer 不为 null。
  • buffer_size 不为零。
  • size 为零。
  • 地址未对齐到页面。
  • op 不是有效的操作。
  • opZX_VMAR_OP_COMMITZX_VMAR_OP_DECOMMIT 之一,并且请求的范围包含子区域。
  • 请求的范围与子区域重叠,并且句柄没有 ZX_RIGHT_OP_CHILDREN

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

ZX_ERR_OUT_OF_RANGE addresssize 指定的范围并非完全位于 handle 指定的虚拟机地址范围内,或者在此范围内映射的任何 VMO 都已缩减大小,以致于对指定范围内的访问应会产生故障。

ZX_ERR_WRONG_TYPE handle 不是 VMAR handle。

另请参阅