摘要
在對應至這個 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 執行運算。
address 和 size 必須完全落在這個 VMAR 中,且必須符合 zx_vmo_op_range()
針對對應的 VMO 運算 (如有) 指定的校正要求。
目前未使用 buffer 和 buffer_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
。
權限
如果 op 為 ZX_VMAR_OP_DECOMMIT
,帳號代碼必須有 ZX_RIGHT_WRITE
。
如果 op 為 ZX_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,或是由 address 和 size 指定的範圍則涵蓋未對應的區域。
ZX_ERR_INVALID_ARGS
帳戶遭退回的可能原因如下:
- buffer is non-null.
- buffer_size 非零。
- size 為零。
- address 未對齊頁面。
- op 不是有效的作業。
- op 是
ZX_VMAR_OP_COMMIT
或ZX_VMAR_OP_DECOMMIT
,且要求的範圍是子區域。 - 要求的範圍與子區域重疊,而帳號代碼沒有
ZX_RIGHT_OP_CHILDREN
。
ZX_ERR_NOT_SUPPORTED
運算並非 ZX_VMO_OP_DECOMMIT
,或是一或多個對應的 VMO 不支援要求的作業。
ZX_ERR_OUT_OF_RANGE
address 和 size 指定的範圍不在 handle 指定的 VM 位址範圍內。
ZX_ERR_WRONG_TYPE
帳號代碼並非 VMAR 控制代碼。