总结
设置虚拟内存页面的保护。
声明
#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()
用于更改 len 个字节的范围(从 len 开始)内存映射的访问保护。lenoptions 参数应为以下值中的按位值或以下值之一:
ZX_VM_PERM_READ
:将地图设为可读。如果 handle 没有ZX_VM_CAN_MAP_READ
权限或 handle 没有ZX_RIGHT_READ
权限,则会出错。如果用于创建映射的 VMO 句柄没有ZX_RIGHT_READ
权限,也会引发错误。ZX_VM_PERM_WRITE
:将映射设为可写。如果 handle 没有ZX_VM_CAN_MAP_WRITE
权限或 handle 没有ZX_RIGHT_WRITE
权限,则会出错。如果用于创建映射的 VMO 句柄没有ZX_RIGHT_WRITE
权限,也会引发错误。ZX_VM_PERM_EXECUTE
映射为可执行文件。如果 handle 没有ZX_VM_CAN_MAP_EXECUTE
权限或 handle 没有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 或者请求范围的某个子范围被子区域占用,但 handle 没有 ZX_RIGHT_OP_CHILDREN
。
ZX_ERR_NOT_FOUND
所请求范围的某些子范围未映射。
ZX_ERR_ACCESS_DENIED
句柄对所请求的更改没有适当的权限,用于创建映射的原始 VMO 句柄没有所请求的更改的权限,或者 VMAR 本身不允许所请求的更改,或者子区域中的某个映射应提高其映射权限。
ZX_ERR_NO_MEMORY
由于内存不足而失败。
用户空间没有什么方法来处理此(不太可能)错误。在以后的 build 中,此错误不会再发生。
备注
对于 ZX_ERR_NO_MEMORY
以外的故障,相应范围内的所有访问权限都将保持不变。