zx_process_start

摘要

开始执行进程。

声明

#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。 参数 arg1arg2 排列在架构中 用于函数调用的前两个参数的特定寄存器 。所有其他寄存器在启动时都为零。

第一个参数 (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 processthreadarg1 不是有效的句柄。

ZX_ERR_WRONG_TYPE 进程不是进程句柄或线程 而不是线程句柄。

ZX_ERR_ACCESS_DENIED 句柄 thread 缺少 ZX_RIGHT_WRITEthread 不属于 process,或者标识名 process 缺少 ZX_RIGHT_WRITEarg1 缺少 ZX_RIGHT_TRANSFER

ZX_ERR_BAD_STATE 进程已在运行或已退出。

ZX_ERR_INVALID_ARGS entry 不是用户空间地址,不是 规范地址,或者不是 0

另请参阅