摘要
建立 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 大小以外的任何範圍讀取資料 通常包含零,並寫入新的零填入頁面。 下列裝置不支援這個標記:- 具有固定區域的 VMO。
- 使用
zx_vmo_create_physical()
或 遞減建立的 VMOzx_vmo_create_contiguous()
。 - 使用者呼叫器支援的 VMO。 如要瞭解與子項的 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 的所有作業 就像是上層項目一樣參照一律會涵蓋父項的整個範圍,且 offset 和 size 必須為 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_REFERENCE
,ZX_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_SNAPSHOT
、ZX_VMO_CHILD_SNAPSHOT_AT_LEAST_ON_WRITE
或
如未設定 ZX_VMO_CHILD_SNAPSHOT_MODIFIED
和 ZX_VMO_CHILD_NO_WRITE
,ZX_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
。
另請參閱
zx_vmar_map()
zx_vmo_create()
zx_vmo_get_size()
zx_vmo_op_range()
zx_vmo_read()
zx_vmo_set_size()
zx_vmo_write()