zx_vmo_transfer_data

摘要

将数据移到 VMO。

声明

#include <zircon/syscalls.h>

zx_status_t zx_vmo_transfer_data(zx_vmo_t dst_vmo,
                                 uint32_t options,
                                 uint64_t offset,
                                 uint64_t length,
                                 zx_vmo_t src_vmo,
                                 uint64_t src_offset);

说明

[*src_offset*, *src_offset* + *length*) 中的页面从 将 src_vmo 更改为 dst_vmo 中的 [*offset*, *offset* + *length*)。时间是 功能等同于从 src_vmodst_vmomemmove 然后取消提交 src_vmo 中的关联页面。不过, 实现这一目的的机制是不同的后备页面 都是在 VMO 之间移动,而不是复制数据。这样, 性能大幅提高尽管存在这种不同的机制,但这种系统调用 提供的语义与 memmove 相同,因为其提供重叠 支持来源区域和目标区域。

options 字段当前必须设置为 0。

权限

dst_vmo 的类型必须为 ZX_OBJ_TYPE_VMO。此标识名必须具有 ZX_RIGHT_WRITE

src_vmo 必须为 ZX_OBJ_TYPE_VMO 类型。此标识名必须具有 ZX_RIGHT_READZX_RIGHT_WRITE

返回值

如果成功,zx_vmo_transfer_data() 会返回 ZX_OK。如果出现 则会返回负的错误值(如下所述)。如果 则 src_vmo 中任意数量的页面都可能遭到了 已移至 dst_vmo。对于具体有多少数据 已移动。不过,我们可以保证,如果调用 满足以下条件:

  1. 不属于会导致下列错误的条件 都符合。
  2. src_vmodst_vmo 不会被任何其他线程修改 。

“修改”这是指对 直接对 VMO 或对 VMO 的引用(例如 Slice、引用 儿童等)。修改任何类型的父级、子级或同级元素 快照应该不会导致任何错误, 快照可能会出现写入撕裂如果出现以下情况,则可能会出现写入内容撕裂: 将 SNAPSHOT_AT_LEAST_ON_WRITE VMO 的父项作为 实际传输没有承诺的原子性。请注意,如果 从 SNAPSHOT 子级传输页面时可能需要执行的步骤 副本数量,即分配新页面(如果该特定页面尚未 只是在编写时复制过来

错误

ZX_ERR_BAD_HANDLE dst_vmosrc_vmo 不是有效的 VMO 句柄。

ZX_ERR_INVALID_ARGS offsetlengthsrc_offset 不是网页 或 options 为非零值。

ZX_ERR_ACCESS_DENIED src_vmo 不包含 ZX_RIGHT_WRITEZX_RIGHT_READdst_vmo 没有 ZX_RIGHT_WRITE

ZX_ERR_BAD_STATE src_vmo 内指定范围的网页,或 “dst_vmo”已固定。

ZX_ERR_NOT_SUPPORTED src_vmodst_vmo 是物理文件, 连续或分页器支持

ZX_ERR_OUT_OF_RANGE dst_vmosrc_vmo 中指定的范围是 无效。

ZX_ERR_NO_MEMORY 因内存不足而失败。

另请参阅