在 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,开发板发送 RXPB1UART1 RX,开发板接收 TXGND信号地 GND元件面朝上、USB-C 接口位于顶部时,
PB0、PB1分别在右侧排针第 10、11 行,GND在右侧第 2 行;位置见引脚排布,接线前请对照对应硬件版本的原理图。开发板由 USB 供电,串口适配器只连接上表三根信号线,电源脚留空;使用 3.3 V 逻辑电平。
在串口终端中选择适配器实际对应的串口,设置为 115200 波特、8N1、无流控,并在复位启动系统前打开串口。8N1 表示 8 位数据位、无校验、1 位停止位。主机上的端口号随适配器和电脑而变化,不要固定照抄其他人的端口号。
本包的串口输入对长粘贴字符串比较敏感,可以把终端的发送延时设为约 每字符 20 ms。
刷入完整镜像
Section titled “刷入完整镜像”以下以 xfel 为例。使用 rfel 时,把命令中的 xfel 换成 rfel 即可。
1. 进入 FEL 并识别设备
Section titled “1. 进入 FEL 并识别设备”按住 FEL 键,重新接上 USB 数据线,松开。然后在主机终端检查芯片和 Flash:
xfel versionxfel spinor应识别出 chip ID 0x00193700 的 F101 和 16 MiB Flash。这一步不需要执行 ddr 命令。找不到设备或提示不支持芯片时,先按FEL 常见错误检查工具版本、连接和驱动,再继续刷写。

2. 写入镜像并回读
Section titled “2. 写入镜像并回读”xfel spinor write 0x0 yuzukineko-rustsbi-asterinas.imgxfel spinor read 0x0 0x6d0000 readback.img等待写入和回读命令正常结束。回读范围覆盖完整镜像的 0x6d0000 字节(7,143,424 字节)。
3. 校验回读内容
Section titled “3. 校验回读内容”计算原始镜像和 readback.img 的 SHA-256,确认两者一致且与 SHA256SUMS 中记录相同。按主机系统选择下面一组命令。
Windows PowerShell:
Get-FileHash -Algorithm SHA256 yuzukineko-rustsbi-asterinas.imgGet-FileHash -Algorithm SHA256 readback.imgLinux:
sha256sum yuzukineko-rustsbi-asterinas.img readback.imgmacOS:
shasum -a 256 yuzukineko-rustsbi-asterinas.img readback.img本包完整镜像的 SHA-256 是:
368b658f93cb921a66c690a1ae26def95fbb500d0098b955695cebb977228cc5有报错或校验不一致时先解决,再启动。回读一致说明镜像写入正确;系统能否启动、示例能否完成,还需要继续执行后面的验证步骤。

复位并进入 BusyBox shell
Section titled “复位并进入 BusyBox shell”确认串口终端已经打开,松开 FEL 键,在主机终端复位开发板:
xfel reset随后在串口终端观察启动过程。系统从 SPI NOR 加载镜像并启动,最终进入 BusyBox shell。本包的提示符为 neko:~#,可以在这里输入命令。RustSBI 使用 WARN 级日志,正常启动时看不到它的 INFO 横幅。

运行九个示例
Section titled “运行九个示例”在 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.bin | RustSBI 0.4.1,针对 Neko 的 RV32 标量扩展定制,WARN 级日志 | 270,336 |
asterinas.bin | Asterinas RV32 内核原始镜像 | 2,762,160 |
yuzukineko-rustsbi-asterinas.img | 完整启动镜像:以上三者 + 设备树 + 含 BusyBox 的 initramfs | 7,143,424 |
SHA256SUMS | 以上四个镜像的 SHA-256 | — |
manifest.json | 来源版本、Flash 布局和验证信息 | — |
licenses/ | 许可证与第三方声明 | — |
单独替换某个组件
Section titled “单独替换某个组件”前提:板子已经装有本目录的完整镜像。按住 FEL 重新接 USB,先用 version 和 spinor 检查设备。
在这个布局里 Flash 偏移和 RAM 载入地址不同,请使用下面的 NOR 偏移:
| 组件 | NOR 偏移 | 本布局预留 | RAM 载入地址 |
|---|---|---|---|
| SyterKit | 0x000000 | 64 KiB | 0x00020000 |
| 设备树(在完整镜像中) | 0x010000 | 256 KiB | 0x40f40000 |
| RustSBI | 0x050000 | 512 KiB | 0x40f80000 |
| Asterinas | 0x0d0000 | 5 MiB,到 initramfs 之前 | 0x40000000 |
| initramfs(在完整镜像中) | 0x5d0000 | 1 MiB | 0x40500000 |
这些容量限制只针对本镜像布局。自行构建时,还必须保证入口、载入地址、设备树和内存使用相互兼容;不能只看二进制大小。特别是 RustSBI 运行时占用的内存(含 BSS、栈和堆)必须落在它预留的区域内。
按需选择写入命令,替换一个组件不必重写其他组件:
xfel spinor write 0x0 syterkit-3bf4f61f.binxfel spinor write 0x50000 rustsbi-0.4.1.binxfel spinor write 0xd0000 asterinas.bin写完后按实际文件大小回读相应范围并校验。例如替换 RustSBI 后:
xfel spinor read 0x50000 0x42000 rustsbi-readback.bin0x42000 是本包 RustSBI 文件的大小(270,336 字节),其他版本请按实际大小调整长度。回读的 SHA-256 与写入文件一致后,执行 xfel reset。
来自 manifest.json:
| 组件 | 版本 / 提交 | 备注 |
|---|---|---|
| SyterKit | 基于 3bf4f61f | Neko SPI NOR 加载器和 Asterinas 交接;并非未修改的上游构建 |
| RustSBI | 0.4.1(4068e0d0) | 去色补丁、Neko RV32 标量目标、WARN 日志 |
| Asterinas | 基于 db0d7958 | Neko RV32 移植与 BusyBox 集成 |
| BusyBox | 1.37.0 | 静态 RV32GC ILP32D musl 构建 |
| musl | 1.2.5 |
验证日期 2026-09-12,板子为 Yuzuki Neko F101-S3:Flash 回读与镜像 SHA-256 一致;SPI NOR 启动到达 BusyBox shell;九个示例通过。
固件及其第三方软件遵循各自的许可证,仓库的 CC0 声明不适用于它们。四个组件的许可证文本和来源见仓库中的 licenses/README.md。