进程创建

内核提供了用于创建和设置进程的底层工具。不过,这些工具很难使用,因为它们涉及为可执行文件、共享库和堆栈直接映射内存。相反,您应该使用更高级别的机制来创建进程。

fuchsia.process.Launcher

Fuchsia 提供了 fuchsia.process.Launcher 服务,可为您构建流程的底层工作。您为此服务提供构建进程所需的所有内核对象(例如,应在其中创建进程的作业对象、可执行映像以及标准输入和输出句柄),该服务将解析 ELF 可执行文件格式,配置进程的地址空间,以及向进程发送启动消息。

大多数客户端不需要直接使用此服务。相反,大多数客户端可以使用 FDIO 库中名为 fdio_spawn 的简单 C 前端。此函数及其更高级的 fdio_spawn_etcfdio_spawn_vmo 伴生函数会连接到 fuchsia.process.Launcher 服务,并向该服务发送适当的消息以创建该进程。传递给 fdio_spawn_etcfdio_spawn_action_t 数组可用于自定义创建的进程。

无论您是直接使用 fuchsia.process.Launcher 服务还是使用 fdio_spawn 前端,这种创建进程的方法最适合在自己的命名空间中创建进程,因为您需要为新进程提供所有内核对象。

前期启动

在启动过程的早期,系统会手动创建许多进程。例如,内核会手动创建第一个用户空间进程 userboot

Userboot 最重要的作业是从 ZBI 中的 bootfs 映像加载下一个进程,默认为 component_manager

fuchsia 作业树中使用作业政策禁止直接构建进程(例如,userboot 如何加载 component_manager)。可能来自 fuchsia 作业树的库或程序可以使用 fdio_spawn(或其配套)来创建进程,同时符合安全政策。