ZX_vmar_op_range

摘要

在對應至這個 VMAR 的 VMO 上執行作業。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_vmar_op_range(zx_handle_t handle,
                             uint32_t op,
                             zx_vaddr_t address,
                             size_t size,
                             void* buffer,
                             size_t buffer_size);

說明

在對應於 address 到 <尺寸> 範圍的 VMO 上,zx_vmar_op_range() 會對 VMO 執行運算

addresssize 必須完全落在這個 VMAR 中,且必須符合 zx_vmo_op_range() 針對對應的 VMO 運算 (如有) 指定的校正要求。

目前未使用 bufferbuffer_size,必須留空。

支援的作業如下:

ZX_VMAR_OP_COMMIT - 需要有帳號代碼,以及用於建立任何受影響對應 VMO 的 VMO 控制代碼,具備 ZX_RIGHT_WRITE 權利,且位址範圍不得含有任何子項 VMAR。運算的語意不是由 zx_vmo_op_range() ZX_VMO_OP_COMMIT 描述。

ZX_VMO_OP_DECOMMIT - 已淘汰。改用 ZX_VMAR_OP_DECOMMIT

ZX_VMAR_OP_DECOMMIT - 需要有帳號代碼,以及用於建立任何受影響對應 VMO 的 VMO 控制代碼,具備 ZX_RIGHT_WRITE 權利,且位址範圍不得含有任何子項 VMAR。運算的語意不是由 zx_vmo_op_range() ZX_VMO_OP_DECOMMIT 描述。

ZX_VMAR_OP_MAP_RANGE:為指定範圍內的已修訂頁面,填入 CPU 頁面資料表 (或架構相等架構) 中的項目。系統不會填入範圍內未提交頁面的項目。略過範圍內任何頁面已存在的項目。

ZX_VMAR_OP_DONT_NEED - 指定範圍中不再需要頁面的提示,應將其視為記憶體回收。建議用於透過 zx_pager_create_vmo() 建立的 VMO 對應;可針對其他 VMO 類型快速對應成功。

詳情請參閱 zx_vmo_op_range() ZX_VMO_OP_DONT_NEED

ZX_VMAR_OP_ALWAYS_NEED:表示指定範圍內的頁面很重要,應避免記憶體回收。建議用於透過 zx_pager_create_vmo() 建立的 VMO 對應;可針對其他 VMO 類型快速對應成功。

詳情請參閱 zx_vmo_op_range() ZX_VMO_OP_ALWAYS_NEED

權限

如果 opZX_VMAR_OP_DECOMMIT帳號代碼必須有 ZX_RIGHT_WRITE

如果 opZX_VMAR_OP_COMMIT帳號代碼必須有 ZX_RIGHT_WRITE

傳回值

zx_vmar_op_range() 會在成功時傳回 ZX_OK。如果失敗,會傳回負值錯誤值。

錯誤

ZX_ERR_ACCESS_DENIED「帳號代碼」沒有要求變更的適當權限,或者用於建立任一對應對應項目的原始 VMO 控制代碼沒有要求變更的權限,或是 VMAR 本身不允許所要求的變更。

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

ZX_ERR_BAD_STATE 處理常式並非即時的 VMAR,或是由 addresssize 指定的範圍則涵蓋未對應的區域。

ZX_ERR_INVALID_ARGS 帳戶遭退回的可能原因如下:

  • buffer is non-null.
  • buffer_size 非零。
  • size 為零。
  • address 未對齊頁面。
  • op 不是有效的作業。
  • opZX_VMAR_OP_COMMITZX_VMAR_OP_DECOMMIT,且要求的範圍是子區域。
  • 要求的範圍與子區域重疊,而帳號代碼沒有 ZX_RIGHT_OP_CHILDREN

ZX_ERR_NOT_SUPPORTED 運算並非 ZX_VMO_OP_DECOMMIT,或是一或多個對應的 VMO 不支援要求的作業

ZX_ERR_OUT_OF_RANGE addresssize 指定的範圍不在 handle 指定的 VM 位址範圍內。

ZX_ERR_WRONG_TYPE 帳號代碼並非 VMAR 控制代碼。

另請參閱