ZX_vmar_op_range

摘要

對對應至此 VMAR 的 VMOs 執行作業。

宣告

#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);

說明

zx_vmar_op_range() 會在 addressaddress + size 的範圍內,對對應的 VMOs 執行作業 op

addresssize 必須完全位於這個 VMAR 中,且必須符合 zx_vmo_op_range() 為對應 VMO op (如果有) 指定的對齊要求。

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

支援的作業如下:

ZX_VMAR_OP_COMMIT - 需要句柄,以及用於建立任何受影響對應項目的 VMO 句柄,必須具備 ZX_RIGHT_WRITE 權限,且位址範圍不得包含任何子 VMAR。否則,運算的語意會如 zx_vmo_op_range() ZX_VMO_OP_COMMIT 所述。

ZX_VMO_OP_DECOMMIT:已淘汰。改用 ZX_VMAR_OP_DECOMMIT

ZX_VMAR_OP_PREFETCH:需要句柄,以及用於建立任何受影響對應項目的 VMO 句柄,都必須具備 ZX_RIGHT_READ。否則,運算的語意會如 zx_vmo_op_range() ZX_VMO_OP_PREFETCH 所述。

ZX_VMAR_OP_DECOMMIT:需要句柄,以及用於建立任何受影響對應項目的 VMO 句柄,且位址範圍不得包含任何子 VMAR。ZX_RIGHT_WRITE否則,運算的語意會如 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,則 handle 必須具有 ZX_RIGHT_WRITE

如果 opZX_VMAR_OP_COMMIT,則 handle 必須具有 ZX_RIGHT_WRITE

如果 opZX_VMAR_OP_PREFETCH,則 handle 必須具有 ZX_RIGHT_READ

傳回值

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

錯誤

ZX_ERR_ACCESS_DENIED handle 沒有要求變更的適當權限,或是用於建立受影響對應項目的原始 VMO handle 沒有要求變更的權限,或是 VMAR 本身不允許要求的變更。

ZX_ERR_BAD_HANDLE handle 不是有效的 handle。

ZX_ERR_BAD_STATE handle 不是即時 VMAR,或是 addresssize 指定的範圍跨越未對應的區域。

ZX_ERR_INVALID_ARGS 傳回的原因可能如下:

  • buffer 非空值。
  • buffer_size 不為零。
  • size 為零。
  • address 未對齊頁面。
  • op 不是有效的作業。
  • opZX_VMAR_OP_COMMITZX_VMAR_OP_DECOMMIT 之一,且要求的範圍包含子區域。
  • 要求的範圍與子區域重疊,且句柄沒有 ZX_RIGHT_OP_CHILDREN

ZX_ERR_NOT_SUPPORTED op 不是 ZX_VMO_OP_DECOMMIT,或是一個或多個對應的 VMOs 不支援要求的 op

ZX_ERR_OUT_OF_RANGE addresssize 指定的範圍並未完全位於 handle 指定的 VM 位址範圍內,或是在這個範圍內對應的任何 VMOs 都會縮小,因此在指定範圍內的存取作業應會產生錯誤。

ZX_ERR_WRONG_TYPE 帳號代碼不是 VMAR 帳號代碼。

另請參閱