摘要
将 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。