摘要
對對應至此 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()
會在 address 到 address + size 的範圍內,對對應的 VMOs 執行作業 op。
address 和 size 必須完全位於這個 VMAR 中,且必須符合 zx_vmo_op_range()
為對應 VMO op (如果有) 指定的對齊要求。
buffer 和 buffer_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
。
權限
如果 op 為 ZX_VMAR_OP_DECOMMIT
,則 handle 必須具有 ZX_RIGHT_WRITE
。
如果 op 為 ZX_VMAR_OP_COMMIT
,則 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 handle 沒有要求變更的權限,或是 VMAR 本身不允許要求的變更。
ZX_ERR_BAD_HANDLE
handle 不是有效的 handle。
ZX_ERR_BAD_STATE
handle 不是即時 VMAR,或是 address 和 size 指定的範圍跨越未對應的區域。
ZX_ERR_INVALID_ARGS
傳回的原因可能如下:
- buffer 非空值。
- buffer_size 不為零。
- size 為零。
- address 未對齊頁面。
- op 不是有效的作業。
- op 為
ZX_VMAR_OP_COMMIT
或ZX_VMAR_OP_DECOMMIT
之一,且要求的範圍包含子區域。 - 要求的範圍與子區域重疊,且句柄沒有
ZX_RIGHT_OP_CHILDREN
。
ZX_ERR_NOT_SUPPORTED
op 不是 ZX_VMO_OP_DECOMMIT
,或是一個或多個對應的 VMOs 不支援要求的 op。
ZX_ERR_OUT_OF_RANGE
address 和 size 指定的範圍並未完全位於 handle 指定的 VM 位址範圍內,或是在這個範圍內對應的任何 VMOs 都會縮小,因此在指定範圍內的存取作業應會產生錯誤。
ZX_ERR_WRONG_TYPE
帳號代碼不是 VMAR 帳號代碼。