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

說明

zx_vmar_op_range() 會對範圍 address 對應的 VMO 執行作業 op,直到 address+size 為止。

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

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

支援的作業包括:

ZX_VMAR_OP_COMMIT - 需要 handle,且用於建立任何受影響對應項的 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 - Requires that handle, and the VMO handles used to create any affected mappings, have the ZX_RIGHT_READ. 否則,這項作業的語意與 zx_vmo_op_range() ZX_VMO_OP_PREFETCH 所述相同。

ZX_VMAR_OP_DECOMMIT - 需要 handle,且用於建立任何受影響對應項的 VMO 控制代碼必須具有 ZX_RIGHT_WRITE 權限,且位址範圍不得有任何子項 VMAR。否則,這項作業的語意與 zx_vmo_op_range() ZX_VMO_OP_DECOMMIT 所述相同。

ZX_VMAR_OP_MAP_RANGE - 為指定範圍內已提交的頁面,填入 CPU 頁面表格 (或架構同等項目) 中的項目。系統不會填入範圍內未提交網頁的項目。略過範圍內任何頁面已有的項目。

ZX_VMAR_OP_ZERO - 將零寫入指定範圍內的頁面。要求範圍內的記憶體可寫入。否則,這項作業的語意與 zx_vmo_op_range() ZX_VMO_OP_ZERO 所述相同。

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 - Hints that pages in the specified range are important and should be protected from memory reclamation. 適用於使用 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_ZERO,則 handle 必須有 ZX_RIGHT_WRITE

如果 opZX_VMAR_OP_PREFETCH,則 handle 必須有 ZX_RIGHT_READ

傳回值

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

錯誤

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

ZX_ERR_BAD_HANDLE handle 不是有效控點。

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

ZX_ERR_INVALID_ARGS 系統傳回這個錯誤的原因如下:

  • 緩衝區不得為空值。
  • buffer_size 不為零。
  • 大小為零。
  • address 未與網頁對齊。
  • op」不是有效作業。
  • opZX_VMAR_OP_COMMITZX_VMAR_OP_DECOMMIT,且要求的範圍有子區域。
  • 要求的範圍與子區域重疊,且 handle 沒有 ZX_RIGHT_OP_CHILDREN

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

ZX_ERR_OUT_OF_RANGE 傳回的原因如下:

  • addresssize 指定的範圍並非完全位於 handle 指定的 VM 位址範圍內。
  • 這個範圍內對應的任何 VMO 都會縮小,因此在指定範圍內存取時應會產生錯誤。
  • 這個範圍內的任何對應項目都是使用 ZX_VM_FAULT_BEYOND_STREAM_SIZE 建立,且具有會產生串流大小以外故障的區域。

ZX_ERR_WRONG_TYPE handle 不是 VMAR 帳號代碼。

另請參閱