当前位置: 首页 > news >正文

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

术语


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 遗留函数列表

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

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

相关文章:

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

术语 SBI,Supervisor Binary Interface,管理二进制接口 U-Mode,User mode,用户模式 S-Mode,Supervisor mode,监督模式 VS-Mode,Virtualization Supervisor mode,虚拟机监督模式 …...

2023年全国最新二级建造师精选真题及答案5

百分百题库提供二级建造师考试试题、二建考试预测题、二级建造师考试真题、二建证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 51.下列国有资金占控股或者主导地位的依法必须进行招标的项目,可以采取邀请招标的…...

365智能云打印怎么样?365小票无线订单打印机好用吗?

365智能云打印怎么样?365智能云打印是有赞官方首推的订单小票打印机,荣获2016年有赞最佳硬件服务商。可以实现远程云打印,无需连接电脑,只需通过GPRS流量或者WIFI即可连接,不受地理位置和距离限制。365小票无线订单打印…...

细说react源码中的合成事件

最近在做一个功能,然后不小心踩到了 React 合成事件 的坑,好奇心的驱使,去看了 React 官网合成事件 的解释,这不看不知道,一看吓一跳… SyntheticEvent是个什么鬼?咋冒出来了个事件池? 我就一…...

【架构师】零基础到精通——架构演进

博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小留言…...

Hadoop命令大全

HDFS分布式文件系统 , 将一个大的文件拆分成多个小文件存储在多台服务器中 文件系统: 目录结构(树状结构) "/" 树根, 目录结构在namenode中维护 目录 1.查看当前目录 2.创建多级目录 3.上传文件 4.查…...

一文带你快速初步了解云计算与大数据

目录 🔍一、云计算基础 1、云计算的概念、特点、关键技术 2、云计算的分类 3、云计算的部署模式 4、云计算的服务模式:IaaS、PaaS、SaaS分别是什么,具体含义要清楚 5、物联网的概念 6、物联网和云计算、大数据的关系 7、了解云计算的…...

STM32 OTA应用开发——通过USB实现OTA升级

STM32 OTA应用开发——通过USB实现OTA升级 目录STM32 OTA应用开发——通过USB实现OTA升级前言1 环境搭建2 功能描述3 BootLoader的制作4 APP的制作5 烧录下载配置6 运行测试结束语前言 什么是OTA? 百度百科:空中下载技术(Over-the-Air Techn…...

JavaScript高级程序设计读书分享之6章——6.2Array

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 除了 Object,Array 应该就是 ECMAScript 中最常用的类型了。 创建数组 使用 Array 构造函数 在使用 Array 构造函数时,也可以省略 new 操作符。 let colors new Array() let …...

MySQL递归查询 三种实现方式

1 建表脚本1.1 建表DROP TABLE IF EXISTS sys_region; CREATE TABLE sys_region (id int(50) NOT NULL AUTO_INCREMENT COMMENT 地区主键编号,name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 地区名称,short_name varchar(50) CHARA…...

Servle笔记(7):过滤器

1、过滤器的作用与目的 过滤器的目的 在客户端的请求访问后端资源之前,拦截请求在服务器的响应发送回客户端之前,处理响应 2、过滤器的类型 身份验证过滤器(Authentication Filters)数据压缩过滤器(Data compressio…...

2023年:我成了半个外包

边线业务与主线角色被困外包; 012022年,最后一个工作日,裁员的小刀再次挥下; 商务区楼下又多了几个落寞的身影,办公室内又多了几头暴躁的灵魂; 随着裁员的结束,部门的人员结构简化到了极致&am…...

HTTP中GET与POST方法的区别

1. HTTP HTTP即超文本传输协议(Hyper Text Transfer Protocol),是因特网上应用最广的一种协议。 设计目的:保证客户端与服务器之间的通信(发布和接受HTML页面);工作方式:客户端-服务器端的请求-应答协议 …...

使用ChatGPT需要避免的8个错误

如果ChatGPT是未来世界为每个登上新大陆人发放的一把AK47, 那么现在大多数人做的事,就是突突突一阵扫射, 不管也不知道有没有扫射到自己想要的目标。每个人都在使用 ChatGPT。但几乎每个人都停留在新手模式。 避免下面常见的8个ChatGPT的错…...

ELK日志分析--Kibana

Kibana 概述 部署安装浏览页面并使用 1.Kibana 概述 Kibana-是进入Elastic的窗口使用Kibana,可以 1 搜索,观察和保护。 从发现文档到分析日志再到发现安全漏洞,Kibana是您访问这些功能及其他功能的门户。 2 可视化和分析您的数据。 搜索隐藏的…...

PPP点到点协议认证之PAP认证

PPP点到点协议认证之PAP认证 需求 如图配置接口的IP地址将R1配置为认证端,用户名和密码是 huawei/hcie ,使用的认证方式是pap确保R1和R2之间可以互相ping通 拓扑图 配置思路 确保接口使用协议是PPP确保接口的IP地址配置正确在R1 的端口上&#xff0c…...

设计模式之建造者模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、建造者模式是什么? 建造者模式是一种创建型的软件设计模式,用于构造相对复杂的对象。 建造者模式可以…...

linux常见的系统日志

我们了解一下常见的系统日志,知道哪些需要收集 1. /var/log/boot.log linux中/var/log/boot.log是系统启动时的日志,其包括自启动服务。 2. /var/log/btmp linux中/var/log/btmp是记录登录失败信息的日志,是一种非文本文件,可以使…...

支付系统中的设计模式09:组合模式

现在就剩下怎么能够实现运营部提出的「打印出平台顾客购买的商品小票」这个需求了。 我们去超市买完东西之后,都会收到收银员打印出来的小票,就是商品清单、价格、数量和汇总的信息。下面这个我想应该99%的人都见过吧。 图三十七:超市购物小票 线上也是一样,也会有这种购物…...

Linux 文件权限之umask

目录一、文件默认创建权限二、文件默认创建权限掩码三、文件权限的修改本文主要讲解Linux中的文件默认创建权限相关的内容,涉及到的内容有:文件默认创建权限、文件默认创建权限掩码、文件访问权限的修改。 文件访问者共三类:文件所有者、文件…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层&#xf…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

DBLP数据库是什么?

DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...