摘要
开始执行进程。
声明
#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
进程不是进程句柄或线程
而不是线程句柄。
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()