「RISC-V Arch」SBI 规范解读(上)

news/2024/4/23 17:06:02/文章来源:https://blog.csdn.net/BillyThe/article/details/129195552

术语


SBI,Supervisor Binary Interface,管理二进制接口

U-Mode,User mode,用户模式

S-Mode,Supervisor mode,监督模式

VS-Mode,Virtualization Supervisor mode,虚拟机监督模式

M-Mode,Machine mode,机器模式,类似 ARM 的 EL3

HS-Mode,Hypervisor mode,管理模式,类似 ARM 的 EL2

SEE, Supervisor Execution Environment ,监督执行环境

规范修正历史


Version 1.0.0

•发布前更新版本

Version 1.0-rc3

•更新调用规约

•修正 PMU 一个类型

•增加缩写表

Version 1.0-rc2

•更新 RISC-V 格式

•提升指令

•删除 RV32 的参考

Version 1.0-rc1

•一个类型修改

Version 0.3.0

•一些类型修改

•更新 license 详细信息,取代超链接方式

Version 0.3-rc1

•改善文档风格和命名方式

•添加 SBI 系统复位支持

•改善 SBI 指令部分

•改善 SBI hart 状态管理的文档

•SBI hart 状态管理添加 suspend 功能

•增加性能监视器单元扩展

•澄清 SBI 不能是部分实现的

Version 0.2

•将 v0.1 放到 lagency 部分以达到向前兼容,比如 v0.1 不支持 probe。

第一章 介绍


这个规范描述了 RISC-V 超级二进制接口,即SBI,通过 SBI 接口, RISC-V 能够实现 S 模式、VS 模式代码能够在不同的平台之间的可移植性。SBI 遵循了 RISC-V 的设计哲学,由一个非常小的核心部分和一些可选的模块扩展组成。

SBI 整体来说是一个扩展,也就是说要不实现,要么就要完整实现。如果 sbi_probe_extention 指示出某个功能可用,那么所有版本要求的功能都需要实现,这个版本可以通过 sbi_get_spec_version 来获得。

高特权软件向管理模式提供 SBI 接口支持,这个软件可以叫做 SBI 实现或者 SEE。SEE 可以是图1中的 M 模式下运行时固件,也可以是图2 中的 HS 模式运行的虚拟机管理程序。

图1 无虚拟化扩展 RISC-V 系统

图2 有虚拟化扩展的 RISC-V 系统

 SBI 规范不会指定任何硬件发现的方法,S 模式软件必须通过其他工业标准来获取,比如 Device Tree 或者 ACPI。

第二章 规范中的术语和缩写


 第三章 二进制编码


所有的 SBI 功能/函数都共享同样的二进制编码,混合了各种 SBI 扩展。SBI 规范遵循下面的调用规约:

  • ECALL 用做 supervisor 和 SEE 之间的控制传输指令;
  • a7 是编码的 SBI 扩展 ID (EID);
  • a6 是编码的是 EID 中具体的 SBI 函数 ID (FID),由 SBI v0.2 定义;
  • 除了 a0 和 a1寄存器以外,其他寄存器必须由被调用者保存
  • SBI 函数必须在 a0 和 a1 中返回一对数值,a0 是返回的错误码,a1 是数据,和如下 C 结构体类似
struct sbiret {long error;long value;};

 为了命名的兼容性,SBI EID 和 FID 都采用 32 位的寄存器,在寄存器传输时,符合上面的调用规约。

表1 提供了标准的 SBI 错误码

表1 SBI 标准错误码

 使用 ECALL 时,如果 EID 或 FID 不支持,那么必须返回错误码 SBI_ERR_NOT_SUPPORTED。

每一个 SBI 函数应该首选 unsigned long 作为数据类型。这会使得规范简单并且容易被 RISC-V ISA 类型接受。这种情况下数据被定义为 32位宽,高特权软件必须保证其只使用 32位 数据。

如果 SBI 函数想要给高特权模式传递一个 harts 列表,那么必须使用下面的 hart 掩码。这个适用于 v0.2及以后的版本。

任何需要一个 hart 掩码的函数,不要传递下面两个参数:

  • unsigned long hart_mask,一个包含了hart id的标量位向量
  • unsigned long hart_mask_base,一个位向量中必须进行计算的 hart id 起始位置

在一个 SBI 函数调用中,最大的 hart 数通过 XLEN 设置,如果低特权级别想要传输更多关于 XLEN 的信息,那么就需要调用多个 SBI 函数调用实例,hart_mask_base 能够设置为 -1 来指示 可以忽略 hart_mask,需要考虑所有可用的 hart。

任何一个使用 hart 掩码的函数可能会返回下表中的错误码,这些错误码是函数特定的错误码。

表2 HART 掩码错误

 第四章 基础扩展(EID #0x10)


基础扩展已经是尽可能的最小化了,因此基础扩展只包含了获得 SBI 扩展集及其版本的一些功能。SBI 实现必须实现所有基础扩展中的函数,也就是说不能返回任何错误码。

4.1 函数:获取 SBI 标准版本(FID #0)

struct sbiret sbi_get_spec_version(void);

返回当前 SBI 规范版本,这个函数必须总是成功的,最高位为 0 预留,24~30 共 7 位为主版本号,0~23 共 24 位为次版本号。 

4.2 函数:获取 SBI 实现 ID (FID #1)

struct sbiret sbi_get_impl_id(void);

返回当前 SBI 实现 ID,每个实现都具有不同的 SBI ID,可以通过这个 ID 来探测实现支持的扩展情况。 

4.3 函数:获取 SBI 实现版本 (FID #2)

struct sbiret sbi_get_impl_version(void);

返回当前 SBI 实现的版本号,版本号的编码格式由 SBI 实现来定义。

4.4 函数:探测 SBI 扩展 (FID #3)

struct sbiret sbi_probe_extension(long extension_id);

如果给定扩展 ID 不存在则返回 0,否则返回 1,当然实现也可以根据需要再定义一些其他值。 

4.5 函数:获取机器供应商 ID (FID #4)

struct sbiret sbi_get_mvendorid(void);

返回一个合法的 mvendorid CSR 值,0 是合法的 CSR 值。 

4.6 函数:获取机器架构 ID (FID #5)

struct sbiret sbi_get_marchid(void);

返回一个合法的 marchid CSR 的值,0 是合法的 CSR 值。 

4.7 函数:获取机器实现 ID (FID #6)

struct sbiret sbi_get_mimpid(void);

返回一个合法的 mimpid CSR,0 是合法的 CSR 值。 

4.8 函数列表

表3 基础函数列表

 4.9 SBI 实现 IDs

表4 SBI 实现 IDs

 第五章 遗留扩展(EIDs #0x00 - 0x0F)


遗留 SBI 扩展和 SBI v0.2及以上规范的扩展的调用规约有点不同:

  • 遗留扩展忽略了 a6 寄存器中的 SBI FID,因为他们会被编码成多个 SBI EID
  • a1 寄存器不返回任何数值
  • 调用者在 SBI 调用过程中需要保存除 a0 以外的所有寄存器
  • a0 寄存器返回的数值是由具体遗留扩展来定义的

SBI 实现在代替 S 模式访问内存时发生的页和访问故障,会通过 sepc CSR 重定向回 S 模式,并指出出错的 ECALL 指令。

遗留的 SBI 扩展已经被废弃,取而代之的时后面列出来的扩展,而遗留的控制台 console SBI 函数sbi_console_getchar() 、sbi_console_putchar()也被废弃了,它们是没有替代函数的。

5.1 扩展:设置定时器(EID #0x00)

long sbi_set_timer(uint64_t stime_value)

设置 stime_value 时间后的闹钟事件,这个函数回清除定时器的中断标志 pending bit。

如果 S 模式想清除中断并且不想继续处理定时器事件,可以通过设置参数为 -1 或者 清除 sie.SITE CSR 寄存器来实现。

SBI 调用成功时返回 0,失败时返回实现定义的负数错误码。 

5.2 扩展:控制台输出(EID #0x01)

long sbi_console_putchar(int ch)

 将 ch 中的字符写到调试控制台,和sbi_console_getchar()不同,SBI 调用在控制台不为空时会阻塞,或者如果控制台没有准备好接收数据时也会阻塞。如果控制台本身不存在,则字符会被直接丢弃。

SBI 调用成功时返回 0,失败时返回实现定义的负数错误码。 

5.3 扩展:控制台输入(EID #0x02)

long sbi_console_getchar(void)

从调试控制台读取一个字符。

SBI 调用成功时会返回一个字符,失败时返回 -1。 

5.4 扩展:清除 IPI(EID #0x03)

long sbi_clear_ipi(void)

 清除 Pending 的 IPI,IPI 只有在调用该函数时才会被清除,这个接口已经废弃了,因为 S 模式可以直接通过 sip.SSIP CSR 位来清除 IPI。

如果没有需要清除的 IPI,则返回 0,否则返回正数来表示有 IPI 在等待,这个数值由实现定义。

5.5 扩展:发送 IPI(EID #0x04)

long sbi_send_ipi(const unsigned long *hart_mask)

发送核间中断给 hart_mask 中定义的 hart。核间中断在接收端显示为 S 模式的软件中断。

hart_mask 是一个指向接收点的虚拟地址位图,这个位图由无符号长整形序列表示。 

5.6 扩展:Remote FENCE.I(EID #0x05)

long sbi_remote_fence_i(const unsigned long *hart_mask)

让指远端执行 FENCE.I 指令,位图和发送 IPI 的位图定义相同。

成功时返回 0,失败时返回负数由实现定义的值。

5.7 扩展:Remote SFENCE.VMA(EID #0x06)

long sbi_remote_sfence_vma(const unsigned long *hart_mask,                           unsigned long start,                           unsigned long size)

让指远端执行 FENCE.VMA 指令,覆盖虚拟地址指定的范围。

成功时返回 0,失败时返回负数由实现定义的值。

5.8 扩展:Remote SFENCE.VMA 使用 ASID(EID #0x07)

long sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,                                                                                        unsigned long start,                                unsigned long size,                                unsigned long asid)

让指远端执行 FENCE.VMA 指令,覆盖虚拟地址指定的范围和指定的 ASID。

成功时返回 0,失败时返回负数由实现定义的值。

5.9 扩展:系统关机(EID #0x08)

void sbi_shutdown(void)

将所有远端设置位关机状态(从 S 模式视角来看)。

SBI 调用不返回任何能够指定成功或失败的值。 

5.10 函数列表

表5 遗留函数列表

皮格马利翁效应心理学指出,赞美、赞同能够产生奇迹,越具体,效果越好~

“收藏夹吃灰”是学“器”练“术”非常聪明的方法,帮助我们避免日常低效的勤奋~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73688.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电商共享购模式,消费增值返利,app开发

在当今以市场需求为主导的数字经济时代,消费者需求呈现出精细化管理和多元化的特性,目标市场日渐完善,另外在大数据技术迅速进步和运用的驱动下,总体行业的发展节奏感也在不断加速。因而,企业需要建立一套灵活多变的经…

HyperGBM用Adversarial Validation解决数据漂移问题

本文作者:杨健,九章云极 DataCanvas 主任架构师 数据漂移问题近年在机器学习领域来越来越得到关注,成为机器学习模型在实际投产中面对的一个主要挑战。当数据的分布随着时间推移逐渐发生变化,需要预测的数据和用于训练的数据分布…

格雷码的实现

格雷码:任意两个相邻的二进制数之间只有一位不同 想必通信专业的学生应该都接触过格雷码,它出现在数电、通信原理等课程里。 如下图所示一个四位格雷码是什么样子的: 格雷码的特点: 其最大的特点是任意上下相邻的两个码值间&am…

线性数据结构:数组 Array

一、前言数组是数据结构还是数据类型?数组只是个名称,它可以描述一组操作,也可以命名这组操作。数组的数据操作,是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数组,而是说&#xff0c…

内网渗透(五十六)之域控安全和跨域攻击-非约束委派攻击

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

Linux下java服务占用cpu过高如何处理

Linux下java服务占用cpu过高如何处理 top命令查看进程信息 top按下shiftp,按cpu使用率排行,可见进程1932占用最高,并且是一个java服务 使用jps命令确认java服务 [rootVM-16-16-centos ~]# jps 1011 Jps 9462 yuan_back-0.0.1-SNAPSHOT.jar 1932 spigot-1.18.jar查找异常进程中…

利用关联来发现复杂攻击模式

日志是网络活动的重要依据,包含了关于您网络上所有用户和系统活动的详尽信息。基本日志分析可帮助您轻松地对数百万个日志进行分类,并挑选出可以表明存在可疑活动的日志,识别与正常网络活动不符的异常日志。通常,单独查看某个日志…

GCC:从源文件到可执行文件

GCC&#xff1a;从源文件到可执行文件 假设我们有hello.c 文件 #include <stdio.h> int main(){printf("hello world!\n");return 0; }怎么在linux上利用GCC命令生产可执行文件&#xff08;单文件编译&#xff09;呢&#xff1f; 一、流程 C文件从源文件到…

5.35 综合案例2.0 -称重数据上传云端

综合案例2.0 - 称重数据上传云端案例说明连线功能实现1.阿里云平台连接代码应用开发3.1新建‘普通项目’3.2关联产品和设备3.3新建‘移动应用’3.4添加组件3.5配置组件信息3.6保存预览案例说明 使用hx711串口模块称重,结合IOT studio制作手机APP远程控制并采集物体重量。 hx7…

称重传感器差分输入信号隔离转换直流放大变送器0-±10mV/0-±20mV转0-10V/4-20mA

主要特性DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源&#xff0c;向输入端和输出…

Oracle——物化视图

文章目录含义物化视图的语法物化视图的创建1、自动刷新的物化事务 ON COMMIT2、非自动刷新的物化视图 ON demand关于手动刷新物化视图的删除资料参考含义 什么是物化视图&#xff1f; 物化视图&#xff0c;通俗点说就是物理化的视图。 什么叫物理化&#xff1f; 将视图以表结构…

可怕,chatGPT用3小时教会我数据分析

chatGPT这玩意真的是我的救星,用它作为我的Python教练,我用三个小时学会了数据处理(Pandas)和绘图(matplotlib)。 这两个库的学习,在之前已经困扰了我7个月。之前卡壳的原因,是我一直没有耐心从零开始,按照教材设置的教程去学习Python——我擅长在项目中学习,一点一点…

SpringMVC框架知识详解(入门版)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

「RISC-V Arch」SBI 规范解读(下)

第六章 定时器扩展&#xff08;EID #0x54494D45"TIME"&#xff09; 这个定时器扩展取代了遗留定时器扩展&#xff08;EID #0x00&#xff09;&#xff0c;并遵循 v0.2 中定义的调用规约。 6.1 函数&#xff1a;设置定时器&#xff08;FID #0&#xff09; struct sbi…

TensorFlow-Keras - FM、WideAndDeep、DeepFM、DeepFwFM、DeepFmFM 理论与实战

目录 一.引言 二.浅层模型概述 1.LR 2.FM 3.FMM 4.FwFM 5.FmFM 三.常用推荐算法实现 Pre.数据准备 1.FM 2.WideAndDeep 3.DeepFM 4.DeepFwFM 5.DeepFmFM 四.总结 1.函数测试 2.函数效果与复杂度对比[来自FmFM论文] 3.More 一.引言 推荐系统中常见的 CTR 模型…

梯度下降优化器:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam -> AdamW

目录 1 前言 2 梯度概念 3 一般梯度下降法 4 BGD 5 SGD 6 MBGD 7 Momentum 8 SGDM&#xff08;SGD with momentum&#xff09; 9 NAG(Nesterov Accelerated Gradient) 10 AdaGrad 11 RMSProp 12 Adadelta 13 Adam 13 Nadam 14 AdamW 15 Lion&#xff08;EvoLve…

【C++进阶】一些小知识点

const限定符 用const给字面常量起个名字&#xff08;标识符&#xff09;&#xff0c;这个标识符就称为标识符常量&#xff1b;因为标识符常量的声明和使用形式很像变量&#xff0c;所以也称常变量。声明方式&#xff1a; const int a 77; const float PI 3.14159f&#xff…

算法设计与分析期末考试复习(二)

分治法 将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问题&#xff0c;以便各个击破&#xff0c;分而治之。最好使子问题的规模大致相同。 分解&#xff08;Divide&#xff09;&#xff1a;将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的子…

【拿好了!Linux 运维必备的 13 款实用工具!】

​本文介绍几款 Linux 运维比较实用的工具&#xff0c;希望对 Linux 运维人员有所帮助。 查看进程占用带宽情况 – Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载&#xff1a; http://sourceforge.net/projects/nethogs/files/ne…

ZYNQ双核处理器独立运行AMP

一、简介多核处理器从多核的结构上是否一致&#xff0c;分为两种基本架构&#xff1a;同构多核架构和异构多核架构。同构多核处理器是指系统中的处理器在结构上是相同的&#xff1b;而异构处理器是指系统中的处理器在结构上是不同的&#xff0c;这些处理器可以是通用处理器&…