总结
在进程上开始执行。
声明
#include <zircon/syscalls.h>
zx_status_t zx_process_start(zx_handle_t handle,
zx_handle_t thread,
zx_vaddr_t entry,
zx_vaddr_t stack,
zx_handle_t arg1,
uintptr_t arg2);
说明
zx_process_start()
与 zx_thread_start()
类似,但用于启动进程中的第一个线程。
zx_process_start()
会使线程在由 entry 指定的程序计数器处开始执行,并将堆栈指针设为 stack。参数 arg1 和 arg2 被安排到在线程启动之前用于函数调用的前两个参数的架构专用寄存器。所有其他寄存器在启动时均为零。
第一个参数 (arg1) 是一个句柄,将从调用方的进程传输到正在启动的进程。对于新启动的线程,相应的句柄值将放置在 arg1 中。如果 zx_process_start()
返回错误,则 arg1 会被关闭,而不是转移到正在启动的进程。
或者,arg1 可以是 ZX_HANDLE_INVALID
,而不是句柄。在这种情况下,进程的第一个参数寄存器(而不是句柄)以 ZX_HANDLE_INVALID
(即零)开头。这意味着进程中没有任何句柄,并且绝不会是进程外共享的任何对象的任何句柄。zx_process_start()
是将句柄转移到不涉及使用其已有的句柄(arg1 通常是“引导”句柄)进行一些系统调用的进程的进程中的唯一方式。没有句柄的进程可以执行一些不需要句柄的系统调用(例如 zx_process_exit()
),前提是已提供了 vDSO 映射。它可以使用不需要句柄的系统调用(如 zx_vmo_create()
)创建新的内核对象,但是如果没有更多句柄,也无法将这些对象传输到进程之外,您将无法使用这些对象。它唯一的通信方式是通过他人映射到其地址空间的内存。
权限
handle 必须为 ZX_OBJ_TYPE_PROCESS
类型,且具有 ZX_RIGHT_WRITE
。
thread 必须为 ZX_OBJ_TYPE_THREAD
类型且具有 ZX_RIGHT_WRITE
。
arg1 必须包含 ZX_RIGHT_TRANSFER
。
返回值
zx_process_start()
会在成功时返回 ZX_OK
。如果失败,则返回负数错误值。
错误
ZX_ERR_BAD_HANDLE
process、thread 或 arg1 不是有效的句柄。
ZX_ERR_WRONG_TYPE
进程不是进程句柄,或 thread 不是线程句柄。
ZX_ERR_ACCESS_DENIED
句柄 thread 缺少 ZX_RIGHT_WRITE
或 thread 不属于 process;或者句柄 process 缺少 ZX_RIGHT_WRITE
或 arg1 缺少 ZX_RIGHT_TRANSFER
。
ZX_ERR_BAD_STATE
进程已在运行或已退出。
ZX_ERR_INVALID_ARGS
entry 不是用户空间地址、不是规范地址,或不是 0
。
另请参阅
zx_handle_close()
zx_handle_duplicate()
zx_object_wait_async()
zx_object_wait_many()
zx_object_wait_one()
zx_process_create()
zx_thread_create()
zx_thread_exit()
zx_thread_start()