3. RISC-V硬件平台概览

在开始移植 Linux 之前,必须先建立对目标硬件平台的完整认知。RISC-V 并不是一块具体的芯片,而是一套开放指令集架构(ISA),不同厂商会基于它设计出差异极大的 SoC。对于系统移植工程师而言,真正决定移植工作量的,是开发板上的 SoC 架构、外设分布、启动介质和调试接口,而不是“RISC-V”这四个字本身。本节从这四个维度建立硬件平台的整体视图。

一、常见 RISC-V 开发板与 SoC 定位

目前工程上常见的 RISC-V 开发板大致可分为三类:面向教学与原型验证的低成本板、面向通用嵌入式的量产级 SoC 板,以及面向高性能计算的多核应用处理器板。它们的移植难度和主线支持程度差异明显。

开发板 / SoC 典型核心 定位 Linux 主线支持
SiFive HiFive Unmatched U74-MC 四核 高性能应用处理器 较好,接近主线
StarFive VisionFive 2 JH7110 四核 通用嵌入式 / 桌面级 持续上游化
Allwinner D1 / Nezha 玄铁 C906 单核 低成本嵌入式 部分主线,需补丁
Kendryte K210 双核 RV64 + AI AIoT / 裸机为主 无 MMU,跑 Linux 困难
QEMU virt 平台 可配置多核 纯软件仿真 主线完整支持
移植初期建议先在 QEMU virt 平台上跑通完整启动链,再迁移到真实开发板。这样可以把“软件配置问题”和“硬件差异问题”分开定位,显著降低排障难度。

二、SoC 架构与外设分布

一颗典型 RISC-V SoC 内部由多个功能域组成:CPU 集群、片上总线、存储控制器、外设控制器和时钟复位管理单元。CPU 通过系统总线访问 DDR 控制器和高速外设,通过外设总线访问 UART、I2C、SPI、GPIO 等低速设备。理解这些外设挂载在哪个总线上、使用哪个地址区间,是编写和修改设备树的关键依据。

以常见的嵌入式 RISC-V SoC 为例,其外设分布通常遵循以下规律:

  • 高速域:DDR 控制器、以太网 MAC、USB、PCIe、显示控制器,通常挂在 AXI 类总线上。
  • 低速域:UART、I2C、SPI、PWM、GPIO、看门狗,通常挂在 APB 类总线上。
  • 系统控制域:时钟控制器(CCU)、复位控制器、中断控制器(PLIC/CLINT)、电源管理。
  • 调试域:JTAG 调试模块,独立于常规外设总线。

这些外设在设备树中体现为一个个节点,每个节点包含 compatible、reg、interrupts、clocks 等属性。移植时若发现某个外设无法工作,第一步应核对设备树中的地址和中断号是否与 SoC 手册一致。

RISC-V SoC 架构与外设分布示意 CPU 集群 RV64 核心 × N L1 / L2 Cache MMU / 中断入口 系统总线 / 互连 AXI / AHB / APB 桥 DDR 控制器 内存映射起始 0x8000_0000 高速外设域 以太网 MAC USB / PCIe 显示控制器 SDIO / eMMC 低速外设域(APB) UART0 / UART1 I2C / SPI GPIO / PWM 看门狗 / RTC PLIC / CLINT 启动介质 SPI NOR Flash SD / eMMC UART 下载 JTAG 加载 调试接口 JTAG / cJTAG UART 控制台 时钟 / 复位 / 电源 CCU 时钟控制器 复位与电源管理

三、启动介质与启动链

RISC-V SoC 的启动介质决定了 BootROM 之后的第一段可执行代码从哪里加载。常见启动介质包括 SPI NOR Flash、SD 卡、eMMC 和 UART 下载模式。多数 SoC 内部固化了一段 BootROM,上电后根据启动引脚(strap pin)或熔丝位选择启动介质,然后加载外部引导程序。

典型启动链如下:

上电复位
  → BootROM(芯片内部固化)
    → SPL / FSBL(从 SPI Flash 或 SD 卡加载)
      → OpenSBI(M 模式固件,提供 SBI 接口)
        → U-Boot(S 模式引导程序)
          → Linux Kernel + 设备树 DTB
            → RootFS(initramfs 或块设备根文件系统)

其中 OpenSBI 是 RISC-V 特有的 M 模式固件层,负责处理机器模式中断、定时器和 IPI,并向 S 模式内核提供统一 SBI 调用接口。移植时若内核启动卡在早期,往往需要先确认 OpenSBI 版本与 SoC 是否匹配。

部分开发板的 BootROM 只支持从特定偏移读取 SPL,若烧录位置错误,会出现“上电无任何串口输出”的现象。此时应优先核对分区表和烧录地址,而不是怀疑内核配置。

四、调试接口与移植排障场景

调试接口是移植过程中最重要的“眼睛”。UART 控制台用于查看启动日志和内核打印,JTAG 用于在 BootROM 或 SPL 阶段进行单步调试。实际工程中,建议同时连接 UART 和 JTAG:UART 观察整体流程,JTAG 定位早期死机。

一个典型排障场景:开发板上电后 UART 无输出。可按以下顺序排查:

  1. 确认串口参数:波特率通常为 115200,数据位 8,无校验,停止位 1。
  2. 确认启动介质选择引脚是否正确,BootROM 是否尝试从预期介质加载。
  3. 用 JTAG 连接,检查 CPU 是否停在 BootROM 或已跳转到 SPL。
  4. 核对 SPL 烧录偏移与 BootROM 约定是否一致。
  5. 检查 DDR 初始化参数,DDR 未初始化成功会导致 SPL 无法搬移后续镜像。
移植复盘要点:硬件平台认知不足是早期移植失败的主要原因。建议在动手改代码前,先整理一份目标板的“硬件清单”:SoC 型号、CPU 核数与特权模式、DDR 容量与地址、启动介质、UART 编号与引脚、JTAG 接口类型、关键外设地址区间。这份清单会直接转化为设备树和 defconfig 的修改依据。

总结来看,RISC-V 硬件平台概览的核心不是记住某一块开发板,而是建立“SoC 架构 → 外设分布 → 启动介质 → 调试接口”这条完整链路。只有把硬件链路和软件启动链对应起来,后续的内核配置、设备树编写和驱动适配才有稳定的落脚点。