将Bao移植到RVA23芯片,Banana Pi BPI-SM10 RISC-V开发板

天资达人 时政新闻 2026-09-24 4218 0

将 Bao 带到 RVA23 Silicon

Banana Pi BPI-SM10 上的 Linux + FreeRTOS

João Peixoto,OSYX Technologies 的 Bao 维护者 | 13 分钟阅读 | 2026 年 9 月 22 日

本文将实际探讨在 RISC-V 上使用 Hypervisor 扩展和 AIA 进行混合关键性分区,这些扩展和 AIA 可在符合 RVA23 标准的 SpacemiT K3 上找到。

Banana Pi BPI-SM10 为 Bao 社区带来了一些特别有趣的东西:一个具有 Hypervisor 扩展和高级中断架构 (AIA) 的 RVA23 级 RISC-V 平台,可在真正的硅片上实现。

在这篇文章中,我们将在基于 SpacemiT K3 构建的 BPI-SM10 上安装 Bao,并用它来并行运行 Linux 和 FreeRTOS。

最终形成了一个可复现的混合关键性设置,其中 Linux 处理网络和通用工作负载,而 FreeRTOS 则独立运行在专用硬件上,并拥有串行控制台的所有权。

wKgZO2qzgS6ABeVeAAKkBhSWFEI937.jpg

IMG_0080

960×540 153 KB

BPI-SM10 概述

BPI-SM10 (K3-CoM260) 是一款基于 SpacemiT K3 的 Banana Pi RISC-V 计算机模块和参考载板。其通用计算部分包括:

8 个 X100 64 位 RISC-V 应用内核,最高主频达 2.4 GHz

2 个集群,每个集群包含 4 个 X100 核心

每个集群 4 MB 共享二级缓存

每个 X100 核心配备 64 KB 指令缓存和 64 KB 数据缓存

RVA23 合规性

RISC-V 向量扩展 (RVV) 1.0,VLEN=256

8/16/32 GB LPDDR5,读写速度 6400 MT/s

该 SoC 还包含 8 个 A100 AI 计算核心,额定性能为 60 TOPS,RVV 为 1.0,VLEN 为 1024。这些 AI 核心与 Bao 在本文所述演示中使用的 X100 应用核心是分开的。

从虚拟化的角度来看,X100 芯片是该平台最重要的部分。它们实现了 RISC-V Hypervisor (H) 扩展、高级中断架构 (AIA) 和用于定时器支持的 Sstc 扩展。

首批符合 RVA23 标准的 RISC-V 平台之一

SpacemiT K3 是首批符合 RVA23 标准的 RISC-V 芯片之一,将最新的应用处理器规范引入到商用硬件中。这使得 BPI-SM10 成为一个理想的平台,可以直接在芯片上评估虚拟化和混合关键性工作负载。

载板露出:

2 个 MIPI CSI-2 摄像头连接器

M.2 Key M,支持 PCIe Gen3 x4/x1

M.2 钥匙 E

4 个 USB 3.0 Type-A 接口

USB Type-C UFP

千兆以太网

DisplayPort 1.2

MIPI DSI

40 针接头,带有 UART、SPI、I2S、I2C 和 GPIO 接口

它的封装尺寸与 NVIDIA Jetson Orin Nano 外形尺寸兼容,这也使得该板卡对正在评估 RISC-V 在已使用该载体格式的系统中的应用的开发人员来说很有吸引力。

关于包子的简要说明

Bao 是一款轻量级的开源静态分区虚拟机管理程序,旨在实现强大的隔离性和可预测的执行。

Bao 并不动态调度虚拟 CPU,而是在配置时静态地为虚拟机分配 CPU、内存区域、设备和中断。在其核心分区模型中,Bao 特意避免了以下情况:

运行时 CPU 调度

运行时内存分配

完整的设备仿真

一个具有特权的 Linux 管理虚拟机

隔离是通过硬件虚拟化机制实现的。在带有 H 扩展的 RISC-V 系统中,这包括第二阶段(RISC-V 术语中的 G 阶段)地址转换以及硬件辅助中断虚拟化。

对于混合关键性系统,该模型为每个虚拟机分配固定的资源预算,并消除分区之间的调度程序干扰。

Bao 由社区驱动的Bao 项目开发,并以 Apache 2.0 许可证发布。

OSYX是 Bao 项目背后的面向行业的实体,为混合临界性设计提供商业支持、平台启动、系统集成和长期维护。

我们建造了什么

BPI-SM10 演示程序运行两个独立的虚拟机:

Linux:SpacemiT 的供应商内核,通过 Buildroot 构建,提供网络和通用功能。

FreeRTOS:在专用 HART 上运行实时任务并控制板载串口控制台

该板卡提供一个适用于控制台的 UART 接口。由于静态分区设备仅属于一个虚拟机,因此 UART0 被分配给 FreeRTOS。因此,Linux 以无头模式运行,并通过以太网使用 SSH 进行访问。

测试软件配置

开发板:Banana Pi BPI-SM10 (K3-CoM260) 模块和参考载板

Bao 虚拟机管理程序:feat/plat-spacemit-k3

bao-demos:feat/k3-com260

Linux:SpacemiT 供应商 6.18 内核(通过 Buildroot 安装)

bao-drivers:linux-v6.18

U-Boot 和 OpenSBI:SpacemiT 代码库已锁定到 k3-br-v1.0.0

技术演示

这仅是一次技术演示,并非生产就绪的集成。演示内容涵盖平台启动、静态分区、启动流程、设备分配以及虚拟机间通信。生产部署还需要额外的加固、验证以及(如适用)认证工作。

资源分区

该演示使用了八个 X100 应用核心中的四个:

Hart 0:Linux

哈特 1:Linux

Hart 2:Linux

Hart 3:FreeRTOS

Harts 4 至 7:未分配,可用于进一步划分或实验。

Linux 系统分配 1 GiB 内存和以太网相关设备链。FreeRTOS 系统分配 128 MiB 内存和 UART0 接口。一个 64 KiB 的共享内存区域,以及一个门铃中断,为两个虚拟机之间提供了一个受控的进程间通信 (IPC) 通道。

IMG_0078

960×540 48.5 KB

Linux 拥有三个 HART 接口和以太网设备链。FreeRTOS 拥有一个 HART 接口和 UART0。唯一跨越边界的资源是已配置的共享内存区域。

资源 VM 1(Linux) VM 2(FreeRTOS)
哈茨 0、1、2(CPU亲和性 = 0x7) 3(CPU亲和性=0x8)
内存基础 0x180000000(place_phys) 0x0
内存大小 1 GiB 128 MiB
设备 gmac1、syscon_apbc、syscon_apmu、pinctrl、gpio UART0
设备中断 133、277、60、58 42
中断控制器 应用程序0xe0804000,IMSIC 0xe0400000 应用程序0xe0804000,IMSIC 0xe0400000
IPC 内存库 0xf0000000 0xf0000000
IPC 内存大小 64 KiB 64 KiB
IPC中断 52 52
网络 带DHCP的以太网
安慰 SSH UART0

该平台使用 RISC-V AIA 进行中断处理。在 K3 上,这包括高级平台级中断控制器 (APLIC) 和传入消息信号中断控制器 (IMSIC)。

Bao 在初始化期间配置这些资源一次。之后,每个虚拟机都在其分配的内核上运行,拥有自己的内存和设备。

以太网直通

将设备传递给静态分区的虚拟机通常比分配一个MMIO区域和一个中断要困难得多。K3以太网控制器就是一个很好的例子。

仅仅将驱动程序分配gmac1到 Linux 系统并不足以使网络接口正常工作。该驱动程序还依赖于其他几个硬件模块:

syscon_apbc时钟和复位相关控制

syscon_apmu:时钟和复位相关控制

pinctrl:配置 RGMII 和 MDIO 焊盘

GPIO:驱动以太网PHY复位线

在传统的 Linux 系统中,内核可以通过常规的设备树和驱动程序框架访问这些提供程序设备。然而,在静态分区系统中,Linux 虚拟机无法访问 Bao 未明确分配给它的硬件。这意味着分区必须包含设备所需的完整依赖链。

Linux VM
   |
   +-- GMAC1
   |
   +-- syscon_apbc  -> clocks / reset
   +-- syscon_apmu  -> clocks / reset
   +-- pinctrl      -> RGMII / MDIO muxing
   +-- GPIO         -> PHY reset

从K3培养中吸取的教训

设备直通不仅仅关乎终端设备,它还关乎客户机驱动程序运行该设备所需的所有硬件资源。向分区系统添加其他外围设备时,也适用同样的模式。

还有两点值得注意:

Linux 内存区域使用place_phys,这意味着客户机看到的区域与主机使用的物理地址相同。

目前只有一半的 X100 应用核心被分配,还剩下四个核心可供另一个虚拟机使用。

从 BootROM 到 Bao:K3 启动链

K3 的启动流程比传统的“U-Boot 加载虚拟机管理程序”序列更有趣。BootROM 和辅助启动阶段需要 SD 卡上固定偏移位置的固件组件,而不是通过文件系统来发现所有内容。

因此,Bao平台构建产生了一个完整的sdcard.img包含内容:

GPT

ext4 启动文件系统分区

bao.itb

启动.scr

固件组件已写入 K3 启动过程所需的原始位置

wKgZO2qzgS-ADK6VAACZNDBOgqI581.jpg

Bao 之前的每个阶段都由 K3 启动过程完成。Bao 配置 harts、G-stage 转换、设备、AIA 路由和 IPC 通道,然后将控制权交给两个虚拟机。

那时:

FreeRTOS 在 hart 3 上启动,占用 UART0,并开始执行任务。

Linux 系统从 harts 0 到 2 启动,初始化以太网,并通过 SSH 连接。

两个系统继续独立运行,互不干扰 CPU 调度。

K3平台启动说明

端口的一些细节对于该平台来说具有很强的特殊性,值得记录下来,以便任何将 Bao 适配到其他 K3 载板或 BSP 的人都能了解情况。

1. 固定启动固件

启动固件由 SpacemiT U-Boot 树生成,包含u-boot.itb默认环境、FSBL 和启动信息块。OpenSBI 是单独构建的fw_dynamic.itb。

该演示程序将两者都锁定在k3-br-v1.0.0标签上,而不是跟随开发分支的最新更新。这避免了诸如超出 SPL 大小限制之类的回归问题。

2. 使用 FIT 图像

此开发板上的 U-Boot 不支持此流程中使用的旧版 uImage。因此,Bao 和启动脚本以扁平化镜像树 (FIT) 镜像的形式提供。

厂商bootcmd通常支持 GRUB 引导或原始内核引导。对于 Bao 引导流程,环境变量会被替换,mkenvimage以便 U-Bootboot.scr自动加载 Bao 并进入 Bao 目录。

3. 调整 Linux 厂商内核

该 Linux 虚拟机使用 SpacemiT 提供的 6.18 内核,该内核是通过标准的 Buildroot 构建流程构建的。配置中添加了以下所需的组件:

K3 SoC 支持

时钟控制

引脚控制

GPIO

友邦保险

通用汽车金融

支持 8250 UART

另一个补丁移除了厂商的 SBI dcache-flush 调用。在 Bao 框架下,这些ecall调用由虚拟机管理程序而非厂商固件路径处理,否则厂商配置中针对这些调用的限制会破坏链接。

在将虚拟机管理程序从架构模型迁移到实际硬件时,这些正是容易被忽略的平台特定细节。

Linux 和 FreeRTOS 通信

两位访客仅通过预先配置的IPC通道进行通信:

64 KiB 共享内存

在两个访客中都映射到 0xf0000000

门铃中断:IRQ 52

在 Linux 系统中,bao-driversIPC 模块将通道公开为:

/dev/baoipc0

从 Linux 向 FreeRTOS 发送数据:

echo "Hello from Linux" > /dev/baoipc0

FreeRTOS 接收到消息后,会将其与正常任务输出一起打印到串口控制台上。FreeRTOS 可以将数据写回同一个 IPC 通道,Linux 可以使用以下方式读取该通道:

cat /dev/baoipc0

这样一来,两个虚拟机就拥有了一条可控的通信路径,而无需共享调度或设备。由于在这种配置下 Linux 是无头的,因此进程间通信 (IPC) 通道也是一种将 FreeRTOS 状态暴露给可通过网络访问的应用程序的自然方式。

构建演示

演示文件位于bao-project/bao-demos目录下:

平台:k3-com260

演示:linux+freertos

分支:feat/k3-com260

依赖关系

K3 平台除了标准bao-demos依赖项外,还需要三个软件包,因为构建过程会组装最终的 SD 卡映像。

sudo apt install build-essential bison flex git libssl-dev ninja-build 
    u-boot-tools pandoc libslirp-dev pkg-config libglib2.0-dev libpixman-1-dev 
    gettext-base curl xterm cmake python3-pip xilinx-bootgen file cpio 
    device-tree-compiler gdisk e2fsprogs

pip3 install pykwalify packaging pyelftools

建造

设置 RISC-V 工具链:

export CROSS_COMPILE=/path/to/riscv64-unknown-elf/bin/riscv64-unknown-elf-
export OPENSBI_CROSS_COMPILE=/path/to/toolchain/bin/riscv64-unknown-linux-gnu-

克隆演示代码库:

git clone https://github.com/bao-project/bao-demos
cd bao-demos

选择平台和演示版本,然后进行构建:

export PLATFORM=k3-com260
export DEMO=linux+freertos

make -j$(nproc)

单次构建调用即可获取并构建完整的软件栈:OpenSBI、SpacemiT U-Boot、buildroot、SpacemiT 厂商提供的 Linux 内核、FreeRTOS、Bao 以及最终的构建组件sdcard.img。buildroot 阶段在首次构建中占据主导地位。

启动新电路板时,首先要从裸机开始。

如果您要将 K3 支持适配到其他主板或载板,请从以下步骤开始:

export DEMO=baremetal

裸机配置在所有八个 X100 硬件加速卡上运行一个虚拟机,分配 64 MiB 内存,0x102000000并直接直通 UART0。这样,在引入 Linux、AIA 设备依赖项或第二个虚拟机之前,您可以轻松验证启动链、Bao 入口、硬件加速卡初始化、内存配置和 UART 直通。

部署

将生成的镜像写入sdcard.imgmicroSD 卡并启动开发板。平台 Makefile 会dd在构建完成后打印目标镜像路径和相应的命令。相同的过程在文档中也有说明platforms/k3-com260/README.md。

启动演示,展示在 BPI-SM10 上 Bao 系统下启动 Linux 和 FreeRTOS。

启动后:

FreeRTOS 输出可通过 UART0 访问。

Linux 通过 DHCP 获取网络连接。

Linux 系统通过 SSH 访问。

IPC 可通过 /dev/baoipc0 访问。

可以尝试的东西

目前的演示版本特意留出了扩展空间。

添加另一个虚拟机/分区

目前仅使用了八个 X100 心脏中的四个。因此,心脏 4 至 7 可以分配给:

另一个 Linux 虚拟机

另一个实时操作系统

裸机工作负载

隔离的服务分区

这使得 BPI-SM10 成为试验更复杂的静态分区拓扑的有用平台。

更改资源地图

Bao 的配置可以进行修改demos/linux+freertos/configs/k3-com260.c。一些有用的实验包括:

在隔间之间移动心脏

更改 RAM 大小

分配其他外围设备

创建第三个虚拟机

改变IPC布局

添加更多设备

以太网启动是一个有用的模板。对于每个新设备,不仅要识别 MMIO 区域和中断,还要识别客户驱动程序所需的所有依赖资源:时钟、复位、引脚控制、GPIO 以及 IOMMU 或 DMA 相关资源(如适用)。

评估干扰

当前架构确立了建筑隔离边界。下一步自然是进行以下特征描述:

中断延迟

IPC延迟

执行时间抖动

缓存干扰

内存系统干扰

Bao 还支持诸如通过缓存着色进行缓存分区等技术,这些技术可在需要更严格的干扰控制时进行评估。有关静态分区和混合关键性系统的更深入分析,请参阅《揭示基于 Arm 的混合关键性系统的静态分区虚拟机管理程序》。

接下来去哪儿?

Linux 和 FreeRTOS 是一对绝佳的搭配。它们采用相同的分区模型,并且都支持以下操作系统

多个 Linux 虚拟机,包括基于 Android 的虚拟机

Zephyr、NuttX 和 RT-Thread

当两个虚拟机需要同一个外围设备时,Bao 使用 VirtIO:一个虚拟机拥有该设备,并通过共享内存与其他虚拟机共享该设备。

对于一个基本的入门指南,请参阅bao-helloworld和我们自己的教程“ Hello, Bao!”。

结论

BPI-SM10 对 Bao 来说是一个特别有趣的平台,因为它结合了现代 RISC-V 应用处理器、RVA23 级功能、Hypervisor 扩展和基于 AIA 的中断处理,并且运行在真正的硬件上。

这里展示的演示展示了从 K3 启动链到两个隔离的客户机的完整路径:Linux 用于网络和通用工作负载,FreeRTOS 用于确定性实时执行,Bao 用于静态资源分区和硬件强制隔离。

更重要的是,启动过程揭示了将虚拟化从架构规范转移到真正的 SoC 时重要的细节:启动固件约束、中断控制器集成、设备依赖链、供应商内核假设和显式资源所有权。

对于正在评估 RISC-V 在混合关键性系统中的应用的开发人员来说,BPI-SM10 提供了一个实用的平台,可以直接在硅片上探索这些机制。

审核编辑 黄宇