摘要
将数据移到 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 的 memmove
然后取消提交 src_vmo 中的关联页面。不过,
实现这一目的的机制是不同的后备页面
都是在 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 的引用(例如 Slice、引用
儿童等)。修改任何类型的父级、子级或同级元素
快照应该不会导致任何错误,
快照可能会出现写入撕裂如果出现以下情况,则可能会出现写入内容撕裂:
将 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
因内存不足而失败。