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

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

本文档旨在简要介绍机器开机和系统上运行的软件组件之间发生的一切。

概述:

内核

将 Fuchsia 内核 (zircon) 加载到系统的过程因平台而异。

内核 (zircon) 在系统上运行后,其主要目标是启动用户空间,您可以在其中运行进程。由于 zircon 类似于微内核,因此在此阶段不需要执行很多操作(尤其是与 Linux 相比)。第一个用户进程的可执行文件将被纳入到内核中,然后内核将其复制到新进程中并开始运行。该程序称为 userboot。

初始过程

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

Userboot 的工作非常简单,即找到并启动下一个进程。 8bootfs 映像包含一个只读文件系统,然后 userboot 会访问该系统以查找可执行文件及其库。这些文件会启动下一个进程,即组件管理器。

除非在内核命令行中指定了 userboot.shutdown 选项,否则 userboot 此时可能会退出。

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

组件管理器将其进程标记为“关键”进程,这意味着如果出现问题并发生崩溃,其所在的作业将会终止。当组件管理器在具有特殊属性的根作业中运行时,如果其终止,内核强制重启系统时,组件管理器崩溃也会导致重新启动。

组件管理器

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

组件管理器所运行的组件整理到树中。有一个根组件,它有两个分别名为 bootstrap 和 core 的子项。引导加载程序的子项是系统所需的部分,可让系统正常运行,以运行包含用户体验的更高级别软件。

根组件、引导组件和核心组件都是不可执行的组件,这意味着它们在对应的系统上没有正在运行的程序。它们仅用于组织目的。

显示 fshost 和驱动程序管理器是引导组件的子项,并且核心和引导加载程序是根组件的子项的示意图

初始系统组件

背景

引导加载程序下有两个重要组件:fshost 和驱动程序管理器。

司机经理

驱动程序每个驱动程序都是一个动态库,存储在 bootfs 或软件包中。要运行驱动程序时,它会动态关联到驱动程序主机,然后执行。

驱动程序管理器启动时,将无法使用软件包中存储的驱动程序,因为这些驱动程序存储在磁盘上,驱动程序必须先运行,然后文件系统的块设备才能显示。在加载文件系统之前,只能加载并运行 Zircon 启动映像 (ZBI) 中的驱动程序。驱动程序索引是一个组件,用于了解所有驱动程序位于系统中的什么位置。驱动程序索引将让驱动程序管理器知道基础软件包何时完成加载并找到基础驱动程序。

fshost

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

当 fshost 找到块设备时,它会从每个设备读取头文件以检测文件系统类型。 Fshost 将使用 devfs 使驱动程序管理器为此块设备运行 fvm 驱动程序,从而使其他块设备出现供 fshost 检查。当发现 zxcrypt 分区时,它会执行类似操作,因为需要解密该磁盘才能使用。加载 fvm 和 zxcrypt 后,fshost 将查找相应的块设备并启动 minfsblobfs 文件系统,这些文件系统需要这些文件系统才能完全正常运行。

启动序列

组件管理器通常会按需启动组件,以响应访问组件所提供功能的内容。组件也可能会被标记为“紧急”,这会使组件从其父级启动的同一点开始。

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

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

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

启动完成

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