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_vmo,后跟 src_vmo 中关联页面的取消提交。memmove但是,实现这一目的的机制是不同的;后备页面实际上会在多个 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 的引用(例如切片、引用子项等)进行写入/调整大小/固定。修改任何类型的快照的父级、子级或同级不应导致任何错误,但根据快照的不同,可能会导致写入撕裂。如果您操纵 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_READ,或 dst_vmo 不含 ZX_RIGHT_WRITE

ZX_ERR_BAD_STATEsrc_vmodst_vmo 指定范围内的页面会被固定。

ZX_ERR_NOT_SUPPORTED src_vmodst_vmo 是物理、连续或由分页器支持。

ZX_ERR_OUT_OF_RANGE dst_vmosrc_vmo 中的指定范围无效。

ZX_ERR_NO_MEMORY:因内存不足而失败。

另请参阅