摘要
创建受限状态 VMO 并将其绑定到当前线程。
声明
#include <zircon/syscalls-next.h>
zx_status_t zx_restricted_bind_state(uint32_t options,
zx_handle_t* out_vmo,
zx_exception_report_t* out_exception);
说明
创建一个 VMO 来保存 zx_restricted_state_t。将 VMO 绑定到当前线程,以便后续对 zx_restricted_enter() 的调用在进入/离开受限模式时使用它来恢复/保存受限模式状态。
虽然返回的 VMO out_vmo 与通过 zx_vmo_create() 创建的 VMO 类似,但某些操作不受支持,可能会因错误而失败。例如,不支持调整大小和创建子 VMO。支持通过 zx_vmo_read()/zx_vmo_write() 进行映射、取消映射和读/写。
一次只能将一个受限状态 VMO 绑定到线程。尝试绑定另一个 VMO 将替换已绑定的 VMO。
仅当最后一个用户句柄关闭、最后一个用户映射移除且发生以下情况之一时,绑定 VMO 才会销毁:
它通过
zx_restricted_bind_state()替换。通过
zx_restricted_unbind_state()显式移除。线程会被销毁。
与任何其他 VMO 一样,一旦 VMO 被映射,它就会被其映射保留,因此调用方可以关闭句柄并通过映射直接访问内存。
进入受限模式后,将加载偏移量为 0 的 VMO zx_restricted_state_t,并相应地恢复执行。离开受限模式后,线程的受限状态将保存在 VMO 的偏移量 0 处。
out_exception 是指向 zx_exception_report_t 的可选指针。当 out_exception 为 null 时,异常返回将导致 ZX_RESTRICTED_REASON_EXCEPTION,并且模式状态 VMO 将包含 zx_restricted_exception_t。当 out_exception 不为 null 时,返回代码相同,但模式状态将包含 zx_restricted_state_t,并且 zx_exception_report_t 将复制到 out_exception。如果复制失败,原因代码将为 ZX_RESTRICTED_REASON_EXCEPTION_LOST,并且异常报告将丢失。
选项必须为零。
权限
调用者的作业政策必须允许 ZX_POL_NEW_VMO。
错误
ZX_ERR_INVALID_ARGS out_vmo 是无效指针或 NULL,或者 options 是除 0 以外的任何值。
ZX_ERR_NO_MEMORY 因内存不足而导致的失败。
用户空间无法很好地处理此(不太可能发生的)错误。在未来的 build 中,此错误将不再发生。