zx_vmo_transfer_data

摘要

將資料移入 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_vmosrc_vmo 移至 [*offset*, *offset* + *length*)。它的運作方式相當於 src_vmodst_vmomemmove,後面接著 src_vmo 中相關頁面的解除修訂版本。不過,用來達成這個目標的機制並不相同,備份頁面實際上是在 VMO 之間移動,而不是複製資料。這樣做就能大幅提升效能。儘管採用的機制不同,此系統呼叫與 memmove 顯示的語意相同,因為系統支援提供重疊的來源和目的地區域。

options 欄位目前必須設為 0。

權限

dst_vmo 必須是 ZX_OBJ_TYPE_VMO 類型。這個帳號代碼必須包含 ZX_RIGHT_WRITE

src_vmo 必須是 ZX_OBJ_TYPE_VMO 類型。這個帳號代碼必須包含 ZX_RIGHT_READZX_RIGHT_WRITE

傳回值

zx_vmo_transfer_data() 會在成功時傳回 ZX_OK。如果失敗,系統會傳回負值錯誤值 (如下所述)。如果傳輸失敗,則 src_vmo 中的任一頁面數可能已移至 dst_vmo。我們無法保證資料遷移的確切數量。不過,如果符合以下條件,我們無法保證呼叫成功:

  1. 不符合以下錯誤的條件。
  2. 在這項作業執行期間,任何其他執行緒都不會修改 src_vmodst_vmo

在這種情況下,「修改」是指直接在 VMO 或 VMO 參照上寫入/調整大小/固定 (例如配量、參照子項等)。修改任何種類的快照的父項、子項或同層不應導致任何錯誤,儘管取決於您的寫入快照而定。如果您處理 SNAPSHOT_AT_LEAST_ON_WRITE VMO 的父項,因為實際傳輸作業未具有承諾的單元性,可能會發生寫入預備作業。請注意,如果是從 SNAPSHOT 子項轉移頁面,我們可能需要執行副本,亦即分配新頁面時,如果特定網頁尚未寫入副本。

錯誤

ZX_ERR_BAD_HANDLE dst_vmosrc_vmo 不是有效的 VMO 控制代碼。

ZX_ERR_INVALID_ARGS offsetlengthsrc_offset 未對齊頁面,或 options 不為零。

ZX_ERR_ACCESS_DENIED src_vmo 沒有 ZX_RIGHT_WRITEZX_RIGHT_READ,或者 dst_vmo 沒有 ZX_RIGHT_WRITE

系統會固定在 src_vmodst_vmo 中指定的 ZX_ERR_BAD_STATE 網頁。

ZX_ERR_NOT_SUPPORTED src_vmodst_vmo 可以是實體、連續或分頁器支援。

ZX_ERR_OUT_OF_RANGE dst_vmosrc_vmo 中的指定範圍無效。

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。

另請參閱