摘要
创建一个分页器拥有的 VMO。
声明
#include <zircon/syscalls.h>
zx_status_t zx_pager_create_vmo(zx_handle_t pager,
uint32_t options,
zx_handle_t port,
uint64_t key,
uint64_t size,
zx_handle_t* out);
说明
创建分页器对象拥有的 VMO。size [尺寸] 将四舍五入为下一页面大小 边界,而 options 必须为零或以下标志的组合:
ZX_VMO_RESIZABLE
- 如果可以调整 VMO 的大小。
ZX_VMO_TRAP_DIRTY
- 如果对 VMO 中的干净页执行的写入操作应被内核捕获,并且
在继续写入之前,转发至寻呼机服务以获得确认。
ZX_VMO_UNBOUNDED
,用于创建一个初始化为可能的最大大小的 VMO。无法使用
与 ZX_VMO_RESIZABLE
结合使用。Size 参数仅设置数据流大小。
成功后,返回的 VMO 与使用 zx_vmo_create()
创建的 VMO 拥有相同的权限,
与使用 ZX_VMO_ZERO_CHILDREN
时的行为相同。在 VMO 上运行的 Syscall
需要显式标记,以允许针对用户空间分页器服务的阻塞 IPC;除此之外,
VMO 是否归分页器所有都不会影响系统调用的语义。
TODO(stevend):在克隆和取消提交更新后更新差异
当满足特定条件时,页面请求将传送到 port。这些数据包
将 type 设置为 ZX_PKT_TYPE_PAGE_REQUEST
,将 key 设置为提供给
zx_pager_create_vmo()
。数据包的并集类型为 zx_packet_page_request_t
:
typedef struct zx_packet_page_request {
uint16_t command;
uint16_t flags;
uint32_t reserved0;
uint64_t offset;
uint64_t length;
uint64_t reserved1;
} zx_packet_page_request_t;
offset 和 length 始终与页面对齐。flags 中任意位的值 未定义 - 当前未定义标志。指标的触发及其含义 数据包依赖于 command,该参数的值可以是以下值之一:
ZX_PAGER_VMO_READ
:当应用访问寻呼机 VMO 中的非常驻页面时发送。通过
分页器服务应使用
zx_pager_supply_pages()
。提供页面就是对请求的隐式肯定确认。
ZX_PAGER_VMO_DIRTY
:当应用写入分页器的 VMO 中的常驻干净页时发送
使用 ZX_VMO_TRAP_DIRTY
标志创建。寻呼机服务应确认
[offset, offset + length] 可以被污染,以允许写入继续,并且
zx_pager_op_range()
ZX_PAGER_OP_DIRTY
。
ZX_PAGER_VMO_COMPLETE
:当不再针对相应
VMO,要么是因为 zx_pager_detach_vmo()
,要么是因为没有保留对 VMO 的引用。
如果关闭 pager,系统将不会再向 port(包括
ZX_PAGER_VMO_COMPLETE
消息)。此外,未来的所有访问行为
已调用 zx_pager_detach_vmo()
。
权限
pager 的类型必须为 ZX_OBJ_TYPE_PAGER
且包含 ZX_RIGHT_ATTACH_VMO
。
port 的类型必须为 ZX_OBJ_TYPE_PORT
且包含 ZX_RIGHT_WRITE
。
返回值
zx_pager_create_vmo()
在成功时返回 ZX_OK,或者在失败时返回以下某个错误代码。
错误
ZX_ERR_INVALID_ARGS
out 是无效的指针或 NULL,options 包含不受支持的值
标志组合。
ZX_ERR_BAD_HANDLE
pager 或 port 不是有效的句柄。
ZX_ERR_ACCESS_DENIED
pager 不包含 ZX_RIGHT_ATTACH_VMO
或 port 没有
ZX_RIGHT_WRITE
。
ZX_ERR_WRONG_TYPE
pager 不是分页器句柄,或 port 不是端口句柄。
ZX_ERR_OUT_OF_RANGE
请求的大小超过 VMO 大小上限。
ZX_ERR_NO_MEMORY
因内存不足而失败。