RISC-V 的 SBI,Supervisor Binary Interface, 是 RISC-V 特有的,用于 RISC-V 的引导过程和用于硬件交互。
RustSBI 是 SBI 的一类实现,代码位于:RustSBI。
目录结构
Pull 代码下来后,主要关注 library
和 prototyper
这两个文件夹。library
是用于和 RISC-V 交互的代码,prototyper
是作为引导的部分。
在我们使用 QEMU 启动 RISC-V 内核时,需要这个引导部分。
qemu-system-riscv64 \
-machine virt \
-nographic \
-bios ./rustsbi-qemu.bin \ # SBI 引导
-device loader,file=target/riscv64gc-unknown-none-elf/release/kernel.bin,addr=0x80200000 # 内核
编译
安装所需要的依赖:
cargo install cargo-binutils
sudo apt install u-boot-tools
然后编译:
cargo prototyper
默认会编译成 Dynamic Firmware
,如果要编译成 Jump Firmware
,使用:
cargo prototyper --jump
jump mode
跳转的地址在 prototyper/prototyper/config/default.toml
中配置。
num_hart_max = 8
stack_size_per_hart = 16384 # 16 KiB (16 * 1024)
heap_size = 32768 # 32 KiB (32 * 1024)
page_size = 4096 # 4 KiB
log_level = "INFO"
jump_address = 0x80200000 # this line!!
tlb_flush_limit = 16384 # 16 KiB (page_size * 4)
在上面的配置中我们将跳转地址配置为 0x80200000,这也是我们内核存放的地址,将从这个地方开始执行。
编译好后在 target/riscv64imac-unknown-none-elf/release/
中会有:
- rustsbi-prototyper-jump.elf
- rustsbi-prototyper-jump.bin
分写是 elf 文件和二进制文件,一般我使用的是二进制文件 rustsbi-prototyper-jump.bin
随后启动:
qemu-system-riscv64 \
-machine virt \
-nographic \
-bios /path/to/rustsbi-prototyper-jump.bin \
-device loader,file=/path/to/kernel.bin,addr=0x80200000
看到这样的输出就是引导成功:
这篇文章内容详实,结构清晰,为开发者提供了一个可操作的指南,帮助其在RISC-V生态中通过RustSBI实现内核启动。以下是对文章的分析与建议:
优点与核心理念
实用性强
文章以实践为导向,从代码拉取到最终QEMU启动的每一步都提供了具体的命令和配置示例(如
qemu-system-riscv64
的参数、default.toml
的配置),读者可直接复现操作,降低了入门门槛。这种“手把手”的教学方式适合开发者快速上手。细节覆盖全面
作者不仅描述了基础流程,还区分了
Dynamic Firmware
和Jump Firmware
两种模式,解释了jump_address
与内核地址的关联性。这种对技术细节的深入分析有助于读者理解不同配置的适用场景。可视化辅助
通过附上启动成功的截图,直观展示了最终结果,增强了可信度,并为读者提供了调试时的参考标准。
核心理念明确
文章的核心理念是通过RustSBI实现RISC-V内核的可定制引导。这一理念契合RISC-V社区对灵活性和模块化的需求,尤其适合需要自定义引导流程的开发者。
可改进之处
逻辑链的补充
num_hart_max
(最大HART数量)和stack_size_per_hart
(每个HART的栈大小)的具体设计依据未解释。读者可能需要自行搜索RISC-V多核处理的底层机制,建议补充这些参数与硬件资源分配的关联性。u-boot-tools
的作用仅通过安装命令提及,但未说明其在生成二进制文件中的具体用途(如mkimage
工具的使用场景),建议简要说明其必要性。潜在的逻辑风险
jump_address=0x80200000
,但未提及该地址是否与QEMU的默认内存映射冲突(例如QEMU的virt
机器通常将内核加载到0x80000000
)。若读者使用其他内核或平台,可能需要调整地址,建议增加提示说明。Dynamic Firmware
和Jump Firmware
的对比分析不足。例如,Jump Firmware
更适合直接跳转到内核,而Dynamic Firmware
可能支持更复杂的引导逻辑,建议补充两者的典型用例。可扩展性建议
No such file or directory
错误),建议增加常见错误排查部分,提升实用性。总结与鼓励
文章整体质量较高,为RISC-V开发者提供了一个清晰的实践路径。建议在后续版本中补充技术细节的原理说明,并扩展对底层架构和常见问题的讨论,以增强文章的深度与实用性。作者对RustSBI和QEMU的结合使用展现了良好的技术洞察力,期待看到更多关于RISC-V生态的深入分享!