摘要
建立呼叫器擁有的 VMO。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_pager_create_vmo(zx_handle_t pager,
uint32_t options,
zx_handle_t port,
uint64_t key,
uint64_t size,
zx_handle_t* out);
說明
建立頁面器物件擁有的 VMO。「size」會四捨五入至下一頁大小 範圍,且 options 必須為 0,或下列標記的組合:
ZX_VMO_RESIZABLE
:如果 VMO 可以調整大小。
ZX_VMO_TRAP_DIRTY
- 在 VMO 中寫入乾淨頁面時,應受核心破壞,
在繼續寫入之前,會轉送給呼叫器服務進行確認。
ZX_VMO_UNBOUNDED
建立 VMO 並初始化為最大尺寸。無法使用
結合 ZX_VMO_RESIZABLE
使用。大小引數只會設定串流大小。
成功時,傳回的 VMO 與使用 zx_vmo_create()
建立的 VMO 相同,
與 ZX_VMO_ZERO_CHILDREN
的行為相同在 VMO 上運作的 Syscalls
需要明確旗標,允許封鎖 IPC 至使用者空間呼叫器服務。進一步
或不是由呼叫器擁有的 VMO 不會影響 Syscall 的語意
TODO(stevend):更新後更新差異,以便複製及解壓縮
符合特定條件時,網頁要求會傳送至通訊埠。這些封包會
type 已設為 ZX_PKT_TYPE_PAGE_REQUEST
,key 則設為
zx_pager_create_vmo()
。封包的聯集屬於 zx_packet_page_request_t
類型:
typedef struct zx_packet_page_request {
uint16_t command;
uint16_t flags;
uint32_t reserved0;
uint64_t offset;
uint64_t length;
uint64_t reserved1;
} zx_packet_page_request_t;
offset 和 length 一律使用頁面對齊。旗標 flags 中任何位元的值 尚未定義任何旗標,目前未定義任何旗標。使用者的觸發與意義 封包取決於 command,這項指令可採用下列其中一個值:
ZX_PAGER_VMO_READ
:在應用程式存取呼叫頁面 VMO 中的非常駐頁面時傳送。
呼叫器服務應在已註冊的 VMO 中,填入範圍 [偏移、偏移 + 長度],
zx_pager_supply_pages()
。提供網頁意味著明確地確認要求。
ZX_PAGER_VMO_DIRTY
:在應用程式於頁面器 VMO 中的常駐頁面寫入常駐頁面時傳送
透過 ZX_VMO_TRAP_DIRTY
旗標建立。Pager 服務應確認該範圍
[偏移、偏移 + 長度)] 可加以移除,以允許寫入,
zx_pager_op_range()
ZX_PAGER_OP_DIRTY
。
ZX_PAGER_VMO_COMPLETE
:在系統不再針對相應的
VMO (因 zx_pager_detach_vmo()
或沒有參照 VMO) 而保留。
如果 pager 關閉,系統就不會將任何封包傳送至 port (包括
ZX_PAGER_VMO_COMPLETE
訊息)。此外,日後存取時
已呼叫 zx_pager_detach_vmo()
。
權限
pager 必須是 ZX_OBJ_TYPE_PAGER
類型,且具有 ZX_RIGHT_ATTACH_VMO
。
port 必須是 ZX_OBJ_TYPE_PORT
類型且包含 ZX_RIGHT_WRITE
。
傳回值
zx_pager_create_vmo()
會在成功時傳回 ZX_OK,否則會在失敗時傳回下列其中一個錯誤代碼。
錯誤
ZX_ERR_INVALID_ARGS
out 是無效的指標或 NULL,options 包含不支援的指標
多個標記組合
ZX_ERR_BAD_HANDLE
pager 或 port 不是有效的帳號。
ZX_ERR_ACCESS_DENIED
pager 沒有 ZX_RIGHT_ATTACH_VMO
或 port 沒有
ZX_RIGHT_WRITE
。
ZX_ERR_WRONG_TYPE
pager 不是 Pager 處理常式,或 port 並非通訊埠控制代碼。
ZX_ERR_OUT_OF_RANGE
要求的大小超過 VMO 大小上限。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。