Zircon 使用入门

检出 Zircon 源代码

本指南假定 Fuchsia 项目已签入 $FUCHSIA_DIR,并且已配置 fx

使用默认工具链构建 Zircon

fx 命令封装了用于配置、构建 Fuchsia 并与之交互的各种工具。fx set 命令用于指定产品和板级架构。例如,如需将 arm64 的构建目标设置为 Zircon,请运行以下命令:

fx set bringup.arm64

Fuchsia 使用产品的概念来创建一系列构建目标。启动产品是具有最少功能集的最小产品。

以下命令可以输出其他产品配置的列表:

fx list-products

以下命令会输出定义的开发板架构的列表:

fx list-boards

如需执行构建,请运行以下命令:

fx build

构建结果保存在 $FUCHSIA_DIR/out/default 中。

显式设置目标工具链

默认情况下,Fuchsia 使用 clang 工具链。您可以将 variants 参数与 fx set 结合使用,以将其设置为 gcc

fx set bringup.x64 --variant gcc

您还可以使用变体标志启用 asan。

为所有目标构建 Zircon

您可以使用 fx multi 并使用一个包含要构建的所有规范的文件,针对所有目标进行构建。每个目标的输出可在 $FUCHSIA_DIR/out/<product>.<board>.variant 中找到。bringup-cq 就是多 build 规范的一个示例,它大致反映了为 CQ 测试构建的内容。

请先针对所有目标进行构建,然后再提交,以确保 build 可以在所有架构上运行。

QEMU

如果您仅在实际硬件上进行测试,则可以跳过该步骤,但模拟器对于进行快速本地测试非常方便,并且通常值得使用。

如需了解如何构建和使用带有 zircon 的 QEMU,请参阅 QEMU

构建工具链(可选)

如果预构建工具链二进制文件不适合您,则可以从原始上游源代码构建自己的工具链二进制文件。

  • 默认情况下,或者当您使用 variants = [ "clang" ]variants = [ "asan" ] 构建时,Clang 工具链用于构建 Zircon。
  • 默认情况下,Clang 工具链也用于构建主机端代码,但适用于构建主机的任何支持 C++14 的工具链都应该正常运行。
  • 您也可以使用 GCC 工具链。

根据您希望如何构建 Zircon,构建其中一个或两个。

GCC 工具链

我们使用 GNU binutils 2.301 和 GCC 8.2,并使用 --enable-initfini-array --enable-gold 进行配置,并针对 x86-64 使用 --target=x86_64-elf --enable-targets=x86_64-pep,对于 ARM64,使用 --target=aarch64-elf

对于 binutils,我们建议使用 --enable-deterministic-archives,但无需进行此切换以获取有效的 build。

对于 GCC,必须在 make 命令行中传递 MAKEOVERRIDES=USE_GCC_STDINT=provide。这应确保 stdint.h GCC 安装可以独立运行(在源代码中为 stdint-gcc.h),而不是使用 #include_next 并在其他位置安装另一个 stdint.h 文件。

只需支持 C 和 C++ 语言,不需要 libgcc 以外的目标库,因此您可以使用各种 configure 开关来停用其他设置,并提高 GCC 本身的构建速度并减少存储空间用量,例如 --enable-languages=c,c++ --disable-libstdcxx --disable-libssp --disable-libquadmath。如需了解详情,请参阅 GCC 安装文档。

您可能需要满足各种其他 configure 开关或其他前提条件,才能在特定的主机系统上进行构建。请参阅 GNU 文档。

Clang/LLVM 工具链

我们使用 Clang 的主干快照,并经常更新到新快照。任何近期足够支持且支持编译在 x86_64aarch64 中的 Clang 的 build 都应正常运行。您需要一个也包含运行时库的工具链。我们通常也会对主机和 *-fuchsia 目标使用相同的 Clang 版本。如需详细了解如何构建 Clang,请参阅此处

为工具链设置构建参数

如果您使用的是预构建工具链,则可以跳过此步骤,因为构建操作会自动找到这些工具链。

设置指向工具链安装位置的 build 参数:

fx set bringup.x64 --variant clang --args clang_tool_dir = "<absolute path to>/clang-install/bin/"

或者对于 GCC:

fx set bringup.x64 --variant gcc --args gcc_tool_dir = "<absolute path to>/gcc-install/bin/"

请注意,*_tool_dir 应以斜杠结尾。如果 PATH 中的 clanggcc 适用于 Zircon,则只需使用空前缀即可。

将文件复制到 Zircon 或从中复制文件

配置本地链接 IPv6 后,您可以使用 fx cp 将文件复制到设备或从设备复制文件。

包含其他用户空间文件

Zircon build 会创建一个 bootfs 映像,其中包含系统启动所必需的用户空间组件(设备管理器、某些设备驱动程序等)。内核能够添加第二个 bootfs 映像,该映像由 QEMU 或引导加载程序以 ramdisk 映像的形式提供。

如需创建此类 bootfs 映像,请使用在 build 中生成的 zbi 工具。它可以为源目录(在这种情况下,包含指定目录及其子目录中的每个文件)或通过逐个指定文件要包含的文件的清单文件组建 bootfs 映像。

$BUILDDIR/tools/zbi -o extra.bootfs @/path/to/directory

echo "issue.txt=/etc/issue" > manifest
echo "etc/hosts=/etc/hosts" >> manifest
$BUILDDIR/tools/zbi -o extra.bootfs manifest

在启动后的 Zircon 系统中,bootfs 中的文件将显示在 /boot 下,因此在上面的清单示例中,“hosts”文件将显示在 /boot/etc/hosts 下。

网络启动

系统通过两种机制支持网络启动:Gigaboot 和 Zirconboot。Gigaboot 是基于 EFI 的引导加载程序,而 zirconboot 是一种机制,可让最小的 zircon 系统充当 zircon 的引导加载程序。

在通过 EFI(例如宏碁和 NUC)启动的系统上,任一选项均可。在其他系统上,zirconboot 可能是用于网络启动的唯一选项。

通过 Gigaboot

GigaBoot20x6 引导加载程序采用简单的网络启动协议(通过 IPV6 UDP),该协议无需任何特殊主机配置或特权访问权限即可使用。

为此,它利用 IPV6 链路本地寻址和多播,允许正在启动的设备通告其可启动性,主机可以找到它并向其发送系统映像。

$BUILDDIR/tools/bootserver $BUILDDIR/zircon.bin

# if you have an extra bootfs image (see above):
$BUILDDIR/tools/bootserver $BUILDDIR/zircon.bin /path/to/extra.bootfs

默认情况下,bootserver 将继续运行,并且每次检测到 netboot 信标时,它都会将内核(以及 bootfs,如果已提供)发送到该设备。如果您传递 -1 选项,bootserver 将在成功启动后退出。

经过 Zirconboot

Zirconboot 是一种机制,可让 zircon 系统充当 zircon 本身的引导加载程序。Zirconboot 所用的启动协议与上述 Gigaboot 协议相同。

如需使用 zirconboot,请通过内核命令行将 netsvc.netboot=true 参数传递给 zircon。当 zirconboot 启动时,它会尝试从连接的主机上运行的启动服务器提取并启动到 zircon 系统。

网络日志查看

Zircon 的默认 build 包含一个网络日志服务,该服务通过链路本地 IPv6 UDP 多播系统日志。请注意,这是一次快速的黑客行为,之后该协议肯定会发生变化。

目前,如果您在带有 -N 标志的 QEMU 上运行 Zircon,或在具有受支持的以太网接口(NUC 上的 ASIX USB Dongle 或 Intel 以太网)的硬件上运行,日志监听器工具将观察通过本地链接广播的日志:

$BUILDDIR/tools/loglistener

调试

如需了解在 zircon 环境中进行调试的随机提示,请参阅调试

贡献更改


  1. binutils 2.30 版本在 aarch64-elfx86_64-elf 配置中有一些无害的 make check 失败项。这些错误会在上游 binutils-2_30-branch git 分支上得到修复,也就是我们实际构建的内容。但是,2.30 发布版本非常适合构建 Zircon;它只在自己的测试套件中存在一些虚假故障。