摘要
设置虚拟内存页面的保护功能。
声明
#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
:映射为可读状态。如果 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
handle 不是有效的句柄。
ZX_ERR_WRONG_TYPE
handle 不是 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
handle 不具备适当的权限,
请求的更改,用于创建映射的原始 VMO 句柄
或 VMAR 本身不允许执行
或者某个子区域中有
其映射权限增加了
ZX_ERR_NO_MEMORY
因内存不足而失败。
用户空间没有好办法处理这种(不太可能)错误。
在将来的版本中,此错误不会再发生。
备注
对于 ZX_ERR_NO_MEMORY
以外的故障,范围内的所有访问权限
会保持不变