2.3 KiB
2.3 KiB
简介
OpenSBI是运行在M态的固件,用以支持H态或S态的程序,如hypervisor、bootloader或通用操作系统。
OpenSBI库用法
OpenSBI提供了两种静态链接库:
-
libsbi.a - 平台无关,实现了SBI规范的接口,由于不包含平台相关的部分,所以必须实现与平台相关的钩子且链接到本库里。
平台支持是通过数据结构
sbi_platform
来实现的,所以必须要提供钩子sbi_platform
的实现。 -
libplatsbi.a - 即包括了libsbi.a,也包括了平台相关的钩子。
使用OpenSBI静态链接库的软件需要使用用OpenSBI相同的编译选项
- -mabi, -march, -mcmodel
调用OpenSBI库函数的约束
- RISC-V的mscratch寄存器必须指向一个有效的OpenSBI scratch space(如一个sbi_scratch结构体)
- RISC-V的sp寄存器必须设置为使每个核都指向不重叠的栈
从调用者的角度来看最重要的函数是sbi_init
和sbi_trap_handler
。在调用sbi_init
和sbi_trap_handler
之前,mstatus和mie寄存器里必须设置中断是无效的。每个核都应该调用一遍sbi_init
函数。sbi_trap_handler
函数用以处理如下中断
- M态计时器中断
- M态软中断
- 非法指令异常
- 未对齐load异常
- 未对齐store异常
- S态ecall异常
- H态ecall异常
编译
libsbi.a
export CROSS_COMPILE=riscv64-unknown-elf- # 交叉编译必须定义环境变量
make # 在build/lib目录可找到编译生成的libsbi.a
make install # 创建install目录,供其它项目使用
libplatsbi.a
make PLATFORM=kendryte/k210 # 在build/platform/kendryte/k210/目录下,libplatsbi.a在lib目录,固件在firmware目录
make PLATFORM=kendryte/k210 intall # 创建install/platform/kendryte/k210/目录,会把对应的lib目录和firmware目录复制过来
添加平台支持
通过实现结构体sbi_platform
来定义平台相关的钩子,这样libsbi.a就可以进行平台相关的操作了。
OpenSBI也提供了可启动的运行时固件,那些固件链接到了libplatsbi.a,保存在install/platform/<platform_subdir>/bin目录下。那些固件用以替代BBL。可以在include/sbi/sbi_platform.h读到关于sbi_platform
和相关APIs的完整信息。