computer_knowledge_notes/OS/opensbi.md

59 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#### 简介
[OpenSBI](https://github.com/riscv/opensbi.git)是运行在M态的固件用以支持H态或S态的程序如hypervisor、bootloader或通用操作系统。
#### OpenSBI库用法
OpenSBI提供了两种静态链接库
1. libsbi.a - 平台无关实现了SBI规范的接口由于不包含平台相关的部分所以必须实现与平台相关的钩子且链接到本库里。
平台支持是通过数据结构`sbi_platform`来实现的,所以必须要提供钩子`sbi_platform`的实现。
2. libplatsbi.a - 即包括了libsbi.a也包括了平台相关的钩子。
使用OpenSBI静态链接库的软件需要使用用OpenSBI相同的编译选项
- -mabi, -march, -mcmodel
调用OpenSBI库函数的约束
1. RISC-V的mscratch寄存器必须指向一个有效的OpenSBI scratch space(如一个sbi_scratch结构体)
2. RISC-V的sp寄存器必须设置为使每个核都指向不重叠的栈
从调用者的角度来看最重要的函数是`sbi_init`和`sbi_trap_handler`。在调用`sbi_init`和`sbi_trap_handler`之前mstatus和mie寄存器里必须设置中断是无效的。每个核都应该调用一遍`sbi_init`函数。`sbi_trap_handler`函数用以处理如下中断
- M态计时器中断
- M态软中断
- 非法指令异常
- 未对齐load异常
- 未对齐store异常
- 态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的完整信息。