zx_restricted_enter

总结

进入受限模式

声明

#include <zircon/syscalls-next.h>

zx_status_t zx_restricted_enter(uint32_t options,
                                uintptr_t vector_table_ptr,
                                uintptr_t context);

说明

从普通线程状态进入受限模式。如果操作成功,当前线程将通过传入 vector_table_ptr 的入口点返回普通模式。

vector_table_ptr 必须位于当前用户地址空间内。context 可以是任何值。从受限模式返回时,该值用作返回到普通模式的值。

options 是包含以下各项的另外零个位矢量:

  • ZX_RESTRICTED_OPT_EXCEPTION_CHANNEL 表示在受限模式下遇到的任何异常都应使用异常通道进行传送。如果此选项不存在,则进程调试程序未处理的任何异常都会导致控制矢量进入 vector_table_ptr(在普通模式下将原因代码设置为 ZX_RESTRICTED_REASON_EXCEPTION)。

vector_table_ptr 中函数的参数在架构上非常具体:

在 x64 上,context 会放置在 rdi 中,原因代码会放置在 rsi 中。 所有其他寄存器当前均未定义,包括堆栈指针。

在 arm64 中,context 位于 x0 中,原因代码位于 x1 中。 所有其他寄存器当前均未定义,包括堆栈指针。

在 riscv64 中,context 会放置在 a0 中,原因代码会放置在 a1 中。 所有其他寄存器当前均未定义,包括堆栈指针。

原因代码指定了普通模式执行恢复的原因。 此原因代码可以是 ZX_RESTRICTED_REASON_SYSCALLZX_RESTRICTED_REASON_EXCEPTION 之一。

共享进程

使用 ZX_PROCESS_SHARED 选项或通过 zx_process_create_shared() 创建的进程具有两个不同的地址空间。其中一个文件可在多个进程之间共享,另一个文件则限定于特定进程。当进入受限模式的线程属于此类进程时,该线程的活动地址空间会按如下方式更新:

  • 进入受限模式时,线程的活动地址空间会设置为进程的受限地址空间。
  • 退出受限模式时,线程的活动地址空间将设置为进程的共享地址空间。

权限

无(当前)

返回值

成功时没有返回值,因为当前线程通过 vector_table_ptr 间接返回。如果失败,则返回负数错误值。

错误

ZX_ERR_INVALID_ARGS vector_table_ptr 不是有效的用户地址,或者 options 为非零值。

ZX_ERR_BAD_STATE”受限模式注册状态无效。

ZX_ERR_NOT_SUPPORTED ZX_RESTRICTED_OPT_EXCEPTION_CHANNEL 未提供,且未针对当前架构实现矢量异常。

另请参阅