摘要
对一系列 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:
buffer 和 buffer_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_OK
。buffer 应指向 zx_vmo_lock_state_t
结构体,以及
buffer_size 应当包含该结构。返回有关已锁定的和之前
舍弃的范围在缓冲区中,以便客户端可以根据需要重新初始化舍弃的内容。
应立即锁定整个 VMO,因此 offset 应为 0,size 应为当前
VMO 的大小(zx_vmo_get_size()
返回的页面对齐大小)。需要使用
按 ZX_RIGHT_READ
或 ZX_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_READ
或 ZX_RIGHT_WRITE
向右移动。请注意,锁定本身不会在
VMO;它只是将 VMO 的状态标记为被内核“无法舍弃”。
ZX_VMO_OP_UNLOCK
- 解锁使用 ZX_VMO_DISCARDABLE
创建的 VMO 中的一系列页面,
这表明在内存压力下,内核可以随意舍弃它们。已解锁
仍会计为已提交的网页
应立即解锁整个 VMO,因此 offset 应为 0,size 应为当前
VMO 的大小(zx_vmo_get_size()
返回的页面对齐大小)。需要使用
按 ZX_RIGHT_READ
或 ZX_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
提示会一直存在,直到内核决定替换
提示。
权限
如果 op 为 ZX_VMO_OP_COMMIT
,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO
且具有 ZX_RIGHT_WRITE
。
如果 op 为 ZX_VMO_OP_DECOMMIT
,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO
且具有 ZX_RIGHT_WRITE
。
如果 op 为 ZX_VMO_OP_PREFETCH
,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO
且具有 ZX_RIGHT_READ
。
如果 op 为 ZX_VMO_OP_CACHE_SYNC
,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO
且具有 ZX_RIGHT_READ
。
如果 op 为 ZX_VMO_OP_CACHE_INVALIDATE
,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO
且具有 ZX_RIGHT_WRITE
。
如果 op 为 ZX_VMO_OP_CACHE_CLEAN
,则 handle 的类型必须为 ZX_OBJ_TYPE_VMO
且具有 ZX_RIGHT_READ
。
如果 op 为 ZX_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_RANGE
由 offset 和 size 指定的无效内存范围。
ZX_ERR_NO_MEMORY
,用于为 ZX_VMO_OP_COMMIT
、ZX_VMO_OP_PREFETCH
或
ZX_VMO_OP_ZERO
失败。
ZX_ERR_WRONG_TYPE
handle 不是 VMO 句柄。
ZX_ERR_ACCESS_DENIED
handle 没有足够的权限,无法执行此操作。
ZX_ERR_INVALID_ARGS
buffer 是无效指针(如果操作需要),op 不是
是有效操作,size 为零且 op 是缓存操作,或 op 为 ZX_VMO_OP_DECOMMIT
和范围没有页面对齐。
ZX_ERR_NOT_SUPPORTED
:
- op 为 ZX_VMO_OP_LOCK
、ZX_VMO_OP_TRY_LOCK
或 ZX_VMO_OP_UNLOCK
,而 VMO 不是
使用 ZX_VMO_DISCARDABLE
创建。
- op 为 ZX_VMO_OP_DECOMMIT
,并且底层 VMO 不允许取消提交。
- op 为 ZX_VMO_OP_CACHE_INVALIDATE
,kernel.enable-debugging-syscalls
为 false。
- op:ZX_VMO_OP_CACHE_SYNC
、ZX_VMO_OP_CACHE_INVALIDATE
、ZX_VMO_OP_CACHE_CLEAN
或 ZX_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_COMMIT
或 ZX_VMO_OP_PREFETCH
,则 VMO 由
分页器或 VMO 处于错误状态,阻止填充请求的网页。
op 为 ZX_VMO_OP_UNLOCK
,VMO 可舍弃,并且 VMO 之前未锁定。
ZX_ERR_IO
操作原为 ZX_VMO_OP_COMMIT
或 ZX_VMO_OP_PREFETCH
,VMO 由分页器支持,
分页器在提交所请求的页面时遇到 I/O 错误。
ZX_ERR_IO_DATA_INTEGRITY
操作为 ZX_VMO_OP_COMMIT
或 ZX_VMO_OP_PREFETCH
,VMO 为
由分页器支持,以及该分页器针对正在提交的页面读取的内容
文件损坏。
另请参阅
zx_vmo_create()
zx_vmo_create_child()
zx_vmo_get_size()
zx_vmo_read()
zx_vmo_set_size()
zx_vmo_write()