摘要
從呼叫器卸離 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。