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 平台 | 可配置多核 | 纯软件仿真 | 主线完整支持 |
二、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 的启动介质决定了 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 是否匹配。
四、调试接口与移植排障场景
调试接口是移植过程中最重要的“眼睛”。UART 控制台用于查看启动日志和内核打印,JTAG 用于在 BootROM 或 SPL 阶段进行单步调试。实际工程中,建议同时连接 UART 和 JTAG:UART 观察整体流程,JTAG 定位早期死机。
一个典型排障场景:开发板上电后 UART 无输出。可按以下顺序排查:
- 确认串口参数:波特率通常为 115200,数据位 8,无校验,停止位 1。
- 确认启动介质选择引脚是否正确,BootROM 是否尝试从预期介质加载。
- 用 JTAG 连接,检查 CPU 是否停在 BootROM 或已跳转到 SPL。
- 核对 SPL 烧录偏移与 BootROM 约定是否一致。
- 检查 DDR 初始化参数,DDR 未初始化成功会导致 SPL 无法搬移后续镜像。
总结来看,RISC-V 硬件平台概览的核心不是记住某一块开发板,而是建立“SoC 架构 → 外设分布 → 启动介质 → 调试接口”这条完整链路。只有把硬件链路和软件启动链对应起来,后续的内核配置、设备树编写和驱动适配才有稳定的落脚点。