摘要
設定虛擬記憶體頁面的保護。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_vmar_protect(zx_handle_t handle,
zx_vm_option_t options,
zx_vaddr_t addr,
size_t len);
說明
zx_vmar_protect()
會從 addr 開始,變更 len 個位元組範圍中記憶體對應的存取權保護措施。options 引數應為以下一或多個位元的位元或值:
ZX_VM_PERM_READ
地圖視為可讀的地圖。如果「處理」沒有ZX_VM_CAN_MAP_READ
權限,或「帳號代碼」沒有ZX_RIGHT_READ
權利,則視為錯誤。如果用於建立對應的 VMO 控制代碼沒有ZX_RIGHT_READ
正確,也會發生錯誤。ZX_VM_PERM_WRITE
對應為可寫入。如果「處理」沒有ZX_VM_CAN_MAP_WRITE
權限,或「帳號代碼」沒有ZX_RIGHT_WRITE
權利,則視為錯誤。如果用於建立對應的 VMO 控制代碼沒有ZX_RIGHT_WRITE
正確,也會發生錯誤。ZX_VM_PERM_EXECUTE
對應為執行檔。如果「處理」沒有ZX_VM_CAN_MAP_EXECUTE
權限,或「帳號代碼」沒有ZX_RIGHT_EXECUTE
權利,則視為錯誤。如果用於建立對應的 VMO 控制代碼沒有ZX_RIGHT_EXECUTE
正確,也會發生錯誤。- 如果系統不支援僅執行只能的對應頁面,請將
ZX_VM_PERM_READ_IF_XOM_UNSUPPORTED
對應為可讀取。如果系統可以對應僅執行,這個旗標會遭到忽略。
針對在要求範圍內的子區域對應,其存取權限必須根據要求變更而降低或保持不變。
len 必須對齊頁面。
權限
如果 options 和 ZX_VM_PERM_READ
,handle 必須為 ZX_OBJ_TYPE_VMAR
類型,且具有 ZX_RIGHT_READ
。
如果 options 和 ZX_VM_PERM_WRITE
,handle 必須為 ZX_OBJ_TYPE_VMAR
類型,且具有 ZX_RIGHT_WRITE
。
如果 options 和 ZX_VM_PERM_EXECUTE
,handle 必須為 ZX_OBJ_TYPE_VMAR
類型,且具有 ZX_RIGHT_EXECUTE
。
傳回值
zx_vmar_protect()
會在成功時傳回 ZX_OK
。
錯誤
ZX_ERR_BAD_HANDLE
帳號代碼不是有效的帳號代碼。
ZX_ERR_WRONG_TYPE
帳號代碼並非 VMAR 控制代碼。
ZX_ERR_INVALID_ARGS
prot_flags 是不支援的標記組合 (例如ZX_VM_PERM_WRITE
,但不是 ZX_VM_PERM_READ
)、addr 並非頁面對齊,len 為 0,或子區域佔用了要求範圍的某些子範圍,且帳號代碼沒有 ZX_RIGHT_OP_CHILDREN
。
ZX_ERR_NOT_FOUND
要求範圍中的某些子範圍未對應。
ZX_ERR_ACCESS_DENIED
帳號代碼沒有關於要求變更的適當權限、用於建立對應的原始 VMO 控制代碼沒有要求變更的權限;或是 VMAR 本身不允許要求的變更,或是子區域的對應會增加其對應權限。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。使用者空間無法以任何方式處理這個錯誤 (極可能) 錯誤。日後的建構作業不會再發生這個錯誤。
附註
針對 ZX_ERR_NO_MEMORY
以外的失敗,範圍中的所有存取權限將維持不變。