摘要
對對應至這個 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 為止。
address 和 size 必須完全位於這個 VMAR 內,且必須符合 zx_vmo_op_range()
為對應 VMO op (如有) 指定的對齊規定。
buffer 和 buffer_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
。
權限
如果 op 為 ZX_VMAR_OP_DECOMMIT
,則 handle 必須有 ZX_RIGHT_WRITE
。
如果 op 為 ZX_VMAR_OP_COMMIT
,則 handle 必須有 ZX_RIGHT_WRITE
。
如果 op 為 ZX_VMAR_OP_ZERO
,則 handle 必須有 ZX_RIGHT_WRITE
。
如果 op 為 ZX_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,或 address 和 size 指定的範圍跨越未對應的區域。
ZX_ERR_INVALID_ARGS
系統傳回這個錯誤的原因如下:
- 緩衝區不得為空值。
- buffer_size 不為零。
- 大小為零。
- address 未與網頁對齊。
- 「op」不是有效作業。
- op 是
ZX_VMAR_OP_COMMIT
或ZX_VMAR_OP_DECOMMIT
,且要求的範圍有子區域。 - 要求的範圍與子區域重疊,且 handle 沒有
ZX_RIGHT_OP_CHILDREN
。
ZX_ERR_NOT_SUPPORTED
op 不是 ZX_VMO_OP_DECOMMIT
,或一或多個對應的 VMO 不支援要求的 op。
ZX_ERR_OUT_OF_RANGE
傳回的原因如下:
- address 和 size 指定的範圍並非完全位於 handle 指定的 VM 位址範圍內。
- 這個範圍內對應的任何 VMO 都會縮小,因此在指定範圍內存取時應會產生錯誤。
- 這個範圍內的任何對應項目都是使用
ZX_VM_FAULT_BEYOND_STREAM_SIZE
建立,且具有會產生串流大小以外故障的區域。
ZX_ERR_WRONG_TYPE
handle 不是 VMAR 帳號代碼。