z_vmar_protect

总结

设置虚拟内存页面的保护。

声明

#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 必须页面对齐。

权限

如果 optionsZX_VM_PERM_READhandle 必须为 ZX_OBJ_TYPE_VMAR 类型且具有 ZX_RIGHT_READ

如果 optionsZX_VM_PERM_WRITEhandle 必须为 ZX_OBJ_TYPE_VMAR 类型且具有 ZX_RIGHT_WRITE

如果 optionsZX_VM_PERM_EXECUTEhandle 必须为 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 以外的故障,相应范围内的所有访问权限都将保持不变。

另请参阅