RISC-V 的 SBI,Supervisor Binary Interface, 是 RISC-V 特有的,用于 RISC-V 的引导过程和用于硬件交互。

RustSBI 是 SBI 的一类实现,代码位于:RustSBI

目录结构

Pull 代码下来后,主要关注 libraryprototyper 这两个文件夹。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

看到这样的输出就是引导成功:

file