内核提供了用于创建和设置进程的底层工具。不过,这些工具很难使用,因为它们涉及为可执行文件、共享库和堆栈直接映射内存。相反,您应该使用更高级别的机制来创建进程。
fuchsia.process.Launcher
Fuchsia 提供了 fuchsia.process.Launcher
服务,可为您构建流程的底层工作。您为此服务提供构建进程所需的所有内核对象(例如,应在其中创建进程的作业对象、可执行映像以及标准输入和输出句柄),该服务将解析 ELF 可执行文件格式,配置进程的地址空间,以及向进程发送启动消息。
大多数客户端不需要直接使用此服务。相反,大多数客户端可以使用 FDIO 库中名为 fdio_spawn
的简单 C 前端。此函数及其更高级的 fdio_spawn_etc
和 fdio_spawn_vmo
伴生函数会连接到 fuchsia.process.Launcher
服务,并向该服务发送适当的消息以创建该进程。传递给 fdio_spawn_etc
的 fdio_spawn_action_t
数组可用于自定义创建的进程。
无论您是直接使用 fuchsia.process.Launcher
服务还是使用 fdio_spawn
前端,这种创建进程的方法最适合在自己的命名空间中创建进程,因为您需要为新进程提供所有内核对象。
前期启动
在启动过程的早期,系统会手动创建许多进程。例如,内核会手动创建第一个用户空间进程 userboot
。
Userboot 最重要的作业是从 ZBI 中的 bootfs 映像加载下一个进程,默认为 component_manager
。
在 fuchsia
作业树中使用作业政策禁止直接构建进程(例如,userboot
如何加载 component_manager
)。可能来自 fuchsia
作业树的库或程序可以使用 fdio_spawn
(或其配套)来创建进程,同时符合安全政策。