跳转到内容

在 YuzukiNeko 上运行 RustSBI 与 Asterinas

本文介绍如何在 YuzukiNeko F101-S3 上刷入预编译固件,从 SPI NOR 启动 Asterinas,进入 BusyBox 命令行并运行九个示例。首次体验可以直接使用完整镜像,无需自行编译。需要获取源码并自行编译时,请阅读从源码构建 RustSBI 与 Asterinas。

RustSBI 是使用 Rust 实现 RISC-V SBI(Supervisor Binary Interface)的项目,为操作系统提供标准的固件服务接口。它让内核通过统一接口使用定时器、核间中断和系统复位等底层服务,减少对具体硬件平台的依赖。

Asterinas 是使用 Rust 编写的操作系统内核。它以兼容 Linux 应用为目标,利用 Rust 的类型系统和内存安全机制提高内核的安全性。

本包使用针对 Neko 适配的 RV32 移植版本,具体来源与改动见组件版本。

从上电到命令行,各组件的关系如下:

BROM → SyterKit → RustSBI → Asterinas → BusyBox shell
组件在本镜像中的作用
BROM芯片内置的启动代码,进入 FEL 下载模式或加载启动程序
SyterKit初始化 RAM,从 SPI NOR 加载后续镜像并交接执行
RustSBI向内核提供 SBI 固件服务接口
Asterinas运行操作系统内核,管理内存、进程等资源
BusyBox提供交互式 shell 和基础命令,供用户运行示例

下面按“准备与接线 → 刷写与校验 → 启动与示例”的顺序操作;需要更新单个组件时,再阅读单独替换某个组件。

  • YuzukiNeko F101-S3 开发板,配置为 16 MiB RAM 和 16 MiB SPI NOR。
  • 一根可传输数据的 USB 线,用于开发板供电和 FEL 下载。
  • Yuzuki AvaotaUART,或者通用的 3.3 V 逻辑电平的 USB 转 TTL 串口适配器、连接线及串口终端软件,用于观察启动日志和输入命令。
  • 一台刷机主机:Windows、Linux、macOS 都可以。 先按FEL 下载模式与工具装好 xfel 或 rfel,以及相应的 USB 驱动或访问权限。

固件位于仓库的 02_Firmware/RustSBI-Asterinas/ 目录。首次安装请下载完整镜像 yuzukineko-rustsbi-asterinas.img 和同目录的 SHA256SUMS;manifest.json 记录版本、Flash 布局与验证信息。所有文件的用途见文件清单。

下面假设工具在 PATH 里,终端位于镜像所在目录。刷机命令在主机终端运行,启动后的示例命令在开发板的串口终端运行。

单个镜像是 .bin,合成镜像是 .img。.img 是按固定偏移拼好的原始 SPI NOR 数据,既不是 PhoenixSuit 容器,也不是带分区表的磁盘镜像。

首次安装或从其他固件切换时用完整镜像。它写入 NOR 0x000000..0x6d0000,0x6d0000..0x1000000 不受影响。“完整”指文件包含启动所需的一切,并不是补到整片 16 MiB。要保留原固件,请先备份。

本镜像使用 UART1(PB0 / PB1)作为控制台,在系统中对应 ttyS0。先断开开发板电源,按下图链接 AvaotaUART 适配器到开发板:

如果您没有 AvaotaUART,请按下表连接通用的 USB 转 TTL 串口适配器:

开发板引脚信号方向连接到串口适配器
PB0UART1 TX,开发板发送RX
PB1UART1 RX,开发板接收TX
GND信号地GND

元件面朝上、USB-C 接口位于顶部时,PB0、PB1 分别在右侧排针第 10、11 行,GND 在右侧第 2 行;位置见引脚排布,接线前请对照对应硬件版本的原理图。开发板由 USB 供电,串口适配器只连接上表三根信号线,电源脚留空;使用 3.3 V 逻辑电平。

在串口终端中选择适配器实际对应的串口,设置为 115200 波特、8N1、无流控,并在复位启动系统前打开串口。8N1 表示 8 位数据位、无校验、1 位停止位。主机上的端口号随适配器和电脑而变化,不要固定照抄其他人的端口号。

本包的串口输入对长粘贴字符串比较敏感,可以把终端的发送延时设为约 每字符 20 ms。

以下以 xfel 为例。使用 rfel 时,把命令中的 xfel 换成 rfel 即可。

按住 FEL 键,重新接上 USB 数据线,松开。然后在主机终端检查芯片和 Flash:

终端窗口
xfel version
xfel spinor

应识别出 chip ID 0x00193700 的 F101 和 16 MiB Flash。这一步不需要执行 ddr 命令。找不到设备或提示不支持芯片时,先按FEL 常见错误检查工具版本、连接和驱动,再继续刷写。

终端窗口
xfel spinor write 0x0 yuzukineko-rustsbi-asterinas.img
xfel spinor read 0x0 0x6d0000 readback.img

等待写入和回读命令正常结束。回读范围覆盖完整镜像的 0x6d0000 字节(7,143,424 字节)。

计算原始镜像和 readback.img 的 SHA-256,确认两者一致且与 SHA256SUMS 中记录相同。按主机系统选择下面一组命令。

Windows PowerShell:

终端窗口
Get-FileHash -Algorithm SHA256 yuzukineko-rustsbi-asterinas.img
Get-FileHash -Algorithm SHA256 readback.img

Linux:

终端窗口
sha256sum yuzukineko-rustsbi-asterinas.img readback.img

macOS:

终端窗口
shasum -a 256 yuzukineko-rustsbi-asterinas.img readback.img

本包完整镜像的 SHA-256 是:

368b658f93cb921a66c690a1ae26def95fbb500d0098b955695cebb977228cc5

有报错或校验不一致时先解决,再启动。回读一致说明镜像写入正确;系统能否启动、示例能否完成,还需要继续执行后面的验证步骤。

确认串口终端已经打开,松开 FEL 键,在主机终端复位开发板:

终端窗口
xfel reset

随后在串口终端观察启动过程。系统从 SPI NOR 加载镜像并启动,最终进入 BusyBox shell。本包的提示符为 neko:~#,可以在这里输入命令。RustSBI 使用 WARN 级日志,正常启动时看不到它的 INFO 横幅。

在 BusyBox shell 里运行:

终端窗口
/root/run-demos.sh

会依次执行以下九个示例,展示当前移植版本的基本功能:

示例内容
01-system.sh查看系统、架构、内存、运行时间和挂载信息
02-files.sh在 RAM 文件系统中创建、复制和重命名文件
03-pipes.sh通过管道组合排序、筛选和计数命令
04-process.sh创建子进程、等待退出并读取退出状态
05-signals.sh发送和处理信号,继续执行后续操作
06-float.sh浮点数格式化输出
memory-demo匿名内存映射、读写、修改保护属性和解除映射
threads-demo线程调度与同步;两个线程更新同一个计数器
ipc-demo父子进程的私有内存、管道通信与进程回收

运行完成后应看到:

All 9 Asterinas examples completed.

随后返回 shell 提示符。进程示例中的 Collected child exit status: 7 是该示例预设的子进程退出状态,不表示整组示例失败。当前根文件系统位于 RAM,重启后修改不会保留。

其他注意事项:

  • reboot 重启系统。
  • poweroff 停止系统,但板子仍由 USB 供电,并不会切断电源。

仓库 02_Firmware/RustSBI-Asterinas/ 提供以下文件:

文件用途大小(字节)
syterkit-3bf4f61f.bin带 eGON 启动头的 SyterKit;初始化 RAM 并加载后续镜像49,152
rustsbi-0.4.1.binRustSBI 0.4.1,针对 Neko 的 RV32 标量扩展定制,WARN 级日志270,336
asterinas.binAsterinas RV32 内核原始镜像2,762,160
yuzukineko-rustsbi-asterinas.img完整启动镜像:以上三者 + 设备树 + 含 BusyBox 的 initramfs7,143,424
SHA256SUMS以上四个镜像的 SHA-256—
manifest.json来源版本、Flash 布局和验证信息—
licenses/许可证与第三方声明—

前提:板子已经装有本目录的完整镜像。按住 FEL 重新接 USB,先用 version 和 spinor 检查设备。

在这个布局里 Flash 偏移和 RAM 载入地址不同,请使用下面的 NOR 偏移:

组件NOR 偏移本布局预留RAM 载入地址
SyterKit0x00000064 KiB0x00020000
设备树(在完整镜像中)0x010000256 KiB0x40f40000
RustSBI0x050000512 KiB0x40f80000
Asterinas0x0d00005 MiB,到 initramfs 之前0x40000000
initramfs(在完整镜像中)0x5d00001 MiB0x40500000

这些容量限制只针对本镜像布局。自行构建时,还必须保证入口、载入地址、设备树和内存使用相互兼容;不能只看二进制大小。特别是 RustSBI 运行时占用的内存(含 BSS、栈和堆)必须落在它预留的区域内。

按需选择写入命令,替换一个组件不必重写其他组件:

终端窗口
xfel spinor write 0x0 syterkit-3bf4f61f.bin
xfel spinor write 0x50000 rustsbi-0.4.1.bin
xfel spinor write 0xd0000 asterinas.bin

写完后按实际文件大小回读相应范围并校验。例如替换 RustSBI 后:

终端窗口
xfel spinor read 0x50000 0x42000 rustsbi-readback.bin

0x42000 是本包 RustSBI 文件的大小(270,336 字节),其他版本请按实际大小调整长度。回读的 SHA-256 与写入文件一致后,执行 xfel reset。

来自 manifest.json:

组件版本 / 提交备注
SyterKit基于 3bf4f61fNeko SPI NOR 加载器和 Asterinas 交接;并非未修改的上游构建
RustSBI0.4.1(4068e0d0)去色补丁、Neko RV32 标量目标、WARN 日志
Asterinas基于 db0d7958Neko RV32 移植与 BusyBox 集成
BusyBox1.37.0静态 RV32GC ILP32D musl 构建
musl1.2.5

验证日期 2026-09-12,板子为 Yuzuki Neko F101-S3:Flash 回读与镜像 SHA-256 一致;SPI NOR 启动到达 BusyBox shell;九个示例通过。

固件及其第三方软件遵循各自的许可证,仓库的 CC0 声明不适用于它们。四个组件的许可证文本和来源见仓库中的 licenses/README.md。