摘要
將資料移入 VMO。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_vmo_transfer_data(zx_vmo_t dst_vmo,
uint32_t options,
uint64_t offset,
uint64_t length,
zx_vmo_t src_vmo,
uint64_t src_offset);
說明
將 [*src_offset*, *src_offset* + *length*)
中的網頁從 dst_vmo 的 src_vmo 移至 [*offset*, *offset* + *length*)
。它的運作方式相當於 src_vmo 到 dst_vmo 的 memmove
,後面接著 src_vmo 中相關頁面的解除修訂版本。不過,用來達成這個目標的機制並不相同,備份頁面實際上是在 VMO 之間移動,而不是複製資料。這樣做就能大幅提升效能。儘管採用的機制不同,此系統呼叫與 memmove
顯示的語意相同,因為系統支援提供重疊的來源和目的地區域。
options 欄位目前必須設為 0。
權限
dst_vmo 必須是 ZX_OBJ_TYPE_VMO
類型。這個帳號代碼必須包含 ZX_RIGHT_WRITE
。
src_vmo 必須是 ZX_OBJ_TYPE_VMO
類型。這個帳號代碼必須包含 ZX_RIGHT_READ
和 ZX_RIGHT_WRITE
。
傳回值
zx_vmo_transfer_data()
會在成功時傳回 ZX_OK
。如果失敗,系統會傳回負值錯誤值 (如下所述)。如果傳輸失敗,則 src_vmo 中的任一頁面數可能已移至 dst_vmo。我們無法保證資料遷移的確切數量。不過,如果符合以下條件,我們無法保證呼叫成功:
- 不符合以下錯誤的條件。
- 在這項作業執行期間,任何其他執行緒都不會修改 src_vmo 和 dst_vmo。
在這種情況下,「修改」是指直接在 VMO 或 VMO 參照上寫入/調整大小/固定 (例如配量、參照子項等)。修改任何種類的快照的父項、子項或同層不應導致任何錯誤,儘管取決於您的寫入快照而定。如果您處理 SNAPSHOT_AT_LEAST_ON_WRITE
VMO 的父項,因為實際傳輸作業未具有承諾的單元性,可能會發生寫入預備作業。請注意,如果是從 SNAPSHOT
子項轉移頁面,我們可能需要執行副本,亦即分配新頁面時,如果特定網頁尚未寫入副本。
錯誤
ZX_ERR_BAD_HANDLE
dst_vmo 或 src_vmo 不是有效的 VMO 控制代碼。
ZX_ERR_INVALID_ARGS
offset、length 或 src_offset 未對齊頁面,或 options 不為零。
ZX_ERR_ACCESS_DENIED
src_vmo 沒有 ZX_RIGHT_WRITE
或 ZX_RIGHT_READ
,或者 dst_vmo 沒有 ZX_RIGHT_WRITE
。
系統會固定在 src_vmo
或 dst_vmo
中指定的 ZX_ERR_BAD_STATE
網頁。
ZX_ERR_NOT_SUPPORTED
src_vmo 或 dst_vmo 可以是實體、連續或分頁器支援。
ZX_ERR_OUT_OF_RANGE
dst_vmo 或 src_vmo 中的指定範圍無效。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。