Zircon 基础知识

Zircon 是驱动 Fuchsia 的核心。 它由一个内核和一小部分用户空间服务、驱动程序、 以及启动等核心系统功能所需的库。

虽然 Zircon 应用了许多主流概念, 微内核,它不会力求实现最小。相反,类似微内核的 Zircon 的架构使 Fuchsia 能够减少可信代码量 几个核心功能:

  • 内存管理
  • 调度
  • 进程间通信

数据表显示了 Fuchsia 和
 这表明 Fuchsia 在其操作系统中的
 内核版本。

系统调用

用户空间代码使用 系统调用。Zircon 具有系统调用来执行低级操作, 以:

  • 内存管理
  • 任务和进程管理
  • 进程间通信 (IPC) 和同步
  • 异常处理
  • 硬件支持服务(时钟、熵、设备 I/O)

用户空间通过 libzircon.so(一种 虚拟动态共享对象 (vDSO) ,了解所有最新动态。 Zircon vDSO 是一个 ELF 格式的共享库,内核映射到 为每个新进程分配一个地址空间此库被视为“虚拟”库,因为 它由内核映像直接公开,而不是从文件加载。

大多数系统调用直接通过一个或多个 标识名 — 对位于内核空间中的对象的进程局部引用,该引用表示为 32 位整数 (zx_handle_t)。每个标识名都声明相应权限, 权利时,持有者必须对手柄本身或 引用的对象。

<ph type="x-smartling-placeholder">

作业、进程和线程

Zircon 公开了三个用于运行代码的主要内核对象:

  • 线程: 给定地址空间内的执行线程。
  • 流程: 一组可执行指令在专用的独立地址空间中运行。
  • 作业: 相关进程和作业的组。所有作业都会形成一个有根树的树。

展示 Fuchsia 进程层次结构的树形图。
  进程分为作业,作业最终归根作业所有。

进程构成了系统功能的基础。每个进程都被赋予一组 通过其拥有的各种句柄进行扩展

Fuchsia 软件不一定能在单个进程内运行。 作业允许使用“应用”由多个进程组成 作为单个实体进行控制

进程间通信

由于进程默认处于隔离状态,因此内核需要提供一种方式 安全地相互通信。Zircon 包含以下 用于进程间通信 (IPC) 的内核对象类型:

  • 事件: 两个进程之间的信号接口。
  • 套接字: 流式数据传输,类似于管道。
  • 直播: 可查找的流式数据传输,类似于文件。
  • 渠道: 基于消息的传输,能够同时传递数据和一组句柄。
  • FIFO: 用于共享内存访问的控制平面,针对小型数据载荷进行了优化。

在这些目标中,渠道特别适合协助发布新的 进程,因为它们能够传输标识名(因此, 功能)转移到另一个进程中。

通道恰好有两个端点句柄,每个句柄都归单独的进程所有。 只有所有者可以读取或写入消息,但端点的所有权可以读取或写入 都不得从一个进程转移到另一个进程当标识名被写入 系统就会将其从发送流程中删除。当带有标识名的邮件时 时,系统会将句柄添加到接收进程。

显示进程如何通过
 内核版本。这些联系中最常见的就是渠道。

Zircon 通道是服务级 IPC 协议的基础,下文介绍了 该 Fuchsia 接口定义语言 (FIDL) ,了解所有最新动态。FIDL 是 Fuchsia 程序使用的 IPC 主要方法。您将 我们稍后会详细介绍如何创建和使用 FIDL 协议。

练习:作业和进程

让我们在运行中的系统上探索一些基本概念。在 在本练习中,您将了解作业和进程如何交互形成树。

启动模拟器

如果您尚未运行实例,请通过网络启动 FEMU 支持:

ffx emu start workstation_eng.x64 --headless

转储进程列表

连接到设备 shell 提示符,然后使用 ps 命令转储 运行中的作业和进程。

ffx target ssh ps

以下是一个经过缩减的输出示例:

TASK                     PSS PRIVATE  SHARED   STATE NAME
j: 1027               507.8M  507.4M                 root
  p: 1061             564.4k    564k     36k         bin/bootsvc
  p: 1150            4264.4k   4264k     36k         bin/component_manager
  j: 1479             228.4k    228k
    p: 1583           228.4k    228k     36k         pwrbtn-monitor.cm
  j: 1484             532.4k    532k
    p: 1599           532.4k    532k     36k         svchost.cm
  j: 1544             402.4k    304k
    p: 1633           402.4k    304k    232k         netsvc.cm
  j: 1681             296.4k    296k
    p: 1733           296.4k    296k     36k         console-launcher.cm
  j: 1799            7232.4k   7232k
    p: 1825          7232.4k   7232k     36k         archivist.cm
  j: 1927             660.4k    660k
    p: 1955           660.4k    660k     36k         base-resolver.cm
  j: 2072            1016.4k   1016k
    p: 2088          1016.4k   1016k     36k         driver_manager.cm
  j: 2239             348.4k    348k
    p: 2252           348.4k    348k     36k         device-name-provider.cm
  j: 2364             275.3M  275.3M
    p: 2380          1012.4k   1012k     36k         fshost.cm
    p: 6544           252.1M  252.1M     36k         /pkg/bin/blobfs
    p: 10205         9744.4k   9744k     36k         /pkg/bin/minfs
    p: 10475           12.8M   12.8M     36k         pkgfs

现在,我们来关注输出中的两列:

  • TASK:告知您每个条目是作业 (j) 还是进程 (p) 后跟其唯一 ID。
  • NAME:用于更详细地了解系统的哪个部分 正在运行。

下面,我们将根据刚才讨论的内容, 远:

  1. 每个进程都与一个父级作业相关联。有些作业有多个 过程。
  2. 所有作业都会追溯到作为最终父级的 root 作业,形成一棵树。
  3. 在启动期间,系统会直接启动一些进程到 root 作业中。 大多数其他进程都在其各自的父作业下启动。
  4. 完成初始启动工作后,许多条目都具有 .cm 扩展。这些 参阅组件,稍后我们会进行详细介绍。
  5. 其中一些组件是核心服务,例如文件系统 (fshost.cm) 和 驱动程序 (driver_manager.cm),它们位于用户空间中,与 内核版本。

接下来,我们将探讨 Zircon 如何实现紫红色 安全模型。

<ph type="x-smartling-placeholder">