摘要
创建虚拟机对象的子级。
声明
#include <zircon/syscalls.h>
zx_status_t zx_vmo_create_child(zx_handle_t handle,
uint32_t options,
uint64_t offset,
uint64_t size,
zx_handle_t* out);
说明
zx_vmo_create_child()
用于创建新的虚拟内存
对象 (VMO) 是现有 vmo 的子级。行为
语义类型取决于子项的类型。
成功后会返回一个句柄,表示具有所请求 。
options 必须正好包含以下其中一个标志,以指定 子类型:
ZX_VMO_CHILD_SNAPSHOT
- 创建一个行为像执行紧急复制的子级。当 当发生写入时,父级和子级都会执行延迟复制。延迟复制允许子级和 使它们彼此之间存在差异从父级 VMO 大小以外的范围读取的任何数据 包含零,并且写入会分配新的零填充页面。 以下版本不支持此标志: <ph type="x-smartling-placeholder">- </ph>
- 已固定区域的 VMO。
- 使用
zx_vmo_create_physical()
或作为其后代创建的 VMO,或者zx_vmo_create_contiguous()
- 由用户分页器支持的 VMO。 如需了解 VMO 系统调用与子级的交互,请参阅备注。
在调用 ZX_VMO_CHILD_NO_WRITE 时,ZX_VMO_CHILD_SNAPSHOT 会创建一个不可变的 VMO, 选项已启用,而 ZX_VMO_CHILD_RESIZABLE 选项已停用。
ZX_VMO_CHILD_SNAPSHOT_AT_LEAST_ON_WRITE
- 创建一个行为至少为复制功能的子级 写入语义。对子项执行的任何写入操作都会从父项导入页面的副本, 之后,其内容可能与父级不同。直到有页面被写入和复制后, 在父级执行写入操作时,允许返回更改的值(但不保证)。 此标志不可用于使用zx_vmo_create_physical()
创建的 VMO,zx_vmo_create_contiguous()
或此类 VMO 的后代。 如需了解 VMO 系统调用与子级的交互,请参阅备注。
ZX_VMO_CHILD_SNAPSHOT_MODIFIED
- 创建一个行为像即时副本一样的子项
父网页上任何不受寻呼机支持的网页(即
是分页器支持的 VMO 的子项。由分页器支持的页面至少具有写入时复制语义。这个
标志不能用于使用 zx_vmo_create_physical()
、zx_vmo_create_contiguous()
、
包含固定页面的 VMO,或此类 VMO 的后代。也不支持任何
使用 SNAPSHOT_AT_LEAST_ON_WRITE
创建的 VMO,具有非 Slice 子级或不是以下子级的子级
一个由分页器支持的 VMO。
如需了解 VMO 系统调用与子级的交互,请参阅备注。
ZX_VMO_CHILD_SLICE
- 创建对其有直接读写权限的 Slice 父级的一部分。对切片 VMO 的所有操作都像在父代上完成一样。 Slice 与父级的重复句柄不同,它只允许访问 父级 VMO,并允许使用ZX_VMO_ZERO_CHILDREN
信号。此标志可用于 使用zx_vmo_create_physical()
或zx_vmo_create_contiguous()
及其 子孙级。此标志不能与使用ZX_VMO_RESIZABLE
选项创建的 VMO 一起使用。ZX_VMO_CHILD_REFERENCE
- 创建对 VMO 的引用。针对参考 VMO 的所有操作 其行为就像在父级上完成时一样。引用始终占据整个父项,并且 offset 和 size 必须为 0。如果用户想保留 使用ZX_VMO_ZERO_CHILDREN
信号跟踪对 VMO 的未完成引用。请参阅 如需详细了解此衡量因素,请参阅备注。 此标志不可用于使用zx_vmo_create_physical()
创建的 VMO,zx_vmo_create_contiguous()
或此类 VMO 的后代。
此外,options 可以包含以下零个或多个标记,以 进一步指定子级的行为:
ZX_VMO_CHILD_RESIZABLE
- 创建一个可调整大小的子级 VMO。这与ZX_VMO_CHILD_SLICE
。ZX_VMO_CHILD_NO_WRITE
- 创建无法写入的子节点。这与ZX_VMO_CHILD_RESIZABLE
。
offset 必须与页面对齐。
offset + size 不得超过 64 位无符号值的范围。
偏移和大小都可以开始或超出原始 VMO 的大小。
VMO 的大小将向上舍入到下一个页面大小边界。
VMO 的内容大小将初始化为给定(未舍入)的大小。
结合使用 zx_object_get_property()
和 ZX_PROP_VMO_CONTENT_SIZE
来读取
VMO 的内容大小将 zx_object_set_property()
与以下账号搭配使用
ZX_PROP_VMO_CONTENT_SIZE
,用于设置不使用
调整 VMO 的大小
默认情况下,子标识名与
但也有一些例外请参阅 zx_vmo_create()
我们将讨论每项权利的细节。
如果 options 包含 ZX_VMO_CHILD_RESIZABLE
,则系统会添加 ZX_RIGHT_RESIZE
。
对于 ZX_VMO_CHILD_REFERENCE
,ZX_VMO_CHILD_RESIZABLE
选项用于控制父级
可以使用 out 中返回的参考句柄来调整 VMO 的大小。该引用将看到调整大小的
如果父级 VMO 可调整大小,则无论是否存在
ZX_VMO_CHILD_RESIZABLE
。但是,只有父级 VMO 支持 ZX_VMO_CHILD_RESIZABLE
可调整大小,即无法为不可调整大小的 VMO 创建可调整大小的引用。
在任何情况下,如果设置了 ZX_VMO_NO_WRITE
,则 ZX_RIGHT_WRITE
将被移除。
如果 options 为 ZX_VMO_CHILD_SNAPSHOT
、ZX_VMO_CHILD_SNAPSHOT_AT_LEAST_ON_WRITE
或
ZX_VMO_CHILD_SNAPSHOT_MODIFIED
和 ZX_VMO_CHILD_NO_WRITE
未设置,则 ZX_RIGHT_WRITE
将
将添加,并移除ZX_RIGHT_EXECUTE
。
备注
创建子级 VMO 会导致现有(来源)VMO ZX_VMO_ZERO_CHILDREN
信号
无效。仅当最后一个子级被销毁且没有映射时
的子项进入地址空间,则 ZX_VMO_ZERO_CHILDREN
会变为
再次激活。
非切片子级 vmos 将通过以下方式与 VMO 系统调用交互:
- 子级上的
zx_vmo_op_range()
提交模式会将页面提交到该子级中 与其父级的对应网页的内容相同。如果这些网页是由 分页器,此操作也会提交父级中的那些页面。否则,如果这些网页 未提交,零填充的网页将直接提交到 但不影响父级。 - 不支持
zx_vmo_op_range()
的 DECOMMIT 模式。
权限
handle 的类型必须为 ZX_OBJ_TYPE_VMO
,包含 ZX_RIGHT_DUPLICATE
且 ZX_RIGHT_READ
。
返回值
如果成功,zx_vmo_create_child()
会返回 ZX_OK
。在活动中
则会返回负的错误值。
错误
ZX_ERR_BAD_TYPE
输入句柄不是 VMO。
ZX_ERR_ACCESS_DENIED
输入句柄的权限不足。
ZX_ERR_INVALID_ARGS
out 是无效的指针或 NULL
或者偏移未页面对齐,或者提供的 options 组合不兼容。
ZX_ERR_OUT_OF_RANGE
offset + size 过大。
ZX_ERR_NO_MEMORY
因内存不足而失败。
用户空间没有好办法处理这种(不太可能)错误。
在将来的版本中,此错误不会再发生。
ZX_ERR_BAD_STATE
无法创建 COW 子级,因为 vmo 包含一些
固定网页。
ZX_ERR_NOT_SUPPORTED
输入句柄是可舍弃的 VMO,或输入句柄是
可调整大小的 VMO,并且 options 包含 ZX_VMO_CHILD_SLICE
。
另请参阅
zx_vmar_map()
zx_vmo_create()
zx_vmo_get_size()
zx_vmo_op_range()
zx_vmo_read()
zx_vmo_set_size()
zx_vmo_write()