特权层二进制接口

特权层二进制接口RISC-V架构下引导程序环境的规范[1]。它提供了特权层的运行环境,使得特权层软件能使用环境调用指令,来执行平台相关的操作。典型的的特权层接口应用有:一、类似于Unix的操作系统中,机器级和特权级的访问接口;二、监视特权级和虚拟特权级中,作为虚拟化环境的调用接口。

特权层二进制接口
开发者RISC-V Unix工作组
首次发布2018年5月26日
当前版本1.0.0(2022年3月23日)
预览版本1.0-rc3(2022年3月16日)
平台RISC-V
许可协议CC-BY-4.0
网站GitHub

特权层二进制接口的全文收录于此链接页面存档备份,存于互联网档案馆)。

功能模块

特权层接口规范[2]定义了以下的模块。

  • 基础模块:包含探测支持的SBI功能、得到SBI版本和得到机器版本等部分;
  • 时钟中断模块:设置下一个时钟中断的发生时间;
  • 跨核软中断模块:发送跨处理核的软件中断;
  • 远程栅栏模块:跨处理核发送栅栏指令,包括指令栅栏、内存映射栅栏和虚拟机栅栏指令等;
  • 核状态模块:启动、停止和暂停一个处理核,以及读取处理核的当前状态;
  • 复位模块:重启或关闭系统。

其中,基础模块是必须要求实现的模块,其它模块都是可选实现的模块。

旧扩展模块

当特权层接口规范支持陈旧扩展时,包含以下的模块。

  • 旧扩展模块:包含控制台输入输出等。

旧扩展模块的大多数功能,都在新的功能模块中有替代选项。如果可能,尽量使用分别列出的新版功能模块。

预留模块部分

这些模块包括实验性模块、制造商定义模块和固件定义模块。

特权层接口规范为制造商预留了定义功能模块的空间,通常上,这些空间可以与mvendorid寄存器的内容对应。 每个特权层接口实现编号,都可以拥有自己的固件定义模块,这部分实现根据不同的具体固件而不同。

使用预留模块时需要注意:并非所有的SBI实现、制造商都提供此类模块和它的函数。操作系统软件需要结合特定的特权层接口实现,编写预留模块的支持部分。

软件实现

目前流行的特权层接口实现软件实现有以下几种。

  • 伯克利引导程序(BBL)
  • OpenSBI[3]
  • Xvisor
  • KVM
  • RustSBI[4]
  • Diosix[5]
  • Coffer[6]

参考文献

  1. ^ RISC-V Community. RISC-V SBI 的GitHub仓库. [2021-06-04]. (原始内容存档于2021-03-09). 
  2. ^ RISC-V Community. RISC-V SBI 规范正文. [2021-06-04]. (原始内容存档于2021-03-06). 
  3. ^ OpenSBI GitHub. [2021-06-04]. (原始内容存档于2021-07-20). 
  4. ^ RustSBI GitHub. 
  5. ^ Diosix GitHub. [2021-06-04]. (原始内容存档于2020-11-11). 
  6. ^ Coffer GitHub. [2022-04-01]. (原始内容存档于2022-04-01).