开机与组件之间的所有内容

警告:本文档最近未经审核,许多详细信息可能已过时。

本文档旨在简要详细介绍机器开机到系统上运行软件组件之间的所有过程。

大纲:

内核

将 Fuchsia 内核 (zircon) 加载到系统上的过程因平台而异。概括来讲,内核存储在 ZBI 中,其中包含启动 Fuchsia 所需的一切内容。

内核 (zircon) 在系统上运行后,其主要目标是启动用户空间,以便在其中运行进程。由于 Zircon 类似于微内核,因此它在此阶段无需执行太多操作(与 Linux 相比尤其如此)。第一个用户进程的可执行文件会烧录到内核中,内核会将其复制到新进程中并启动。此程序称为 userboot

初始流程

Userboot 经过精心构建,以便内核能够轻松启动,否则内核就必须实现许多进程引导功能(例如库加载器服务),这些功能在第一个进程启动后将永远不会使用。

Userboot 的工作非常简单,就是查找并启动下一个进程。内核会向 userboot 提供 ZBI 的句柄,其中包含 bootfs 用户引导加载程序会读取 ZBI 以查找 bootfs 映像,并根据需要对其进行解压缩,然后将其复制到新的位置。 bootfs 映像包含一个只读文件系统,userboot 随后会访问该文件系统以查找可执行文件及其库。有了这些信息,它会启动下一个进程,即组件管理器

此时,Userboot 可能会退出,除非在内核命令行中提供了 userboot.shutdown 选项。

下一个进程是组件管理器,由 userboot 动态链接。因此,与 userboot 相比,它更适合用于早期启动复杂逻辑,因为它可以使用库。由于此组件管理器会为其子级运行各种 FIDL 服务,其中最值得注意的是 bootfs,这是一个基于 FIDL 的文件系统,由 userboot 解压缩的 bootfs 映像提供支持。它还会完成 ZBI 解析并取消提交不必要的页面,并使用提取的信息来托管项、项工厂和参数服务。

组件管理器会将其进程标记为重要,这意味着,如果出现问题并导致其崩溃,则其所属的作业会被终止。由于它在根作业中运行,而根作业具有以下特殊属性:如果被终止,内核会强制重启系统,因此组件管理器崩溃会导致重新启动。

组件管理器

组件管理器是驱动组件框架的程序。此框架控制程序的运行方式和时间,以及这些程序可以从其他程序访问哪些功能。由此框架运行的程序称为组件

组件管理器运行的组件会整理成树状结构。有一个根组件,它有两个子组件,分别名为 bootstrap 和 core。引导加载程序的子项是系统的各个部分,需要这些部分才能使系统功能足够强大,能够运行包含用户体验的更高级别软件。

根、引导加载程序和核心组件是非可执行组件,这意味着系统上没有与其对应的任何运行程序。它们仅用于组织目的。

一张示意图,显示 fshost 和驱动程序管理器是引导加载程序组件的子级,而核心和引导加载程序是根组件的子级

初始系统组件

背景

引导加载程序下有两个重要组件,即 fshost 和驱动程序管理器。 启动会话,然后启动所有面向用户的软件。

驱动程序管理器

驱动程序管理器是负责查找硬件、运行驱动程序以维护硬件,并向 Fuchsia 公开 devfs 句柄的组件。

驱动程序由驱动程序主机运行,它们是驱动程序管理器启动的子进程。每个驱动程序都是存储在 bootfs 或软件包中的动态库,当要运行某个驱动程序时,系统会将其动态链接到驱动程序主机,然后执行该驱动程序。

驱动程序管理器启动时,存储在软件包中的驱动程序不可用,因为它们存储在磁盘上,并且必须先运行驱动程序,然后文件系统的块设备才能显示。在加载文件系统之前,只能加载和运行 Zircon 启动映像 (ZBI) 中的驱动程序。驱动程序索引是一个组件,用于了解系统中所有驱动程序的位置。当基本软件包加载完毕并找到基本驱动程序时,驱动程序索引会通知驱动程序管理器。

fshost

Fshost 是一个组件,负责查找块设备、启动文件系统进程来维护这些块设备,并向 Fuchsia 的其余部分提供这些文件系统的句柄。为此,fshost 会尝试访问其命名空间中的 /dev 句柄。此功能由驱动程序管理器提供

当 fshost 找到块设备时,它会从每个设备读取标头以检测文件系统类型。它最初会找到 Fuchsia 卷管理器 (fvm) 块,该块指向其他块设备的分区。Fshost 将使用 devfs 导致驱动程序管理器为此块设备运行 fvm 驱动程序,这会导致其他块设备显示以供 fshost 检查。当发现 zxcrypt 分区时,它也会执行类似的操作,因为磁盘需要解密才能使用。加载 fvm 和 zxcrypt 后,fshost 将查找适当的块设备,并启动 minfsblobfs 文件系统,这些文件系统是正常运行系统所必需的。

启动顺序

组件管理器通常会在有内容访问组件提供的功能时,按需延迟启动组件。组件还可以标记为“eager”,这会导致组件在其父级启动时启动。

运行后,fshost 会尝试从驱动程序管理器访问 /dev 句柄,这会导致驱动程序管理器启动。它们共同启动驱动程序和文件系统,最终运行 pkgfs。此时,fshost 开始响应 /pkgfs 句柄上的请求,而组件管理器会继续启动用户空间的其余部分。

TODO(https://fxbug.dev/42053321):自 https://cs.opensource.google/fuchsia/fuchsia/+/124f955ae0d1db1c7e991684c7e8a9b4528d6806 起,此图不再准确。

显示 fshost 和驱动程序管理器之间的启动顺序的序列图。

启动完成

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