摘要
将数据移到 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_vmo 到 dst_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_READ
和 ZX_RIGHT_WRITE
。
返回值
zx_vmo_transfer_data()
会在成功时返回 ZX_OK
。如果失败,将返回负的错误值(如下所述)。如果传输失败,则 src_vmo 中任意数量的页面可能已移至 dst_vmo。我们无法保证转移的确切数据量。不过,我们可以保证在满足以下条件时调用会成功:
- 不满足会导致下列错误的所有条件。
- 此操作运行期间,src_vmo 和 dst_vmo 不会被任何其他线程修改。
在此上下文中,“修改”是指直接对 VMO 或对 VMO 的引用(例如切片、引用子项等)进行写入/调整大小/固定。修改任何类型的快照的父级、子级或同级不应导致任何错误,但根据快照的不同,可能会导致写入撕裂。如果您操纵 SNAPSHOT_AT_LEAST_ON_WRITE
VMO 的父项,则可能会出现写入撕裂,因为实际转移没有承诺的原子性。请注意,在传输来自 SNAPSHOT
子级的页面时,如果特定页面尚未写入,我们可能需要进行复制,即分配新页面。
错误
ZX_ERR_BAD_HANDLE
dst_vmo 或 src_vmo 不是有效的 VMO 句柄。
ZX_ERR_INVALID_ARGS
offset、length 或 src_offset 未与页面对齐,或者 options 为非零值。
ZX_ERR_ACCESS_DENIED
src_vmo 不包含 ZX_RIGHT_WRITE
或 ZX_RIGHT_READ
,或 dst_vmo 不含 ZX_RIGHT_WRITE
。
ZX_ERR_BAD_STATE
中 src_vmo
或 dst_vmo
指定范围内的页面会被固定。
ZX_ERR_NOT_SUPPORTED
src_vmo 或 dst_vmo 是物理、连续或由分页器支持。
ZX_ERR_OUT_OF_RANGE
dst_vmo 或 src_vmo 中的指定范围无效。
ZX_ERR_NO_MEMORY
:因内存不足而失败。