总结
进入受限模式
声明
#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_SYSCALL
和 ZX_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
未提供,且未针对当前架构实现矢量异常。