Create a child of a VM Object.
#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() creates a new virtual memory object (VMO) a child of an existing vmo. The behavior of the semantics depends on the type of the child.
One handle is returned on success, representing an object with the requested size.
options must contain exactly one of the following flags to specify the child type:
In addition, options can contain zero or more of the following flags to further specify the child's behavior:
offset must be page aligned.
offset + size may not exceed the range of a 64bit unsigned value.
Both offset and size may start or extend beyond the original VMO's size.
The size of the VMO will be rounded up to the next page size boundary.
By default the rights of the child handled will be the same as the original with a few exceptions. See
zx_vmo_create() for a discussion of the details of each right.
If options is ZX_VMO_CHILD_COPY_ON_WRITE the following rights are added:
Cloning a VMO causes the existing (source) VMO ZX_VMO_ZERO_CHILDREN signal to become inactive. Only when the last child is destroyed and no mappings of those child into address spaces exist, will ZX_VMO_ZERO_CHILDREN become active again.
VMOs produced by this mode will interact with the VMO syscalls in the following ways:
zx_vmo_op_range() on a clone will only affect pages allocated to the clone, never its parent.
zx_vmo_op_range()), the parent's page will become visible once again, still with copy-on-write semantics.
zx_vmo_op_range() COMMIT mode, a the new page will have the same contents as the parent's corresponding page (or zero-filled if no such page exists).
zx_vmo_op_range() LOOKUP mode is used, the parent's pages will be visible where the clone has not modified them.
handle must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_DUPLICATE and have ZX_RIGHT_READ.
zx_vmo_create_child() returns ZX_OK on success. In the event of failure, a negative error value is returned.
ERR_BAD_TYPE Input handle is not a VMO.
ZX_ERR_ACCESS_DENIED Input handle does not have sufficient rights.
ZX_ERR_INVALID_ARGS out is an invalid pointer or NULL or the offset is not page aligned.
ZX_ERR_OUT_OF_RANGE offset + size is too large.
ZX_ERR_NO_MEMORY Failure due to lack of memory. There is no good way for userspace to handle this (unlikely) error. In a future build this error will no longer occur.