zx_pager_create_vmo

摘要

建立呼叫器擁有的 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_REQUESTkey 則設為 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;

offsetlength 一律使用頁面對齊。旗標 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 pagerport 不是有效的帳號。

ZX_ERR_ACCESS_DENIED pager 沒有 ZX_RIGHT_ATTACH_VMOport 沒有 ZX_RIGHT_WRITE

ZX_ERR_WRONG_TYPE pager 不是 Pager 處理常式,或 port 並非通訊埠控制代碼。

ZX_ERR_OUT_OF_RANGE 要求的大小超過 VMO 大小上限。

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。

另請參閱