总结
对映射到此 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 + size 范围内的 VMO 执行操作。
address 和 size 必须完全在此 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_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
。
返回值
zx_vmar_op_range()
会在成功时返回 ZX_OK
。如果失败,则返回负的错误值。
错误
ZX_ERR_ACCESS_DENIED
句柄对所请求的更改没有适当的权限,或者用于创建其中一个受影响映射的原始 VMO 句柄没有所请求的更改的权限,或者 VMAR 本身不允许所请求的更改。
ZX_ERR_BAD_HANDLE
句柄不是有效的句柄。
ZX_ERR_BAD_STATE
句柄不是实时 VMAR,或者 address 和 size 指定的范围跨越未映射的区域。
ZX_ERR_INVALID_ARGS
因以下任一原因而退货:
- buffer is non-null.
- buffer_size 为非零值。
- size 为零。
- address 未与页面对齐。
- op 不是有效操作。
- op 是
ZX_VMAR_OP_COMMIT
或ZX_VMAR_OP_DECOMMIT
之一,并且请求的范围具有子区域。 - 请求的范围与子区域重叠,而 handle 没有
ZX_RIGHT_OP_CHILDREN
。
ZX_ERR_NOT_SUPPORTED
op 不是 ZX_VMO_OP_DECOMMIT
,或者一个或多个映射的 VMO 不支持请求的 op。
ZX_ERR_OUT_OF_RANGE
由 address 和 size 指定的范围并不完全位于 handle 指定的虚拟机地址范围内。
ZX_ERR_WRONG_TYPE
句柄不是 VMAR 句柄。