RFC-0211:RISC-V 上的 Fuchsia

RFC-0211:RISC-V 上的 Fuchsia
状态已接受
区域
  • 构建
  • 设备
  • 驱动程序
  • EngProd/Infra
  • 固件
  • 常规
  • 内核
  • 语言和库
  • 安全
  • 工具链
说明

添加了对 64 位 RISC-V CPU 的支持。

Gerrit 更改
作者
审核人
提交日期(年-月-日)2023-02-14
审核日期(年-月-日)2023-03-07

摘要

此 RFC 提议向 Fuchsia 添加对 RISC-V CPU 架构的支持。建议的董事会名称为 riscv64

设计初衷

RISC-V 是一种免费的开放式指令集架构,最初由 UC Berkeley 开发,近年来变得越来越受欢迎。RISC-V International 是一家总部位于瑞士的公益组织,其创始成员包括 Google,负责定义 RISC-V 规范。所有工作均通过在 GitHub 上进行的开放协作流程完成,最终规范可供公众免费使用。RISC-V 架构的设计非常灵活,可用于小型微控制器和服务器级 CPU 等各种设备。它具有 32 位和 64 位地址空间变体,并定义了指令扩展集,这些指令扩展集分为多个类别,方便现代操作系统支持。此外,实现还可以为特殊应用定义自定义的非标准指令。

SiFive 等公司最近推出了高性能 64 位内核,这使得 RISC-V 不再仅仅是小型微控制器解决方案,而是进入了 Fuchsia 目前正在进行大量开发的空间。我们认为,现在是 Fuchsia 支持此架构的绝佳时机。通过现在构建强大的 RISC-V 支持,我们将确保 Zircon 和 Fuchsia 从一开始就能支持下一代计算设备。

RISC-V 的开放理念非常符合我们对开源 Fuchsia 项目的目标,有助于我们与 RISC-V 领域的其他利益相关者开展协作。

利益相关方

辅导员

  • jamesr@google.com

贡献者

  • curtisgalloway@google.com - RFC 协调员
  • revest@google.com, rogerta@google.com - RISC-V 20%-ers 上的 Fuchsia 先驱
  • cpu@google.com - RISC-V 倡导者
  • travisg@google.com - Kernel wrangler emeritus

审核者

  • phosek@google.com (工具链)
  • shayba@google.com (测试,构建系统)
  • mcgrathr@google.com (Zircon)
  • dpursell@google.com (固件)
  • mkearney@google.com (文档)
  • mvanotti@google.com (安全性)

已咨询

  • keir@google.com (Pigweed)

设计

目标硬件

Fuchsia 仅面向 64 位处理器。因此,RISC-V 支持将仅面向 64 位 CPU。在此,我们建议仅以 QEMU virt 平台为目标。此 RFC 中未考虑 AEMU 支持,因此需要 AEMU 的工作流程或测试将不受支持。对特定开发板的支持将在未来的 RFC 中单独提出。

ISA 扩展

RISC-V 将常见的 ISA 扩展集定义为配置文件。我们将使我们的要求与官方配置文件定义保持一致,并与 RISC-V 社区合作制定未来的配置文件定义。

首先,我们仅要求使用 RVA20 配置文件,因为 QEMU 支持这些配置文件。用户代码可以假定所有 Fuchsia 系统上都提供 RVA20U64 扩展,而无需进行运行时功能检查。平台本身需要硬件/固件来支持 RVA20S64 配置文件。

我们预计,在 RISC-V Fuchsia 系统部署到硬件之前,未来的 RFC 会更新这些政策。

SBI 固件

内核将仅在 Supervisor 模式 (S-Mode) 下运行,并且需要运行在 Machine 模式 (M-mode) 下的较低级别固件的帮助。SBI 规范提供了一些服务,例如启动辅助核心、计时器和使用远程栅栏。此规范通常由 OpenSBI 等开源固件实现来实现;QEMU 随附预构建的 OpenSBI 1.0,Zircon 将需要此版本作为基准。

启动

在 QEMU“virt”平台上,我们将从 Zircon 被类似于 arm64 中使用的 boot-shim 启动开始。启动 shim 会获取描述 QEMU 配置的 DeviceTree 数据,并根据 ZBI 启动协议呈现表示这些详细信息的 ZBI 项。将根据需要,在 ZBI 协议中指定特定于 RISC-V 需求的新 ZBI 项目类型。未来,我们可以使用其他固件启动到 Zircon。

虚拟内存

RISC-V MMU 支持多种模式,这些模式具有不同的内存页大小和最大页表级别。首先,我们将仅专注于 sv39,因为它是大多数硬件中实现的基本配置。在此模式下,总共有 39 位地址空间可用,Zircon 将使用这些地址空间来提供 38 位用户地址空间。随着 Sv48 的普及,我们可能会扩展 Zircon 以支持更大的用户地址空间。

目标产品

此 RFC 建议以“启动”配置为目标,然后启用 Netstack 3 的“最小”配置,这样就不会依赖 Go。需要创建“最小”配置的“eng”变体,以便在不进行进一步修改的情况下使用标准开发者工作流。

驱动程序

对于目标配置,我们需要 PLIC、PCI、以太网、控制台、PCI 和 RNG 驱动程序。PLIC 和 PCI 驱动程序需要进行一些工作,但据信其余部分可以按原样使用现有的基于 Virtio 的 ARM 驱动程序,这需要验证。

惯例

每次提供 RISC-V 标准时(例如 ELF psABI中断堆栈处理建议),Fuchsia 都会遵循标准做法,除非此类标准和建议会妨碍下面定义的约定支持级别。

例如,我们已将 x18 (s2) 指定为影子调用栈的预留寄存器。我们将努力与社区合作,更新 psABI 规范,以允许平台预留 x18。

支持级别

支持级别应为 RFC-0111 中所述的“基本”级别。这需要 LLVM、Rust 和上游支持,以便至少可以定位到“最小”配置。此外,还将更新 SDK,以便能够进行以 RISC-V 为目标的树外开发。如需了解完整详情,请参阅 RFC-0111。此外,还包括崩溃转储报告和交互式调试支持等基本诊断功能。

性能

此 RFC 不应影响 Fuchsia 在现有架构上的性能,因为未提出任何独立于架构的更改。RISC-V 上 QEMU 的 Fuchsia 性能只会影响 CI/CQ 测试流水线的速度,因此性能工作应仅限于使此场景足够快,这主要涉及运行测试套件而不超时。

安全注意事项

我们建议以以下基准安全缓解措施为目标:

  • 堆栈 canary
  • 阴影调用堆栈

KASLR 和架构侧信道缓解措施不在本 RFC 的范围内。

测试

riscv64 架构支持的自动化测试将来自持续集成,其中 Fuchsia 将在 QEMU virt 平台中启动。

文档

需要对 fuchsia.dev 文档进行全面修订,在许多地方添加 RISC-V,以便普通开发者能够找到贡献 RISC-V 特定代码所需的信息。以下是一些示例:

  • concepts/architecture/architecture_support.md 中的新条目
  • concepts/emulator/index.md 中的映像和主板支持
  • concepts/testing/sanitizers.md 中支持的配置
  • contribute/contributing_to_zircon.md中的所有主要目标

缺点、替代方案和未知因素

此提案为 Fuchsia 添加了第 3 个主要架构,因此会产生大量一次性工程费用,用于:

  • 跨 3 种支持的语言的工具链和 build 系统
  • Libc、固件和低级别内核支持
  • zxdbcrashpad 工作
  • 特定于架构的内核工作
  • SDK 和文档工作

此外,还需要持续支付以下费用:

  • 构建维护
  • 针对 RISCV 的 CI/CQ 工作
  • 基础设施的增量费用
  • 持续进行更高级别库的移植,以实现全面支持

由于 RISC-V 仍是一种相对较新的架构,因此我们预计在努力实现对 Fuchsia 的全面支持的过程中会遇到未知的挑战。此类示例有两个,分别是虚拟化支持和可信执行环境。

缺少服务器级 RISC-V 硬件会导致 QEMU 模拟速度缓慢,并且可能难以运行所有相关测试套件或使用更精细的产品配置。

此外,某些第三方工具和库可能需要额外的工作才能实现 RISC-V 兼容性,而我们在此处并未考虑这一点,这可能需要我们说服上游项目采用 RISC-V 或迫使我们维护分支。

我们可以延迟对 RISC-V 的支持,直到 64 位硬件更加成熟,但延迟可能会导致我们落后于为生产设备提出的硬件的推出,从而使 Fuchsia 作为操作系统变得不太可行。RISC-V 是 Aarch64 和 x86-64 最有力的竞争对手,毫无疑问,它将成为一种热门架构,从而降低成本并提供更多创新自由。 等待的时间越长,RISC-V 就越有可能以某种方式发展,从而使后续的 Fuchsia 移植更加困难或令人望而却步。

在先技术和参考资料