-
Notifications
You must be signed in to change notification settings - Fork 7
Home
欢迎来到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 git@github.com: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程序。
- 《使用xtask程序生成RustSBI镜像》描述了xtask辅助程序一些其它的使用方法。
- 《不同平台的SD卡烧录教程》给出了一些SD卡硬件操作的步骤,如果您选择在Windows下开发,这篇文章或许会有帮助。
- 《U740 SoC的S7核使用LR SC指令时可能出现的问题》记录了在Unmatched平台上管理核执行原子指令时可能出现的情况,如果您在为操作系统或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实现功能的正确性和完整性。如果您修改了源码目录,可以使用这个内核来检验你的修改。