zx_pager_split_vmo

总结

将 VMO 与分页器分离。

声明

#include <zircon/syscalls.h>

zx_status_t zx_pager_detach_vmo(zx_handle_t pager, zx_handle_t pager_vmo);

说明

pager_vmopager 分离会导致内核停止将 VMO 的页面请求加入队列。 因此,后续访问本应生成页面请求将会失败。

分离后不会生成新的 ZX_PAGER_VMO_READZX_PAGER_VMO_DIRTY 请求,但某些请求可能仍在传输中。分页器服务可随意忽略这些请求,因为内核将恢复运行并使生成这些请求的线程发生故障。寻呼机服务将收到的最后一个请求是 ZX_PAGER_VMO_COMPLETE 请求。

在分离的 VMO 上,以下分页器系统调用将失败:

内核可以随意从已分离的 VMO 逐出干净页,但会保留所有脏页。收到 ZX_PAGER_VMO_COMPLETE 请求后,寻呼机服务应使用 zx_pager_query_dirty_ranges() 查询这些范围,并使用 zx_pager_op_range() ZX_PAGER_OP_WRITEBACK_BEGINZX_PAGER_OP_WRITEBACK_END 将其写回。一旦这些页面被写回,这些页面就会再次变为干净,因此内核可以自由逐出它们。

权限

pager 必须为 ZX_OBJ_TYPE_PAGER 类型,且具有 ZX_RIGHT_ATTACH_VMOZX_RIGHT_MANAGE_VMO

pager_vmo 的类型必须为 ZX_OBJ_TYPE_VMO 且设为 ZX_RIGHT_WRITE

返回值

zx_pager_detach_vmo() 在成功时返回 ZX_OK,或在失败时返回以下错误代码之一。

错误

ZX_ERR_BAD_HANDLE pagerpager_vmo 不是有效的句柄。

ZX_ERR_WRONG_TYPE pager 不是分页器句柄或 pager_vmo 不是 VMO 句柄。

ZX_ERR_ACCESS_DENIED pager 没有 ZX_RIGHT_ATTACH_VMOZX_RIGHT_MANAGE_VMO,或者 pager_vmo 没有 ZX_RIGHT_WRITE

ZX_ERR_INVALID_ARGS pager_vmo 不是通过 pager 创建的 VMO。

另请参阅