ZX_vmo_op_range

摘要

在 VMO 範圍內執行作業。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_vmo_op_range(zx_handle_t handle,
                            uint32_t op,
                            uint64_t offset,
                            uint64_t size,
                            void* buffer,
                            size_t buffer_size);

說明

zx_vmo_op_range() 會針對虛擬記憶體保存的頁面執行快取和記憶體作業 物件 (VMO)。

offset 位元組偏移,用於指定 VMO 保留記憶體中 op 的起始位置。

size 的長度,以位元組為單位,用於執行運算。

運算 要執行的作業:

bufferbuffer_size 為必要或未使用,視下方所述的運算而定。

ZX_VMO_OP_COMMIT - 自 VMO 的位元組偏移起提交相當於網頁大小的 size 個位元組。 詳情請參閱 vm 物件說明文件。 必須有 ZX_RIGHT_WRITE 右側的值。

ZX_VMO_OP_DECOMMIT:發布先前承諾為 VMO 的一系列頁面 設為 offset+size,如此即可將範圍的位元組重設為 0。必須有 ZX_RIGHT_WRITE 右側的值。 這個選項僅適用於透過 zx_vmo_create() 建立的 VM,而沒有配量 以及這類 VM 的切片子項您提供的範圍必須對齊頁面。

ZX_VMO_OP_PREFETCH - 從為 VMO。實際網頁不一定要經過測試,但日後讀取範圍時應有類似 效能特性,就好像把範圍替換為讀取範圍一樣。 必須有 ZX_RIGHT_READ 右側的值。

ZX_VMO_OP_ZERO:將 VMO 中的位元組範圍從 offset 重設為 offset+size 0.這在語意上等同於使用 zx_vmo_write(),但可執行更多工作 去除多餘的共用頁面來節省記憶體必須有 ZX_RIGHT_WRITE 右側的值。

ZX_VMO_OP_LOCK - 鎖定使用 ZX_VMO_DISCARDABLE 建立的 VMO 中的多個頁面,防止 這些物件就會被核心捨棄能夠保證成功鎖定 VMO 並歸還 如果引數有效,則為 ZX_OKbuffer 應指向 zx_vmo_lock_state_t 結構,而 buffer_size 應配合結構體。傳回已鎖定和先前鎖定的資訊 捨棄的範圍,讓用戶端可以視需要重新初始化已捨棄的內容。

整個 VMO 應同時鎖定,因此 offset 應為 0,且 size 應為目前的 VMO 的大小 (zx_vmo_get_size() 傳回的頁面對齊大小)。需要 ZX_RIGHT_READZX_RIGHT_WRITE右側。請注意,鎖定本身不會提交 VMO;只會將 VMO 的狀態標示為「undiscardable」。

buffer 應該是 zx_info_lock_state_t 類型的指標。

typedef struct zx_vmo_lock_state {
  // |offset| and |size| track the locked range, and will be set to the |offset|
  // and |size| arguments passed in if the ZX_VMO_OP_LOCK is successful.
  uint64_t offset;
  uint64_t size;
  // |discarded_offset| and |discarded_size| track the discarded range prior to
  // the lock operation. This is the maximal range within the locked range that
  // contains discarded pages; not all pages within this range might have been
  // discarded. Both |discarded_offset| and |discarded_size| will be set to 0 if
  // the range was not discarded.
  uint64_t discarded_offset;
  uint64_t discarded_size;
} zx_vmo_lock_state_t;

ZX_VMO_OP_TRY_LOCK - 在 VMO 中使用 ZX_VMO_DISCARDABLE 建立多個頁面, 以防止核心捨棄這些物件只有在範圍尚未設定的情況下才會成功 就會遭到核心捨棄,否則將會失敗並顯示 ZX_ERR_UNAVAILABLE。這項作業 可做為 ZX_VMO_OP_LOCK 的輕量替代方案,用途在不鎖定 VMO 的情況下嘗試鎖定 VMO 設定 buffer 引數。客戶也因此能選擇不要在追蹤後採取任何行動 無法鎖定 VMO用戶端如要再次鎖定 VMO,必須使用 ZX_VMO_OP_LOCK

整個 VMO 應同時鎖定,因此 offset 應為 0,且 size 應為目前的 VMO 的大小 (zx_vmo_get_size() 傳回的頁面對齊大小)。需要 ZX_RIGHT_READZX_RIGHT_WRITE右側。請注意,鎖定本身不會提交 VMO;只會將 VMO 的狀態標示為「undiscardable」。

ZX_VMO_OP_UNLOCK:解鎖 VMO 中使用 ZX_VMO_DISCARDABLE 建立的多個頁面, 表示核心可以在記憶體壓力下自行捨棄。已解鎖的網頁,並顯示 未捨棄的仍將視為已修訂網頁。

整個 VMO 應同時解鎖,因此 offset 應為 0,且 size 應為目前的 VMO 的大小 (zx_vmo_get_size() 傳回的頁面對齊大小)。需要 ZX_RIGHT_READZX_RIGHT_WRITE右側。

ZX_VMO_OP_CACHE_SYNC - 將操作說明快取與資料快取保持同步,因此先前的寫入內容 指引擷取內容。 必須有 ZX_RIGHT_READ 右側的值。

ZX_VMO_OP_CACHE_INVALIDATE - 執行快取撤銷作業,讓日後讀取作業 對主記憶體進行外部變更請注意,如要執行這項作業, kernel.enable-debugging-syscalls 為 true。如未啟用 syscall 偵錯,此作業 將於 ZX_ERR_NOT_SUPPORTED後失敗 必須有 ZX_RIGHT_WRITE 右側的值。

ZX_VMO_OP_CACHE_CLEAN:清除 (寫入) 資料快取,因此之前寫入的資料會顯示在主要資源中 記憶體用量 必須有 ZX_RIGHT_READ 右側的值。

ZX_VMO_OP_CACHE_CLEAN_INVALIDATE - 同時執行快取清理和撤銷作業。 必須有 ZX_RIGHT_READ 右側的值。

ZX_VMO_OP_DONT_NEED:提示指定範圍內的網頁不再需要, 才會視為記憶體回收。適合與以下列通訊協定建立的 VMO 搭配使用 zx_pager_create_vmo();生成式 AI 的 和其他 VMO 一樣

這只適用於指定範圍內已修訂的網頁,也就是說,不會有新網頁 。如有需要,偏移值會無條件捨去至上一頁 界線和 offset + size 的值會四捨五入至下一個頁面邊界。

ZX_VMO_OP_ALWAYS_NEED:提示指定範圍內的網頁有重要性, 進而避免記憶體回收系統執行以下作業時,核心可能會決定覆寫這項提示: 暴露在極端記憶體壓力之中此外,這項提示也不會導致其他頁面無法以其他方式釋放網頁 而非記憶體重組 (例如解構作業、VMO 大小調整或 VMO 刪除)。適合搭配 使用 zx_pager_create_vmo() 建立的 VMO;經常 就必須為其他 VMO 輸入成功

在適用情況下,可能會修訂指定範圍內的網頁,例如如果 VMO 直接支援 系統將提交其頁面;如果是本機副本,則會提交父項中可見的頁面 並維護本機副本的採用來源如有需要,偏移值會無條件捨去至上一頁 界線和 offset + size 的值會四捨五入至下一個頁面邊界。

請注意,ZX_VMO_OP_DONT_NEED 不會復原先前的 ZX_VMO_OP_ALWAYS_NEEDZX_VMO_OP_ALWAYS_NEED 提示會固定顯示,直到核心決定覆寫 也會提示

權限

如果 opZX_VMO_OP_COMMIT,則 handle 必須是 ZX_OBJ_TYPE_VMO 類型且包含 ZX_RIGHT_WRITE

如果 opZX_VMO_OP_DECOMMIT,則 handle 必須是 ZX_OBJ_TYPE_VMO 類型且包含 ZX_RIGHT_WRITE

如果 opZX_VMO_OP_PREFETCH,則 handle 必須是 ZX_OBJ_TYPE_VMO 類型且包含 ZX_RIGHT_READ

如果 opZX_VMO_OP_CACHE_SYNC,則 handle 必須是 ZX_OBJ_TYPE_VMO 類型且包含 ZX_RIGHT_READ

如果 opZX_VMO_OP_CACHE_INVALIDATE,則 handle 必須是 ZX_OBJ_TYPE_VMO 類型且包含 ZX_RIGHT_WRITE

如果 opZX_VMO_OP_CACHE_CLEAN,則 handle 必須是 ZX_OBJ_TYPE_VMO 類型且包含 ZX_RIGHT_READ

如果 opZX_VMO_OP_CACHE_CLEAN_INVALIDATE,則 handle 必須是 ZX_OBJ_TYPE_VMO 類型且包含 ZX_RIGHT_READ

傳回值

zx_vmo_op_range() 會在成功時傳回 ZX_OK。故障時,會發生負錯誤 。

錯誤

ZX_ERR_BAD_HANDLE 帳號代碼不是有效的帳號代碼。

ZX_ERR_OUT_OF_RANGEoffsetsize 指定的無效記憶體範圍。

ZX_ERR_NO_MEMORY 將配置用於 ZX_VMO_OP_COMMITZX_VMO_OP_PREFETCHZX_VMO_OP_ZERO失敗。

ZX_ERR_WRONG_TYPE 帳號代碼不是 VMO 控制代碼。

ZX_ERR_ACCESS_DENIED 帳號代碼沒有足夠的權限可執行該作業。

ZX_ERR_INVALID_ARGS buffer 為無效指標 (如果作業需要),op 不是 有效作業,size 為零且 op 為快取作業,或 opZX_VMO_OP_DECOMMIT 且範圍沒有對齊頁面。

ZX_ERR_NOT_SUPPORTED: - 運算ZX_VMO_OP_LOCKZX_VMO_OP_TRY_LOCKZX_VMO_OP_UNLOCK,且 VMO 未 使用 ZX_VMO_DISCARDABLE 建立。 - opZX_VMO_OP_DECOMMIT,且基礎 VMO 不允許進行分解。 - opZX_VMO_OP_CACHE_INVALIDATEkernel.enable-debugging-syscalls 為 false。 - opZX_VMO_OP_CACHE_SYNCZX_VMO_OP_CACHE_INVALIDATEZX_VMO_OP_CACHE_CLEANZX_VMO_OP_CACHE_CLEAN_INVALIDATE 和 VMO 的建立或遞減 zx_vmo_create_physical()

ZX_ERR_UNAVAILABLE 運算ZX_VMO_OP_TRY_LOCK,VMO 可以捨棄,VMO 也 就會遭到核心捨棄

ZX_ERR_BAD_STATE 運算ZX_VMO_OP_COMMITZX_VMO_OP_PREFETCH,VMO 是由 Pager 和 Pager 或 VMO 的狀態錯誤,因此無法填入要求的網頁。 opZX_VMO_OP_UNLOCK,VMO 可以捨棄,VMO 先前並未鎖定。

ZX_ERR_IO 運算ZX_VMO_OP_COMMITZX_VMO_OP_PREFETCH,VMO 是由呼叫器提供支援, 網頁伺服器提交要求的網頁時發生 I/O 錯誤。

ZX_ERR_IO_DATA_INTEGRITY 運算ZX_VMO_OP_COMMITZX_VMO_OP_PREFETCH,VMO 會 由網頁工具提供支援,以及針對所提交網頁的呼叫器所讀取的內容 毀損。

另請參閱