摘要
创建一个虚拟机对象。
声明
#include <zircon/syscalls.h>
zx_status_t zx_vmo_create(uint64_t size, uint32_t options, zx_handle_t* out);
说明
zx_vmo_create()
会创建一个新的、零填充的虚拟内存对象 (VMO),表示由操作系统管理的内存大小为零到大小字节的容器。
VMO 的大小将向上舍入到下一个系统页面大小边界,如 zx_system_get_page_size()
所报告。使用 zx_vmo_get_size()
可返回 VMO 的当前大小。
VMO 的内容大小将初始化为给定(未舍入)的大小。结合使用 zx_object_get_property()
和 ZX_PROP_VMO_CONTENT_SIZE
可读取 VMO 的内容大小。结合使用 zx_object_set_property()
和 ZX_PROP_VMO_CONTENT_SIZE
即可设置 VMO 的内容大小,而无需实际调整 VMO 的大小。
成功后返回一个句柄,表示一个具有所请求的大小的对象。
默认情况下,标识名上会设置以下权限:
ZX_RIGHT_DUPLICATE
- 标识名可能重复。ZX_RIGHT_TRANSFER
- 标识名可以转移到其他进程。ZX_RIGHT_READ
- 可以读取或映射具有读取权限。ZX_RIGHT_WRITE
- 可以写入或映射具有写入权限。ZX_RIGHT_MAP
- 可映射。ZX_RIGHT_GET_PROPERTY
- 可以使用zx_object_get_property()
获取其属性。ZX_RIGHT_SET_PROPERTY
- 可以使用zx_object_set_property()
设置其属性。ZX_RIGHT_RESIZE
- 可以调整大小。仅在指定了ZX_VMO_RESIZABLE
选项时设置。
options 字段可以是 0 或以下各项的组合:
ZX_VMO_RESIZABLE
,用于创建可以更改大小的 VMO。不可调整大小的 VMO 的子项可以调整大小。ZX_VMO_DISCARDABLE
,用于创建内核可以在内存压力下舍弃页面的虚拟机 O。将zx_vmo_op_range()
与ZX_VMO_OP_LOCK
结合使用可锁定使用中的可舍弃 VMO,并在使用ZX_VMO_OP_UNLOCK
完成后将其解锁,以便内核能够回收这些 VMO。新创建的可舍弃 VMO 最初处于解锁状态。ZX_VMO_UNBOUNDED
,用于创建初始化为可能的最大大小的 VMO。不能与ZX_VMO_RESIZABLE
结合使用。Size 参数仅设置流大小。
ZX_VMO_ZERO_CHILDREN
信号在新创建的 VMO 上处于启用状态。每当 VMO 的子项被创建后,该子项就会变为非活动状态;当所有子项均被销毁且不存在这些子项到地址空间的映射时,此扩展会再次变为活动状态。
权限
调用方作业政策必须允许 ZX_POL_NEW_VMO
。
返回值
zx_vmo_create()
会在成功时返回 ZX_OK
。如果失败,则返回负的错误值。
错误
ZX_ERR_INVALID_ARGS
out 是无效的指针或 NULL,options 包含不支持的标志组合。
ZX_ERR_NO_MEMORY
因内存不足而失败。
用户空间没有什么方法来处理此(不太可能)错误。在以后的 build 中,此错误不会再发生。
ZX_ERR_OUT_OF_RANGE
请求的尺寸过大。
另请参阅
zx_system_get_page_size()
zx_vmar_map()
zx_vmo_create_child()
zx_vmo_get_size()
zx_vmo_op_range()
zx_vmo_read()
zx_vmo_replace_as_executable()
zx_vmo_set_size()
zx_vmo_write()