摘要
将 VMO 与分页器分离。
声明
#include <zircon/syscalls.h>
zx_status_t zx_pager_detach_vmo(zx_handle_t pager, zx_handle_t pager_vmo);
说明
将 pager_vmo 与 pager 分离会导致内核停止将 VMO 的页面请求加入队列。 后续访问本应生成页面请求,则会失败。
分离后,不会生成新的 ZX_PAGER_VMO_READ 和 ZX_PAGER_VMO_DIRTY 请求。
但某些请求可能仍在提交中。寻呼机服务可随意忽略这些请求,因为
内核将恢复并故障生成这些请求的线程。分页器的最终请求
服务收到的一个 ZX_PAGER_VMO_COMPLETE 请求。
在已分离的 VMO 上,以下分页器系统调用将失败:
zx_pager_supply_pages()zx_pager_op_range()、ZX_PAGER_OP_DIRTY和ZX_PAGER_OP_FAIL以下内容将继续像分离前一样正常运行:zx_pager_query_dirty_ranges()zx_pager_query_vmo_stats()zx_pager_op_range()、ZX_PAGER_OP_WRITEBACK_BEGIN和ZX_PAGER_OP_WRITEBACK_END
内核可以自由地从已分离的 VMO 中逐出干净页,但会保留所有脏页。启用
收到 ZX_PAGER_VMO_COMPLETE 请求后,寻呼服务应查询这些范围
与 zx_pager_query_dirty_ranges() 联系,并使用 zx_pager_op_range() 进行回复
ZX_PAGER_OP_WRITEBACK_BEGIN 和 ZX_PAGER_OP_WRITEBACK_END。一旦收到回复
这些网页会再次变为整洁有序,以便内核随时将其逐出。
权限
pager 的类型必须为 ZX_OBJ_TYPE_PAGER 且包含 ZX_RIGHT_ATTACH_VMO 且
ZX_RIGHT_MANAGE_VMO。
pager_vmo 的类型必须为 ZX_OBJ_TYPE_VMO 且包含 ZX_RIGHT_WRITE。
返回值
zx_pager_detach_vmo() 在成功时返回 ZX_OK,或者在失败时返回以下某个错误代码。
错误
ZX_ERR_BAD_HANDLE pager 或 pager_vmo 不是有效的句柄。
ZX_ERR_WRONG_TYPE pager 不是分页器句柄,或 pager_vmo 不是 VMO 句柄。
ZX_ERR_ACCESS_DENIED 分页器没有 ZX_RIGHT_ATTACH_VMO 或 ZX_RIGHT_MANAGE_VMO,
或 pager_vmo 没有 ZX_RIGHT_WRITE。
ZX_ERR_INVALID_ARGS pager_vmo 不是通过 pager 创建的 VMO。