摘要
对映射到此 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()
对范围 address 中映射到的 VMO 执行操作 op
地址 + 大小。
地址和大小必须完全符合此 VMAR 的要求,并且必须满足对齐要求
zx_vmo_op_range()
为相应 VMO 操作(如果有)指定的值。
buffer 和 buffer_size 目前尚未使用,必须为空。
支持的操作包括:
ZX_VMAR_OP_COMMIT
- 需要该 handle,以及用于创建任何受影响的 VMO 句柄的 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 句柄的 VMO 句柄
具有 ZX_RIGHT_READ
。运算的语义如以下所述
zx_vmo_op_range()
ZX_VMO_OP_PREFETCH
。
ZX_VMAR_OP_DECOMMIT
- 需要该 handle,以及用于创建任何受影响的 VMO 句柄的 VMO 句柄
映射,拥有 ZX_RIGHT_WRITE
权限,并且地址范围不得包含任何子 VMAR。
运算的语义如以下所述
zx_vmo_op_range()
ZX_VMO_OP_DECOMMIT
。
ZX_VMAR_OP_MAP_RANGE
- 填充 CPU 页面表中的条目(或等效架构)
指定范围内已提交的页面。范围内未提交页面的条目不包含在内
填充。跳过范围内任何页面已存在的条目。
ZX_VMAR_OP_DONT_NEED
- 提示不再需要指定范围内的页面,也应该不再需要这些页面
进行内存回收的考虑因素适用于使用如下方式创建的 VMO 的映射:
zx_pager_create_vmo()
;几乎成功
其他 VMO 类型的映射。
请参阅 zx_vmo_op_range()
ZX_VMO_OP_DONT_NEED
了解详情。
ZX_VMAR_OP_ALWAYS_NEED
- 提示指定范围内的网页非常重要,应该
避免内存回收适用于使用如下方式创建的 VMO 的映射:
zx_pager_create_vmo()
;几乎成功
其他 VMO 类型的映射。
请参阅 zx_vmo_op_range()
ZX_VMO_OP_ALWAYS_NEED
了解详情。
权限
如果 op 为 ZX_VMAR_OP_DECOMMIT
,handle 必须具有 ZX_RIGHT_WRITE
。
如果 op 为 ZX_VMAR_OP_COMMIT
,handle 必须具有 ZX_RIGHT_WRITE
。
如果 op 为 ZX_VMAR_OP_PREFETCH
,handle 必须具有 ZX_RIGHT_READ
。
返回值
如果成功,zx_vmar_op_range()
会返回 ZX_OK
。如果失败,错误值为负值
。
错误
ZX_ERR_ACCESS_DENIED
handle 不具备适当的权限,无法执行所请求的更改,或
用于创建其中一个受影响映射的原始 VMO 句柄没有
或 VMAR 本身不允许所请求的更改。
ZX_ERR_BAD_HANDLE
handle 不是有效的句柄。
ZX_ERR_BAD_STATE
handle 不是实时 VMAR,或 address 和 size 指定的范围
跨越未映射的区域。
ZX_ERR_INVALID_ARGS
因以下任一原因而被退回:
- buffer 为非 null。
- buffer_size 为非零值。
- size 为零。
- address 未与页面对齐。
- op 不是有效操作。
- op 为
ZX_VMAR_OP_COMMIT
或ZX_VMAR_OP_DECOMMIT
之一,并且为请求的范围 包含次级区域。 - 请求的范围与子区域重叠,并且 handle 没有
ZX_RIGHT_OP_CHILDREN
。
ZX_ERR_NOT_SUPPORTED
操作不是 ZX_VMO_OP_DECOMMIT
,或一个或多个映射的 VMO 未
支持请求的操作。
ZX_ERR_OUT_OF_RANGE
address 和 size 指定的范围并非完全位于虚拟机内
handle 指定的地址范围。
ZX_ERR_WRONG_TYPE
handle 不是 VMAR 句柄。