SBI规范
1. 简介
SBI的全称为Supervisor Binary Interface,是m模式下的服务对上提供的统一接口。比如设置timer、发送核间中断等,这些服务通过SBI接口进行封装,这样运行在s模式下的操作系统就可以在不同的平台上通过SBI这个统一的接口来使用一些底层服务,降低移植工作量,这个设计就有点像x86上的BIOS提供的中断服务,如下图所示。
同时RISCV基金会也提供了一套开源的实现,叫做OpenSBI,目前支持qemu virt、k210等几个riscv平台。RISCV芯片厂商一般也都会提供支持其芯片的OpenSBI移植源码,比如全志D1芯片等。
2. 调用规则
SBI接口通过“ecall”指令发起调用,然后进入m模式处理。SBI通过EID和FID来确定一个唯一的服务,这两个ID都为32位有符号整数。EID全称为SBI extension ID,其作用类似Linux下的系统调用号,表示SBI的某一组服务,如下图所示。
EID的值通过a7来保存。FID的全称为SBI function ID,表示某一组SBI服务中提供的具体功能,比如EID 0x10,FID 0x4 表示获取芯片厂商ID,如下图所示。
FID通过a6来保存,SBI服务调用结果通过a0和a1来返回,a0保存调用的错误码,比如成功还是失败之类,a1用来保存具体的返回值,错误码如下图所示。
3. 使用服务
一般像Linux这样的操作系统都会将SBI调用封装好,并提供相应的函数接口给内核开发者使用,SylixOS也类似,SylixOS通过sbi.h来提供SBI的服务调用接口,如下图所示。
通过这些接口我们可以很方便的使用硬件底层功能,比如想通过串口打印调试,通过“sbi_console_putchar”接口就可以直接输出字符。
评论