警告:本文档最近未经过审核,许多详细信息可能已过时。
本文档旨在从宏观层面详细介绍从机器开机到系统上运行软件组件的整个过程。
大纲:
内核
将 Fuchsia 内核 (zircon) 加载到系统上的过程因平台而异。从高级别来看,内核存储在 ZBI 中,其中包含启动 Fuchsia 所需的一切内容。
一旦内核 (zircon) 在系统上运行,其主要目标就是启动用户空间,以便在其中运行进程。由于 Zircon 类似于微内核,因此在此阶段无需执行大量操作(尤其是与 Linux 相比)。第一个用户进程的可执行文件已烘焙到内核中,内核会将其复制到新进程并启动。此程序称为 userboot。
初始流程
Userboot 经过精心构建,易于内核启动,否则内核必须实现大量进程引导功能(例如库加载器服务),而这些功能在第一个进程启动后将永远不会使用。
Userboot 的任务非常简单,就是找到并启动下一个进程。内核会为 userboot 提供 ZBI 的句柄,ZBI 内部包含 bootfs Userboot 会读取 ZBI 以查找 bootfs 映像,并在必要时对其进行解压缩,然后将其复制到新的 <bootfs 映像包含一个只读文件系统,userboot 随后会访问该文件系统以查找可执行文件及其库。然后,它会启动下一个进程,即组件管理器。
除非在内核命令行中指定了 userboot.shutdown 选项,否则 userboot 可能会在此点退出。
下一个进程(即组件管理器)由 userboot 动态链接。这使得它比 userboot 更适合用于前期启动复杂逻辑,因为它可以使用库。由于此组件管理器为其子级运行各种 FIDL 服务,因此就启动而言,最值得注意的是 bootfs,这是一个由 userboot 解压缩的 bootfs 映像支持的 基于 FIDL 的文件系统。它还会完成 ZBI 的解析并取消提交不必要的页面,然后使用提取的信息来托管商品、商品工厂和实参服务。
组件管理器将其进程标记为关键,这意味着如果出现问题并导致其崩溃,则其所在的作业会被终止。由于它在根作业中运行,而根作业具有特殊属性,即如果被终止,内核会强制重启系统,因此组件管理器崩溃会导致系统重启。
组件管理器
组件管理器是驱动组件框架的程序。此框架控制着程序的运行方式和时间,以及这些程序可以从其他程序访问哪些功能。此框架运行的程序称为组件。
组件管理器运行的组件会整理成树状结构。有一个根组件,它有两个名为 bootstrap 和 core 的子组件。Bootstrap 的子级是使系统能够运行包含用户体验的更高级别软件所需的系统部分。
根组件、引导程序组件和核心组件都是不可执行的组件,这意味着系统上没有与它们对应的正在运行的程序。仅用于组织目的。

初始系统组件
背景
在引导程序下,有两个重要组件:fshost 和驱动程序管理器。 这两个组件协同工作,以启动足够实用的系统,供面向用户的软件使用。
驱动程序管理器
驱动程序管理器是负责查找硬件、运行驱动程序以服务硬件,以及向 Fuchsia 公开 devfs 的句柄的组件。Devfs 即将弃用,取而代之的是驱动程序直接公开的服务。(请参阅司机通信)
驱动程序由驱动程序管理器启动的子进程运行。每个驱动程序都是一个存储在 bootfs 或软件包中的动态库,当要运行某个驱动程序时,该驱动程序会动态链接到驱动程序宿主中,然后执行。
驱动程序管理器启动时,存储在软件包中的驱动程序不可用,因为这些驱动程序存储在磁盘上,并且必须先运行驱动程序,然后才能显示文件系统的块设备。在加载文件系统之前,只能加载和运行 Zircon 启动映像 (ZBI) 中的驱动程序。驱动程序索引是一种组件,可了解系统中所有驱动程序的位置。驱动程序索引将让驱动程序管理器知道何时基础软件包已加载完毕,并且已找到基础驱动程序。
fshost
Fshost 是一种负责查找块设备、启动文件系统进程以服务这些块设备,并为这些文件系统向 Fuchsia 的其余部分提供句柄的组件。为此,fshost 会尝试访问其命名空间中的 /dev 句柄。此功能由驱动程序管理器提供。
当 fshost 找到块设备时,它会从每个设备读取标头以检测文件系统类型。它最初会找到指向其他块设备的 Fuchsia 卷管理器 (fvm) 块。Fshost 将使用 devfs 使驱动程序管理器为此块设备运行 fvm 驱动程序,从而使其他块设备显示出来供 fshost 检查。当发现 zxcrypt 分区时,它会执行类似的操作,因为需要对磁盘进行解密才能使用。加载 fvm 和 zxcrypt 后,fshost 将找到相应的块设备并启动 minfs 和 blobfs 文件系统,这些文件系统是系统正常运行所必需的。
启动序列
组件管理器通常会根据需求延迟启动组件,以响应访问组件提供的功能的操作。组件也可以标记为“急切”,这会导致组件在其父组件启动时同时启动。
运行后,fshost 会尝试从驱动程序管理器访问 /dev 句柄,这会导致驱动程序管理器启动。它们共同启动驱动程序和文件系统,最终使 pkgfs 运行。此时,fshost 开始响应 /pkgfs 句柄上的请求,组件管理器继续启动其余的用户空间。
TODO(https://fxbug.dev/42053321):自 https://cs.opensource.google/fuchsia/fuchsia/+/124f955ae0d1db1c7e991684c7e8a9b4528d6806 起,此图不再准确。

启动完成
此时,系统已准备好通过 FIDL 协议和服务启动其他组件,或通过 component_manager 提供的服务直接启动这些组件。