Skip to content
Luo Jia edited this page Dec 18, 2021 · 15 revisions

欢迎来到RustSBI HiFive Unmatched项目的文档主页!

RustSBI HiFive Unmatched项目旨在为科研、竞赛用途,制造一个HiFive Unmatched平台可用且最小的SBI实现。

快速入门

想要体验RustSBI HiFive Unmatched,准备一台HiFive Unmatched主板、一张已经按要求分区的SD卡。

连接到主板串口。准备一条USB Micro B接口的线缆,把主板背面的“Console”接口连接到调试用的上位机;使用串口控制台程序连接到主板串口,默认波特率为115200,配置为8N1(8个数据比特,无奇偶校验,1个停止位)。注意,即使主板尚未启动,也应能成功连接串口,否则您可能需要检查连线、驱动或者上位机软件设置。

复制这个项目的源码:

git clone [email protected]:rustsbi/rustsbi-hifive-unmatched.git
cd rustsbi-hifive-unmatched

编译并生成SD卡镜像:

cargo image

烧写到SD卡。先把SD卡插到主机上,运行以下的命令:

# 危险!此步骤可能覆盖有用的数据,必须先备份数据再继续
dd if=target/sd-card-partition-2.img of=/dev/sd??

其中/dev/sd??是SD卡第二分区镜像的文件位置。在不同的主机平台下,您可能需要参照对应平台的烧录教程。

把SD卡插到HiFive Unmatched主板上,按压启动按钮,启动主板。您可以从调试主机的串口输出看到以下的信息:

-Boot SPL 2021.07 (Jul 05 2021 - 15:11:28 +0000)
Trying to boot from MMC1
[rustsbi] RustSBI version 0.2.0-alpha.9
[rustsbi] misa: RV64ACDFIMSU
.______       __    __      _______.___________.  _______..______   __
|   _  \     |  |  |  |    /       |           | /       ||   _  \ |  |
|  |_)  |    |  |  |  |   |   (----`---|  |----`|   (----`|  |_)  ||  |
|      /     |  |  |  |    \   \       |  |      \   \    |   _  < |  |
|  |\  \----.|  `--'  |.----)   |      |  |  .----)   |   |  |_)  ||  |
| _| `._____| \______/ |_______/       |__|  |_______/    |______/ |__|

[rustsbi] mideleg: ssoft, stimer, sext (0x222)
[rustsbi] Implementation: RustSBI-HiFive-Unleashed Version 0.1.0
[rustsbi] medeleg: ima, illinsn, bkpt, sma, uecall, ipage, lpage, spage (0xb14d)
[rustsbi] stdout path: serial0
[rustsbi] enter supervisor 0x80200000, opaque register 0x80018898
[rustsbi] misa: RV64ACIMU
[rustsbi-panic] hart 1 panicked at 'unhandled exception: Exception(InstructionFault)! mtval: 80200000, ctx: SupervisorContext { ra: 0, sp: 0, gp: 0, tp: 0, t0: 0, t1: 0, t2: 0, s0: 0, s1: 0, a0: 1, a1: 80018898, a2: 0, a3: 0, a4: 0, a5: 0, a6: 0, a7: 0, s2: 0, s3: 0, s4: 0, s5: 0, s6: 0, s7: 0, s8: 0, s9: 0, s10: 0, s11: 0, t3: 0, t4: 0, t5: 0, t6: 0, mstatus: Mstatus { bits: a00000800 }, mepc: 80200000, machine_stack: 8003a9c8 }', rustsbi-hifive-unmatched\src\runtime.rs:64:18
[rustsbi-panic] hart 0 panicked at 'invalid instruction from machine level, mepc: 0000000080200000, instruction: 0000000003000000, context: SupervisorContext { ra: 0000000000000000, sp: 0000000000000000, gp: 0000000000000000, tp: 0000000000000000, t0: 0000000000000000, t1: 0000000000000000, t2: 0000000000000000, s0: 0000000000000000, s1: 0000000000000000, a0: 0000000000000000, a1: 0000000080018898, a2: 0000000000000000, a3: 0000000000000000, a4: 0000000000000000, a5: 0000000000000000, a6: 0000000000000000, a7: 0000000000000000, s2: 0000000000000000, s3: 0000000000000000, s4: 0000000000000000, s5: 0000000000000000, s6: 0000000000000000, s7: 0000000000000000, s8: 0000000000000000, s9: 0000000000000000, s10: 0000000000000000, s11: 0000000000000000, t3: 0000000000000000, t4: 0000000000000000, t5: 0000000000000000, t6: 0000000000000000, mstatus: Mstatus { bits: 0000000200001800 }, mepc: 0000000080200000, machine_stack: 00000000800369c8 }', rustsbi-hifive-unmatched\src\execute.rs:75:5
[rustsbi-panic] hart 2 panicked at 'unhandled exception: Exception(InstructionFault)! mtval: 80200000, ctx: SupervisorContext { ra: 0, sp: 0, gp: 0, tp: 0, t0: 0, t1: 0, t2: 0, s0: 0, s1: 0, a0: 2, a1: 80018898, a2: 0, a3: 0, a4: 0, a5: 0, a6: 0, a7: 0, s2: 0, s3: 0, s4: 0, s5: 0, s6: 0, s7: 0, s8: 0, s9: 0, s10: 0, s11: 0, t3: 0, t4: 0, t5: 0, t6: 0, mstatus: Mstatus { bits: a00000800 }, mepc: 80200000, machine_stack: 8003e9c8 }', rustsbi-hifive-unmatched\src\runtime.rs:64:18
[rustsbi-panic] hart 3 panicked at 'unhandled exception: Exception(InstructionFault)! mtval: 80200000, ctx: SupervisorContext { ra: 0, sp: 0, gp: 0, tp: 0, t0: 0, t1: 0, t2: 0, s0: 0, s1: 0, a0: 3, a1: 80018898, a2: 0, a3: 0, a4: 0, a5: 0, a6: 0, a7: 0, s2: 0, s3: 0, s4: 0, s5: 0, s6: 0, s7: 0, s8: 0, s9: 0, s10: 0, s11: 0, t3: 0, t4: 0, t5: 0, t6: 0, mstatus: Mstatus { bits: a00000800 }, mepc: 80200000, machine_stack: 800429c8 }', rustsbi-hifive-unmatched\src\runtime.rs:64:18
[rustsbi-panic] hart 4 panicked at 'unhandled exception: Exception(InstructionFault)! mtval: 80200000, ctx: SupervisorContext { ra: 0, sp: 0, gp: 0, tp: 0, t0: 0, t1: 0, t2: 0, s0: 0, s1: 0, a0: 4, a1: 80018898, a2: 0, a3: 0, a4: 0, a5: 0, a6: 0, a7: 0, s2: 0, s3: 0, s4: 0, s5: 0, s6: 0, s7: 0, s8: 0, s9: 0, s10: 0, s11: 0, t3: 0, t4: 0, t5: 0, t6: 0, mstatus: Mstatus { bits: a00000800 }, mepc: 80200000, machine_stack: 800469c8 }', rustsbi-hifive-unmatched\src\runtime.rs:64:18

出现这些Panic是正常的,因为你的镜像只加载了RustSBI,并没有加载可用的操作系统内核。

您会发现,从第0个管理核,到第1-4个应用核,都成功进入了RustSBI程序,这就说明RustSBI运行成功了。

在测试完毕后,长按主板上的启动按钮,可以关闭RustSBI程序。

进一步阅读

源码清单

项目源码分为以下需要注意的文件夹:

  • 源码目录(rustsbi-hifive-unmatched)
  • 编译辅助程序(xtask)
  • 测试用内核(test-kernel)

源码目录是RustSBI在HiFive Unmatched平台下的具体实现。如果你需要详细阅读RustSBI在本平台的实现,您需要参阅源码目录。如果您需要为RustSBI在本平台的实现增加更多的功能,通常您主要在源码目录中添加或修改Rust代码。

编译辅助程序帮助您编译和打包RustSBI HiFive Unmatched项目。这个项目应当在SD卡或其它存储介质上运行,使用编译辅助程序,您可以方便地在编译后输出需要的文件格式,包括bin格式的二进制文件,以及img格式的SD卡分区镜像。注意到.cargo/config目录,通常您需要通过cargo命令来使用编译辅助程序。

测试用内核是RustSBI实现本身的单元测试程序,它的设计是为了在内核层面检查RustSBI实现是否符合RISC-V SBI标准。它不是为了实际的操作系统运行而设计的。这个内核的原理是,调用RISC-V SBI标准要求的所有API,来检查RustSBI实现功能的正确性和完整性。如果您修改了源码目录,可以使用这个内核来检验你的修改。