zx_pager_create_vmo

摘要

创建一个分页器拥有的 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;

offsetlength 始终与页面对齐。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 pagerport 不是有效的句柄。

ZX_ERR_ACCESS_DENIED pager 不包含 ZX_RIGHT_ATTACH_VMOport 没有 ZX_RIGHT_WRITE

ZX_ERR_WRONG_TYPE pager 不是分页器句柄,或 port 不是端口句柄。

ZX_ERR_OUT_OF_RANGE请求的大小超过 VMO 大小上限。

ZX_ERR_NO_MEMORY 因内存不足而失败。

另请参阅