Zircon 使用入门

签出 Zircon 源代码

本指南假定将 Fuchsia 项目签出到 $FUCHSIA_DIR 中, 和 fx 已配置完毕。

使用默认工具链构建 Zircon

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

fx set bringup.arm64

Fuchsia 运用 products 至 创建一系列构建目标。通过 预发布产品 是具有最少特征集的最小商品。

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

fx list-products

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

fx list-boards

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

fx build

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

明确设置目标工具链

默认情况下,Fuchsia 使用 clang 工具链。可以使用gccvariants 参数与 fx set 搭配使用:

fx set bringup.x64 --variant gcc

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

为所有目标构建 Zircon

您可以使用 fx multi 和包含所有目标的文件进行构建, 要构建的规范您可以在以下位置找到每个目标的输出: $FUCHSIA_DIR/out/<product>.<board>.variant。多 build 规范示例 为 bringup-cq,因此 用于估算为 CQ 测试而构建的内容。

请先针对所有目标进行构建,然后再提交,以确保构建适用于所有目标 架构。

QEMU

如果您仅在实际硬件上进行测试,但模拟器是 便于快速进行本地测试,通常值得一试。

请参阅 QEMU,了解有关构建和 使用带有 Zircon 的 QEMU

构建工具链(可选)

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

  • Clang 工具链默认用于构建 Zircon,如果您使用 variants = [ "clang" ]variants = [ "asan" ]
  • 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,但此开关 无需进行此操作。

对于 GCC,需要传递 MAKEOVERRIDES=USE_GCC_STDINT=provide make 命令行。这应确保 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 。您将需要一个包含运行时库的工具链。 我们通常也会为主机和 *-fuchsia 项目标。如需了解更多详情,请点击此处 我们将为您详细介绍如何构建 Clang

为工具链设置构建参数

如果您使用的是预构建的工具链,则可以跳过此步骤,因为构建 系统会自动找到它们

设置指向您安装工具链的位置的构建参数:

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 的尾部应该带有斜杠。如果 clanggcc: 您的PATH适用于 Zircon,您只需使用空前缀即可。

正在与 Zircon 之间复制文件

配置本地链路 IPv6 后,您可以使用 fx cp 将文件复制到和复制出文件 。

包括其他用户空间文件

Zircon build 会创建一个包含必要用户空间的 bootfs 映像 (设备管理器、某些设备驱动程序、 等)。内核能够添加第二个 bootfs 映像,该映像由 作为 ramdisk 映像运行。

要创建这样的 bootfs 映像,请使用 zbi 工具,该工具是 build。它可以为源目录(其中每个目录所在的目录) 包含指定目录及其子目录中的每个文件的情况) 或通过清单文件逐个文件指定 包括。

$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 启动的系统(例如 Acer 和 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 系统充当引导加载程序 Zirconboot 采用与 Gigaboot 相同的启动协议 。

如需使用 zirconboot,请通过netsvc.netboot=true 内核命令行。当 zirconboot 启动时,它将尝试提取并启动 从在连接的主机上运行的 bootserver 进入 Zircon 系统。

网络日志查看

Zircon 的默认版本包含网络日志服务,可将 通过链路本地 IPv6 UDP 运行的系统日志。请注意,这是一个小技巧 协议在某个时间点肯定会发生变化

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

$BUILDDIR/tools/loglistener

调试

有关在 zircon 环境中进行调试的随机提示,请参阅 调试

贡献更改


  1. binutils 2.30 版本在make check aarch64-elfx86_64-elf 配置。这些问题会在 上游 binutils-2_30-branch git 分支,这是我们实际 build。不过,2.30 版适合构建 Zircon;它 只是其自身的测试套件中有一些虚假失败。