进程创建

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

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 前端,这种创建进程的方法都最适合在自己的命名空间中创建进程,因为您需要为新进程提供所有内核对象。

fuchsia.sys.Launcher

为了在进程自己的命名空间中创建进程,Fucsia 提供了 fuchsia.sys.Launcher 服务。您无需为此进程提供构建新进程所需的所有内核对象,而只需向相应服务提供您希望创建的进程的简要说明,fuchsia.sys.Launcher 实现即可为新进程提供相应的内核对象。例如,如果您在软件包内提供组件的网址,fuchsia.sys.Launcher 会在适合该组件的命名空间中为该组件创建一个进程,该组件可以访问自己的软件包以及在其清单的 sandbox 部分声明的任何其他资源。

fuchsia.sys.Launcher 会返回 fuchsia.sys.ComponentController 接口,而不是直接返回 zx::process 句柄。该抽象层允许 fuchsia.sys.Launcher 创建并非由单个进程支持的组件。例如,如果您启动用 Dart 编写的组件,则该组件可能会在 Dart 虚拟机的实例中运行,该实例由多个具有兼容的安全约束的组件共用。

前期启动

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

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

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