ZX_vmo_create_child

摘要

建立 VM 物件的子項。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_vmo_create_child(zx_handle_t handle,
                                uint32_t options,
                                uint64_t offset,
                                uint64_t size,
                                zx_handle_t* out);

說明

zx_vmo_create_child() 會建立新的虛擬記憶體 object (VMO) 現有 vmo 的子項。行為 語意取決於子項的類型

成功會傳回一個控點,以所要求的 大小

options 必須包含下列其中一個標記,以便指定 子類型:

  • ZX_VMO_CHILD_SNAPSHOT - 建立子項,就像執行快速副本一樣。如果 父項和子項都會執行延遲副本延遲複製功能可讓子項 讓父項來區分從父項 VMO 大小以外的任何範圍讀取資料 通常包含零,並寫入新的零填入頁面。 下列裝置不支援這個標記:

在 ZX_VMO_CHILD_NO_WRITE 時 ZX_VMO_CHILD_SNAPSHOT 會建立不可變動的 VMO 選項,並停用 ZX_VMO_CHILD_RESIZABLE 選項。

  • ZX_VMO_CHILD_SNAPSHOT_AT_LEAST_ON_WRITE - 建立子項,並在當中至少套用副本的行為 寫入語意任何對子項執行寫入作業都會取得上層項目的網頁副本。 之後其內容可能會與父項不同。除非頁面寫入並複製,否則系統會讀取 系統允許 (但不保證) 在父項執行寫入作業時傳回變更的值。 這個旗標不能用於以 zx_vmo_create_physical() 建立的 VMO。 zx_vmo_create_contiguous() 或這類 VMO 的子系。 如要瞭解與子項的 VMO 系統呼叫互動情形,請參閱「附註」。

ZX_VMO_CHILD_SNAPSHOT_MODIFIED - 建立子項,就像模仿文案一樣 在上層網頁,未由網頁工具支援的任何頁面 (也就是經過網頁伺服器修改的網頁) 上執行 呼叫呼叫器支援的 VMO 的子項。頁面支援的網頁至少會具備寫入時複製的語意。這個 旗標不能用於以 zx_vmo_create_physical()zx_vmo_create_contiguous()、 含有固定頁面或這類 VMO 的子系的 VMO。所有資源也不支援這個旗標 使用 SNAPSHOT_AT_LEAST_ON_WRITE 建立的 VMO 包含非配量子項或並非以下子系的子項: 或受到呼叫的 VMO 影響 如要瞭解與子項的 VMO 系統呼叫互動情形,請參閱「附註」。

  • ZX_VMO_CHILD_SLICE - 建立具有直接讀取/寫入權限的配量 父項的任一部分對配量 VMO 上的所有作業,其行為就像是在父項上完成一樣。 切片只允許存取 且允許使用 ZX_VMO_ZERO_CHILDREN 信號。這個旗標可以使用 使用 zx_vmo_create_physical()zx_vmo_create_contiguous() 建立的 VMO,以及自己的 子系。這個旗標無法與使用 ZX_VMO_RESIZABLE 選項建立的 VMO 搭配使用。

  • ZX_VMO_CHILD_REFERENCE - 建立對 VMO 的參照。參考 VMO 的所有作業 就像是上層項目一樣參照一律會涵蓋父項的整個範圍,且 offsetsize 必須為 0。如果使用者想保留 使用 ZX_VMO_ZERO_CHILDREN 信號追蹤 VMO 的待處理參照。詳情請參閱 如要進一步瞭解這個信號,請參閱附註。 這個旗標不能用於以 zx_vmo_create_physical() 建立的 VMO。 zx_vmo_create_contiguous() 或這類 VMO 的子系。

此外,options 可包含零個或多個下列旗標,用於 進一步指定子項的行為:

  • ZX_VMO_CHILD_RESIZABLE - 建立可調整大小的子項 VMO。不相容於 ZX_VMO_CHILD_SLICE

  • ZX_VMO_CHILD_NO_WRITE - 建立無法寫入的子項。不相容於 ZX_VMO_CHILD_RESIZABLE

offset 必須是頁面對齊。

offset + size 不得超過 64 位元無正負號值的範圍。

偏移和大小的起點或範圍可能會超過原始 VMO 的大小。

VMO 的大小會四捨五入至下一個頁面大小邊界。

VMO 的內容大小將初始化為指定 (未四捨五入) 的大小。 將 zx_object_get_property()ZX_PROP_VMO_CONTENT_SIZE 搭配使用,即可閱讀 VMO 的內容大小使用 zx_object_set_property() 搭配 ZX_PROP_VMO_CONTENT_SIZE 用來設定 VMO 的內容大小,但沒有 但確實調整 VMO 大小

根據預設,子帳號代碼的權利會與 只有少數例外請參閱 zx_vmo_create() 然後討論這些規則的細節

如果選項包含 ZX_VMO_CHILD_RESIZABLE,系統就會新增 ZX_RIGHT_RESIZE

如果是 ZX_VMO_CHILD_REFERENCEZX_VMO_CHILD_RESIZABLE 選項可控制是否父項 VMO 可使用從「out」傳回的參照控點調整大小。參考檔案會在以下位置調整大小: 也可以確保父項 VMO 可以調整大小 ZX_VMO_CHILD_RESIZABLE。不過,只有父項 VMO 才支援 ZX_VMO_CHILD_RESIZABLE 可調整大小,也就是說,您無法為無法調整大小的 VMO 建立可調整大小的參照。

如果設定 ZX_VMO_NO_WRITE,那麼在所有情況下都會移除 ZX_RIGHT_WRITE

如果選項ZX_VMO_CHILD_SNAPSHOTZX_VMO_CHILD_SNAPSHOT_AT_LEAST_ON_WRITE 或 如未設定 ZX_VMO_CHILD_SNAPSHOT_MODIFIEDZX_VMO_CHILD_NO_WRITEZX_RIGHT_WRITE 會 「 」,且將移除「ZX_RIGHT_EXECUTE」。

附註

建立子項 VMO 會導致現有 (來源) VMO ZX_VMO_ZERO_CHILDREN 信號 變成閒置狀態。只有在刪除最後一個子項且沒有對應時 傳送到地址空間的子項,ZX_VMO_ZERO_CHILDREN 會變成 再次啟用。

非配量子項 vmos 會以下列方式與 VMO Sys Calls 互動:

  • 子項的 zx_vmo_op_range() COMMIT 模式,會將頁面提交至 且內容與其父項的對應頁面相同。如果這些網頁是由 Pager,這項作業也會在上層提交這些網頁。否則,如果這些網頁 未填入任何上層頁面時,廣告空缺頁面會直接提交 而不影響父項
  • 不支援 zx_vmo_op_range() 的 DECOMMIT 模式。

權限

handle 必須是 ZX_OBJ_TYPE_VMO 類型,且具有 ZX_RIGHT_DUPLICATE 且包含 ZX_RIGHT_READ

傳回值

zx_vmo_create_child() 會在成功時傳回 ZX_OK。活動 失敗時,系統會傳回負錯誤值。

錯誤

ZX_ERR_BAD_TYPE 輸入帳號並非 VMO。

ZX_ERR_ACCESS_DENIED輸入帳號代碼權限不足。

ZX_ERR_INVALID_ARGS「out」是無效的指標或 NULL 或偏移值未對齊頁面,或指定的選項組合不相容。

ZX_ERR_OUT_OF_RANGE 偏移 + size 太大。

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。 使用者空間無法妥善處理這種 (異常) 錯誤。 在日後的版本中不會再發生這個錯誤。

ZX_ERR_BAD_STATE vmo 有 COW 子項,因此無法建立 COW 子項 固定頁面。

ZX_ERR_NOT_SUPPORTED 輸入控點是可捨棄的 VMO,或輸入控點 可調整大小的 VMO 和選項包含 ZX_VMO_CHILD_SLICE

另請參閱