摘要
从分页器分离 VMO。
声明
#include <zircon/syscalls.h>
zx_status_t zx_pager_detach_vmo(zx_handle_t pager, zx_handle_t pager_vmo);
说明
从 pager 分离 pager_vmo 会导致内核停止为 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 将它们写回。写回后,这些页面将再次变为干净页面,因此内核可以自由地将其逐出。
权限
寻呼机必须是 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。