zx_vmo_op_range

摘要

对一系列 VMO 执行操作。

声明

#include <zircon/syscalls.h>

zx_status_t zx_vmo_op_range(zx_handle_t handle,
                            uint32_t op,
                            uint64_t offset,
                            uint64_t size,
                            void* buffer,
                            size_t buffer_size);

说明

zx_vmo_op_range() 可对虚拟内存保存的页面执行缓存和内存操作 对象 (VMO)。

offset 字节偏移量,用于指定 VMO 保留的内存中 op 的起始位置。

size 长度(以字节为单位)。

op

bufferbuffer_size 可能需要或不使用,具体取决于下述 op

ZX_VMO_OP_COMMIT - 提交页面的“size”字节,从 VMO 的“偏移”字节开始。 如需了解详情,请参阅 vm 对象文档。 需要 ZX_RIGHT_WRITE 权限。

ZX_VMO_OP_DECOMMIT - 从偏移量释放之前提交到 VMO 的一系列页面 设置为 offset+size,这会将相应范围的字节重置为 0。需要 ZX_RIGHT_WRITE 权限。 只有通过 zx_vmo_create()(没有非切片)创建的 vmos 支持此功能 以及此类 vmos 的 Slice 子级。提供的范围必须与页面对齐。

ZX_VMO_OP_PREFETCH - 从以下字节的“offset”字节开始预取页面的“size”字节 VMO。实际页面不一定会提交,但将来对该范围的读取应该具有相似的 性能特征,就像将此操作替换为该范围内读取操作一样。 需要 ZX_RIGHT_READ 权限。

ZX_VMO_OP_ZERO - 将 VMO 中的字节范围从 offset 重置为 offset + size 0.这在语义上等同于 zx_vmo_write(),只不过它能够执行更多操作 高效、高效地利用重复内容删除共享的零页面,从而节省内存。需要 ZX_RIGHT_WRITE 权限。

ZX_VMO_OP_LOCK - 锁定使用 ZX_VMO_DISCARDABLE 创建的 VMO 中的一系列页面,防止 使它们不会被内核舍弃。保证成功锁定 VMO 并返回 如果参数有效,则返回 ZX_OKbuffer 应指向 zx_vmo_lock_state_t 结构体,以及 buffer_size 应当包含该结构。返回有关已锁定的和之前 舍弃的范围在缓冲区中,以便客户端可以根据需要重新初始化舍弃的内容。

应立即锁定整个 VMO,因此 offset 应为 0,size 应为当前 VMO 的大小(zx_vmo_get_size() 返回的页面对齐大小)。需要使用 按 ZX_RIGHT_READZX_RIGHT_WRITE 向右移动。请注意,锁定本身不会在 VMO;它只是将 VMO 的状态标记为被内核“无法舍弃”。

buffer 应为 zx_info_lock_state_t 类型的指针。

typedef struct zx_vmo_lock_state {
  // |offset| and |size| track the locked range, and will be set to the |offset|
  // and |size| arguments passed in if the ZX_VMO_OP_LOCK is successful.
  uint64_t offset;
  uint64_t size;
  // |discarded_offset| and |discarded_size| track the discarded range prior to
  // the lock operation. This is the maximal range within the locked range that
  // contains discarded pages; not all pages within this range might have been
  // discarded. Both |discarded_offset| and |discarded_size| will be set to 0 if
  // the range was not discarded.
  uint64_t discarded_offset;
  uint64_t discarded_size;
} zx_vmo_lock_state_t;

ZX_VMO_OP_TRY_LOCK - 锁定使用 ZX_VMO_DISCARDABLE 创建的 VMO 中的一系列页面, 以防止内核舍弃它们。仅当范围尚未设置时才能成功 已被内核舍弃,否则会失败并显示 ZX_ERR_UNAVAILABLE。此操作 是 ZX_VMO_OP_LOCK 的轻量级替代方案,用于在无需没有虚拟机的情况下 设置 buffer 参数。它还让客户可以选择不采取任何行动, 未能锁定 VMO;如果客户端希望再次锁定 VMO,必须使用 ZX_VMO_OP_LOCK

应立即锁定整个 VMO,因此 offset 应为 0,size 应为当前 VMO 的大小(zx_vmo_get_size() 返回的页面对齐大小)。需要使用 按 ZX_RIGHT_READZX_RIGHT_WRITE 向右移动。请注意,锁定本身不会在 VMO;它只是将 VMO 的状态标记为被内核“无法舍弃”。

ZX_VMO_OP_UNLOCK - 解锁使用 ZX_VMO_DISCARDABLE 创建的 VMO 中的一系列页面, 这表明在内存压力下,内核可以随意舍弃它们。已解锁 仍会计为已提交的网页

应立即解锁整个 VMO,因此 offset 应为 0,size 应为当前 VMO 的大小(zx_vmo_get_size() 返回的页面对齐大小)。需要使用 按 ZX_RIGHT_READZX_RIGHT_WRITE 向右移动。

ZX_VMO_OP_CACHE_SYNC - 将指令缓存与数据缓存同步,以便以前写入的内容有效 对指令提取可见 需要 ZX_RIGHT_READ 权限。

ZX_VMO_OP_CACHE_INVALIDATE - 执行缓存失效操作,以便未来的读取看到 对主内存的外部更改请注意,只有在 kernel.enable-debugging-syscalls 为 true。如果未启用调试系统调用,此操作 将失败并显示 ZX_ERR_NOT_SUPPORTED 需要 ZX_RIGHT_WRITE 右权限。

ZX_VMO_OP_CACHE_CLEAN - 清理(回写)数据缓存,以便之前的写入内容在主线程中可见 内存。 需要 ZX_RIGHT_READ 权限。

ZX_VMO_OP_CACHE_CLEAN_INVALIDATE - 同时执行缓存清理和使操作失效。 需要 ZX_RIGHT_READ 权限。

ZX_VMO_OP_DONT_NEED - 提示不再需要指定范围内的页面,也应该不再需要这些页面 进行内存回收的考虑因素适合与使用 zx_pager_create_vmo();几乎成功 其他 VMO。

这仅适用于给定范围内已提交的页面,也就是说,系统不会 因此操作而产生的错误。如果需要,offset 将向下舍入到上一页 且 offset+size 将四舍五入到下一页边界。

ZX_VMO_OP_ALWAYS_NEED - 提示指定范围内的网页非常重要,应该 避免内存回收当系统对系统进行禁用时,内核可能会决定 内存不足时的性能。此提示也不会阻止网页通过 而不是内存回收(例如取消提交、VMO 调整大小或 VMO 销毁)。适用于 使用 zx_pager_create_vmo() 创建的 VMO;平凡的 在其他 VMO 上成功。

在适用的情况下,这可能会提交指定范围内的页面,例如如果 VMO 由 分页器中的页面将被提交,如果是克隆,则会提交父级中可见的页面 将得到承诺如果需要,offset 将向下舍入到上一页 且 offset+size 将四舍五入到下一页边界。

请注意,ZX_VMO_OP_DONT_NEED 不会撤消上一个 ZX_VMO_OP_ALWAYS_NEED。通过 ZX_VMO_OP_ALWAYS_NEED 提示会一直存在,直到内核决定替换 提示。

权限

如果 opZX_VMO_OP_COMMIT,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO 且具有 ZX_RIGHT_WRITE

如果 opZX_VMO_OP_DECOMMIT,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO 且具有 ZX_RIGHT_WRITE

如果 opZX_VMO_OP_PREFETCH,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO 且具有 ZX_RIGHT_READ

如果 opZX_VMO_OP_CACHE_SYNC,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO 且具有 ZX_RIGHT_READ

如果 opZX_VMO_OP_CACHE_INVALIDATE,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO 且具有 ZX_RIGHT_WRITE

如果 opZX_VMO_OP_CACHE_CLEAN,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO 且具有 ZX_RIGHT_READ

如果 opZX_VMO_OP_CACHE_CLEAN_INVALIDATE,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO 且具有 ZX_RIGHT_READ

返回值

如果成功,zx_vmo_op_range() 会返回 ZX_OK。如果失败,则系统会显示负面错误 返回的值。

错误

ZX_ERR_BAD_HANDLE handle 不是有效的句柄。

ZX_ERR_OUT_OF_RANGEoffsetsize 指定的无效内存范围。

ZX_ERR_NO_MEMORY,用于为 ZX_VMO_OP_COMMITZX_VMO_OP_PREFETCHZX_VMO_OP_ZERO 失败。

ZX_ERR_WRONG_TYPE handle 不是 VMO 句柄。

ZX_ERR_ACCESS_DENIED handle 没有足够的权限,无法执行此操作。

ZX_ERR_INVALID_ARGS buffer 是无效指针(如果操作需要),op 不是 是有效操作,size 为零且 op 是缓存操作,或 opZX_VMO_OP_DECOMMIT 和范围没有页面对齐。

ZX_ERR_NOT_SUPPORTED: - opZX_VMO_OP_LOCKZX_VMO_OP_TRY_LOCKZX_VMO_OP_UNLOCK,而 VMO 不是 使用 ZX_VMO_DISCARDABLE 创建。 - opZX_VMO_OP_DECOMMIT,并且底层 VMO 不允许取消提交。 - opZX_VMO_OP_CACHE_INVALIDATEkernel.enable-debugging-syscalls 为 false。 - opZX_VMO_OP_CACHE_SYNCZX_VMO_OP_CACHE_INVALIDATEZX_VMO_OP_CACHE_CLEANZX_VMO_OP_CACHE_CLEAN_INVALIDATE,而 VMO 是根据以下来源创建的 zx_vmo_create_physical()

ZX_ERR_UNAVAILABLE 操作原为 ZX_VMO_OP_TRY_LOCK,VMO 可舍弃,而 VMO 已被 被内核舍弃。

ZX_ERR_BAD_STATE 操作原为 ZX_VMO_OP_COMMITZX_VMO_OP_PREFETCH,则 VMO 由 分页器或 VMO 处于错误状态,阻止填充请求的网页。 opZX_VMO_OP_UNLOCK,VMO 可舍弃,并且 VMO 之前未锁定。

ZX_ERR_IO 操作原为 ZX_VMO_OP_COMMITZX_VMO_OP_PREFETCH,VMO 由分页器支持, 分页器在提交所请求的页面时遇到 I/O 错误。

ZX_ERR_IO_DATA_INTEGRITY 操作ZX_VMO_OP_COMMITZX_VMO_OP_PREFETCH,VMO 为 由分页器支持,以及该分页器针对正在提交的页面读取的内容 文件损坏。

另请参阅