总结
将 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_DIRTY
和ZX_PAGER_OP_FAIL
调用zx_pager_op_range()
,以下代码将继续像分离之前一样运行: 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
pager 没有 ZX_RIGHT_ATTACH_VMO
或 ZX_RIGHT_MANAGE_VMO
,或者 pager_vmo 没有 ZX_RIGHT_WRITE
。
ZX_ERR_INVALID_ARGS
pager_vmo 不是通过 pager 创建的 VMO。