摘要
对映射到此 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 到 address+size 范围内映射的 VMO 执行操作 op。
地址和大小必须完全位于此 VMAR 内,并且必须满足 zx_vmo_op_range()
为相应的 VMO 操作(如果有)指定的对齐要求。
buffer 和 buffer_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
。
权限
如果 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
句柄不具备对所请求更改的适当权限,或者用于创建受影响的映射之一的原始 VMO 句柄不具备对所请求更改的权限,或者 VMAR 本身不允许所请求的更改。
ZX_ERR_BAD_HANDLE
handle 不是有效的 handle。
ZX_ERR_BAD_STATE
handle 不是实时 VMAR,或者 address 和 size 指定的范围跨越未映射的区域。
ZX_ERR_INVALID_ARGS
以下任一原因都可能会导致返回此错误:
- buffer 不为 null。
- buffer_size 不为零。
- size 为零。
- 地址未对齐到页面。
- op 不是有效的操作。
- op 为
ZX_VMAR_OP_COMMIT
或ZX_VMAR_OP_DECOMMIT
之一,并且请求的范围包含子区域。 - 请求的范围与子区域重叠,并且句柄没有
ZX_RIGHT_OP_CHILDREN
。
ZX_ERR_NOT_SUPPORTED
op 不是 ZX_VMO_OP_DECOMMIT
,或者一个或多个映射的 VMO 不支持请求的 op。
ZX_ERR_OUT_OF_RANGE
address 和 size 指定的范围并非完全位于 handle 指定的虚拟机地址范围内,或者在此范围内映射的任何 VMO 都已缩减大小,以致于对指定范围内的访问应会产生故障。
ZX_ERR_WRONG_TYPE
handle 不是 VMAR handle。