【RISC-V】RISC-V寄存器
一、通用寄存器
32位RISC-V体系结构提供32个32位的整型通用寄存器
| 寄存器 | 别名 | 全称 | 说明 |
|---|---|---|---|
| X0 | zero | 零寄存器 | 可做源寄存器(rs)或目标寄存器(rd) |
| X1 | ra | 链接寄存器 | 保存函数返回地址 |
| X2 | sp | 栈指针寄存器 | 指向栈的地址 |
| X3 | gp | 全局寄存器 | 用于链接器松弛优化 |
| X4 | tp | 线程寄存器 | 常用于在OS中保存指向进程控制块(task_struct)数据结构的指针 |
| X5 ~ X7 X28 ~ X31 | t0 ~ t6 | 临时寄存器 | |
| X8 | s0/fp | 帧指针寄存器 | 用于函数调用,被调用函数需保存数据 |
| X9 | s1 | 用于函数调用 ,被调用函数需要保存的数据 | |
| X10 ~ X17 | a0 ~ a7 | 用于函数调用,传递参数和返回值 | |
| X18 ~ X27 | s2 ~ s11 | 用于函数调用 ,被调用函数需要保存的数据 |
二、系统寄存器
系统控制状态寄存器(CSR)。

CSR地址空间映射:
| 地址范围 | bit[11:10] | bit[9:8] | bit[7:4] | 访问模式 | 访问权限 |
|---|---|---|---|---|---|
| 0x000 ~ 0x0FF | 00 | 00 | xxxx | U | RW |
| 0x400 ~ 0x4FF | 01 | 00 | xxxx | U | RW |
| 0x800 ~ 0x8FF | 10 | 00 | xxxx | U | RW(用户自定义系统寄存器) |
| 0xC00 ~ 0xC7F | 11 | 00 | 0xxx | U | RO |
| 0xC80 ~ 0xCBF | 11 | 00 | 10xx | U | RO |
| 0xCC0 ~ 0xCFF | 11 | 00 | 11xx | U | RO |
| 0x100 ~ 0x1FF | 00 | 01 | xxxx | S | RW |
| 0x500 ~ 0x57F | 01 | 01 | 0xxx | S | RW |
| 0x580 ~ 0x5BF | 01 | 01 | 10xx | S | RW |
| 0x5C0 ~ 0x5FF | 01 | 01 | 11xx | S | RW(用户自定义系统寄存器) |
| 0x900 ~ 0x97F | 10 | 01 | 0xxx | S | RW |
| 0x980 ~ 0x9BF | 10 | 01 | 10xx | S | RW |
| 0x9C0 ~ 0x9FF | 10 | 01 | 11xx | S | RW(用户自定义系统寄存器) |
| 0xD00 ~ 0xD7F | 11 | 01 | 0xxx | S | RO |
| 0xD80 ~ 0xDBF | 11 | 01 | 10xx | S | RO |
| 0xDC0 ~ 0xDFF | 11 | 01 | 11xx | S | RO(用户自定义系统寄存器) |
| 0x300 ~ 0x3FF | 00 | 11 | xxxx | M | RW |
| 0x700 ~ 0x77F | 01 | 11 | 0xxx | M | RW |
| 0x780 ~ 0x79F | 10 | 11 | 100x | M | RW |
| 0x7A0 ~ 0x7AF | 01 | 11 | 1010 | M | RW(用于调试寄存器) |
| 0x7B0 ~ 0x7BF | 01 | 11 | 1011 | M | RW(只能用于调试寄存器) |
| 0x7C0 ~ 0x7FF | 01 | 11 | 11xx | M | RW(用户自定义系统寄存器) |
| 0xB00 ~ 0xB7F | 10 | 11 | 0xxx | M | RW |
| 0xB80 ~ 0xBBF | 10 | 11 | 10xx | M | RW |
| 0xBC0 ~ 0xBFF | 10 | 11 | 11xx | M | RW(用户自定义系统寄存器) |
| 0xF00 ~ 0xF7F | 11 | 11 | 0xxx | M | RO |
| 0xF80 ~ 0xFBF | 11 | 11 | 10xx | M | RO |
| 0xFC0 ~ 0xFFF | 11 | 11 | 11xx | M | RO(用户自定义系统寄存器) |
- 出发非法指令异常的行为:
- 访问不存在或未实现的寄存器;
- 写入RO的系统寄存器
- 低级别处理器模式下访问高级别处理器模式的系统寄存器(模式级别:M > S > U)
2.1 U模式 系统寄存器
| 地址 | CSR名称 | 属性 | 说明 |
|---|---|---|---|
| 0x001 | fflags | URW | 浮点数累积异常(accrued exception) |
| 0x002 | frm | URW | 浮点数动态舍入模式(dynamic rounding mode) |
| 0x003 | fcsr | URW | 浮点数控制和状态寄存器 |
| 0xC00 | cycle | URO | 读取时钟周期,映射到RDCYCLE伪指令 |
| 0xC01 | time | URO | 读取time系统寄存器的值,映射到RDTIME伪指令 |
| 0xC02 | instret | URO | 执行指令数目,映射到RDINSTRET伪指令 |
| 0xC03 ~ 0xC1F | hpmcounter3 ~hpmcounter31 | 性能检测寄存器 |
- 补充:
- RDCYCLE伪指令读取cycle系统寄存器的值,返回物理处理器内核的时钟周期数(并非处理器硬件线程的始终周期数)。主要用于性能监控和调优;
- RDTIME伪指令读取time系统寄存器的值,获取系统实际时间。系统每次启动时读取CMOS上的RTC计数值,当时钟中断到来时,更新该计数;
- RDINSTRET伪指令读取instret系统寄存器的值,返回处理器执行线程已经执行的指令数量;
- hpmcounter用于系统性能检测的寄存器,这些计数器的计数记录平台的事件,并通过额外的特权寄存器进行配置。
2.2 S模式 系统寄存器
| 地址 | CSR名称 | 属性 | 说明 |
|---|---|---|---|
| 0x100 | sstatus | SRW | S模式下的处理器状态寄存器 |
| 0x104 | sie | SRW | S模式下的中断使能寄存器 |
| 0x105 | stvec | SRW | S模式下的异常向量表入口地址寄存器 |
| 0x106 | scounteren | SRW | S模式下的计数使能寄存器 |
| 0x10A | senvcfg | SRW | S模式下的环境配置寄存器 |
| 0x140 | scratch | SRW | 用于异常处理的临时寄存器 |
| 0x141 | sepc | SRW | S模式下的异常模式程序计数器(PC)寄存器 |
| 0x142 | scause | SRW | S模式下的异常原因寄存器 |
| 0x143 | stval | SRW | S模式下的异常向量寄存器(记录发生异常的虚拟地址) |
| 0x144 | sip | SRW | S模式下的中断待定寄存器 |
| 0x180 | satp | SRW | S模式下的地址转换与保护寄存器 |
| 0x5A8 | scontext | SRW | S模式下的上下文寄存器(用于调试) |
- 说明:
- scounteren用于在S模式下,使能U模式下的硬件性能检测和计数寄存器(cycle, time, instret, HPM3~31)
scratch在从S模式返回U模式时,保存S模式时的进程控制块。
- scounteren用于在S模式下,使能U模式下的硬件性能检测和计数寄存器(cycle, time, instret, HPM3~31)
2.3 M模式 系统寄存器
2.3.1 总览表
| 地址 | CSR名称 | 属性 | 说明 |
|---|---|---|---|
| 0xF11 | mvendorid | MRO | 机器厂商ID寄存器 |
| 0xF12 | marchid | MRO | 处理器体系结构ID寄存器 |
| 0xF13 | mimpid | MRO | 处理器实现版本编号寄存器 |
| 0xF14 | mhartid | MRO | 处理器硬件线程(hart)ID寄存器 |
| 0xF15 | mconfigptr | MRO | 配置数据结构寄存器 |
| 0x300 | mstatus | MRW | M模式下的处理器状态寄存器 |
| 0x301 | misa | MRW | 指令集体系结构和扩展寄存器 |
| 0x302 | medeleg | MRW | M模式下的异常委托寄存器,把异常委托到S模式下处理 |
| 0x303 | mideleg | MRW | M模式下的中断委托寄存器,把中断委托到S模式下处理 |
| 0x304 | mie | MRW | M模式下的中断使能寄存器 |
| 0x305 | mtvec | MRW | M模式下的异常向量入口地址寄存器 |
| 0x306 | mcounteren | MRW | M模式下的计数使能寄存器。用于使能S模式或U模式下的硬件性能检测和计数寄存器。 |
| 0x340 | mscratch | MRW | 用于异常处理的临时寄存器 |
| 0x341 | mepc | MRW | M模式下的异常模式PC寄存器。处理器陷入M模式时,保存中断或遇到的异常的指令的虚拟地址 |
| 0x342 | mcause | MRW | M模式下的异常原因寄存器 |
| 0x343 | mtval | MRW | M模式下的异常向量寄存器。处理器陷入M模式时,mtval记录发生异常的虚拟地址。 |
| 0x344 | mip | MRW | M模式下的中断待定寄存器。表示哪些中断处与待定状态。 |
| 0x34A | mtinst | MRW | M模式下的陷入指令(用于虚拟化) |
| 0x34B | mtval2 | MRW | M模式下的异常向量寄存器(用于虚拟化) |
2.3.2 补充
2.3.2.1 misa寄存器
- misa:表示处理器支持的体系结构和扩展
- Extensions(bit[25:0]):表示处理器支持的扩展
- MXL(bit[63:62):表示M模式下寄存器长度
- 1:32位
- 2:64位
- 3:128位
| 位 | 名称 | 说明 |
|---|---|---|
| 0 | A | 原子操作扩展 |
| 1 | B | 位操作扩展 |
| 2 | C | 压缩指令扩展 |
| 3 | D | 双精度浮点数扩展 |
| 4 | E | RV32E指令集扩展 |
| 5 | F | 单精度浮点数扩展 |
| 6 | G | 保留 |
| 7 | H | 虚拟化扩展 |
| 8 | I | RV32I/RV64I/RV128I基础指令集扩展 |
| 9 | J | 动态翻译语言扩展 |
| 10 | K | 保留 |
| 11 | L | 保留 |
| 12 | M | 整数乘/除扩展 |
| 13 | N | 用户中断扩展 |
| 14 | O | 保留 |
| 15 | P | SIMD扩展 |
| 16 | Q | 4倍精度浮点数扩展 |
| 17 | R | 保留 |
| 18 | S | 支持S模式 |
| 19 | T | 保留 |
| 20 | U | 支持U模式 |
| 21 | V | 可伸缩矢量扩展 |
| 22 | W | 保留 |
| 23 | X | 非标准扩展 |
| 24 | Y | 保留 |
| 25 | Z | 保留 |
2.3.2.2 mstatus寄存器
| 字段 | 尾段 | 说明 |
|---|---|---|
| UIE | bit[0] | |
| SIE | bit[1] | 中断使能位,用于使能和关闭S模式下所有的中断 |
| MIE | bit[3] | 中断使能位,用于使能和关闭M模式下所有的中断 |
| SPIE | bit[5] | 中断使能保存位。当一个异常陷入S模式时,SIE的值保存到SPIE中,SIE设置为0。当调用SRET指令返回时,从SPIE中恢复SIE,然后SPIE设置为1 |
| UBE | bit[6] | 控制U模式下加载和存储指令访问内存的大小端模式。 0:小端。 1:大端。 |
| MPIE | bit[7] | 中断使能保存位。当一个异常陷入M模式时,MIE的值保存到MPIE中,MIE设置为0。当调用MRET指令返回时,从MPIE中恢复MIE,然后MPIE设置为1 |
| SPP | bit[8] | 陷入S模式之前的CPU处理模式。 0:从U模式陷入到S模式。 1:在S模式触发的异常。 |
| VS | bir[10:9] | 使能可伸缩矢量扩展 |
| MPP | bit[12:11] | 陷入M模式之前CPU的处理模式。 0:从U模式陷入到M模式。 1:从S模式陷入到M模式 2:在M模式触发的异常。 |
| FS | bit[14:13] | 使能浮点数单元 |
| XS | bit[16:15 | 使能U模式下扩展的其他状态 |
| MPRV | bit[17] | 修改有效特权模式: 0:加载和存储指令按照当前的处理器模式进行地址转换和内存保护。 加载和存储指令按照MPP字段中存储的处理器模式的权限进行内存保护与检查 |
| SUM | bit[18] | 指定在S模式下是否允许访问U模式的内存。 0:在S模式下访问U模式下的内存是会触发异常。 1:在S模式下可以访问U模式下的内存 |
| MXR | bit[19] | 指定访问内存的权限。 0:可以加载只读页面。 1:可以加载可读和可执行的页面 |
| TVM | bit[20] 支持拦截S模式下的虚拟内存管理操作 | |
| TW | bit[21] | 支持拦截WFI指令。 0:WFI指令可以在低权限模式下执行。 1: |
| TSR | bit[22] | 支持拦截SRET指令。 0:在S模式下正常执行SRET指令。 1:在S模式下执行SRET指令会触发非法指令异常。 |
| UXL | bit[33:32] | U模式下寄存器长度 |
| SXL | bit[35:34] | S模式下寄存器长度 |
| SBE | bit[36] | 控制S模式下加载和内存访问的大小端模式。 0:小端。 1:大端。 |
| MBE | bit[37] | 控制M模式下加载和内存访问的大小端模式。 0:小端。 1:大端。 |
相关文章:
【RISC-V】RISC-V寄存器
一、通用寄存器 32位RISC-V体系结构提供32个32位的整型通用寄存器寄存器别名全称说明X0zero零寄存器可做源寄存器(rs)或目标寄存器(rd)X1ra链接寄存器保存函数返回地址X2sp栈指针寄存器指向栈的地址X3gp全局寄存器用于链接器松弛优化X4tp线程寄存器常用于在OS中保存指向进程控…...
Python爬虫异常处理实践:处理被封禁和网站升级问题
在这篇文章中,我们将一起探讨Python爬虫异常处理实践,特别关注处理被封禁和网站升级问题。让我们一起来看看如何解决这些问题,提高我们爬虫程序的稳定性和可靠性。 首先,我们要了解为什么会遇到这些问题。网站封禁爬虫的原因主…...
重大工程建造云服务平台源码 SpringCloud+Vue
技术架构: 微服务JavaSpring Cloud VueUniApp MySql 开发语言:Java 开发工具:Idea 前端框架:Vue 后端框架:Spring Cloud 数 据 库:MySql 移 动 端:UniApp 系统端口:PC端&…...
MyBatisPlus简单入门
1、简单介绍MyBatisPlus MyBatisPlus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,完全去SQL化,封装好了大量的CRUD操作。甚至吧CRUD操作封装到了Service层,可以直接在Controller调用现成的CRUD服务层,…...
神经网络入门
神经网络的基本骨架 1. nn.Module的使用 所有的模型都要继承 Module 类需要重写初始化函数和运算步骤函数 eg: import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module): # 继承父类Module def __init__(self): # 重写初始化函数super()…...
【面试经典150题】多数元素
🔗题目链接 ✈题目描述: 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 ⌊ n/2 ⌋表示n/2结果向下取…...
c#垃圾回收(Garbage Collection)
在C#中,垃圾回收(Garbage Collection)是一种自动管理内存的机制。它负责跟踪和释放不再使用的内存,以便程序可以有效地使用内存资源。 C#中的垃圾回收器是由.NET运行时(CLR)提供和管理的。它使用了一种叫做…...
vue 基于element-plus el-button封装按钮组件
封装组件的原则是:组件只是数据流通的一个管道,不要糅合太多的逻辑在里面,是一个纯组件,还要根据自己项目的业务场景做具体的处理。 // MyButton.vue // 基于element-plus中el-button来封装按钮 <template><el-button c…...
smbus只能再python2.7下运行?不能再python3.8下运行吗?
不是的,SMBus并不只能在Python 2.7下运行,它也可以在Python 3.8及更高版本下运行。SMBus是用于访问系统上的I2C设备(Inter-Integrated Circuit,一种串行通信协议)的Python库,它应该与Python 3.8兼容。 要在…...
python中is和==的区别
is 和 的区别 在Python中,is和是两个用于比较对象的操作符,它们有不同的作用和用法。 is操作符: is用于比较两个对象的身份标识,即判断两个对象是否引用同一个内存地址的对象。当is操作符用于比较两个对象时,它会判断…...
Viobot回环使用
Viobot回环是使用词袋匹配的方式,,当新的关键帧能够匹配词袋里面记录过的关键帧时,触发回环,将设备的当前位姿拉到历史位姿。 一.上位机操作 词袋使用方法 连接上设备,先停止算法。UI上点 设置 选到 loop 选项卡&…...
React钩子函数之forward结合useImperativeHandle钩子的基本使用
React钩子函数是React框架中非常重要的一部分,其中forward和useImperativeHandle是两个常用的钩子函数。这两个钩子函数可以结合使用,用来实现一些高级的功能。 首先,让我们来了解一下forward钩子函数。它的作用是将父组件中的props传递给子…...
c++中移动语义和完美转发
C 中的移动语义和完美转发是 C11 引入的两个重要特性,它们分别用于提高性能和灵活性。 移动语义(Move Semantics): 移动语义允许有效地将资源(如堆上分配的内存或其他资源)从一个对象转移到另一个对象,而…...
【linux命令讲解大全】040. 文件操作:使用touch命令创建和更新文件
文章目录 touch补充说明语法选项参数示例 从零学 python touch 创建新的空文件或更新已存在文件的时间标签。 补充说明 touch命令具有两个功能: 更新已存在文件的时间标签为当前系统时间(默认方式),文件的数据保持不变。创建新…...
Redis之MoreKey问题及Scan命令解读
目录 MoreKey问题讨论 Scan命令 Sscan命令 Hscan命令 Zscan命令 MoreKey问题讨论 keys * 查看当前库所有key 对于海量数据执行key *会造成严重服务卡顿、影响业务。在实际环境中最好不要使用。生产制造过程中keys * / flushdb/flushall等危险命令以防止误删误用。 大量的…...
QA工具开发流程
前言 在项目上线前期,这边根据需求制作了一套QA测试工具。主要分为以下四个模块的测试**图1** **数值测试:**主要包括了角色的等级变更、游戏里货币的变更、(目前已制作的)游戏道具的数量变更。这些可能归一为一类测试模型**动画…...
JSON.toJSONString首字母大小写问题
前言 开发过程中遇到的,对象转字符串时,有个字段首字母是大写的,转换之后就变成了小写,在这里记录下 代码示例 String jsonString JSON.toJSONString(obj,SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue,…...
ant-vue1.78版a-auto-complete表单自动搜索返回列表中的关键字标红
a-auto-complete表单自动搜索返回列表中的关键字标红 通常在做关键字标红的场景,都是后端返回html结构,前端直接渲染实现,但是如果需要前端处理的话,实现也是很简单的,接下来我直接上应用场景吧 应用场景就是通过关键…...
Elasticsearch 优化
Elasticsearch 优化 2.1硬件选择 Elasticsearch 的基础是 Lucene ,所有的索引和文档数据是存储在本地的磁盘中,具体的 路径可在 ES 的配置文件 ../config/elasticsearch.yml 中配置,如下: #----------------------------…...
spring boot的自动装配原理
spring boot的自动装配原理 解释和使用关键技术思想总结 解释和使用 自动装配是什么:自动将第三方组件的bean装载到ioc容器里,不需要开发人员再去写bean相关的一些配置 spring boot怎么做:在启动类上加SpringBootApplication注解就可以实现自…...
ICLR 2026 | 告别Top-K检索!RF-Mem在嵌入空间逐步重构证据链,实现长记忆渐进式唤醒
今天分享一篇来自大连理工大学、香港城市大学、华为和中国科学技术大学的最新工作 RF-Mem,发表于ICLR 2026。这篇工作关注个性化大模型中的一个关键问题:当用户历史越来越长时,模型到底该怎样从海量记忆里,准确找回“此时此刻最相…...
G-Helper终极指南:如何用轻量级工具优化华硕笔记本性能与电池健康
G-Helper终极指南:如何用轻量级工具优化华硕笔记本性能与电池健康 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF…...
新手如何借助快马平台AI生成代码,轻松入门蓝桥杯经典题型
作为一个刚接触编程的新手,参加蓝桥杯这样的比赛可能会觉得无从下手。特别是看到题目要求实现算法时,往往不知道如何把问题拆解成代码。最近我发现用InsCode(快马)平台可以很好地解决这个问题,它能根据题目描述直接生成可运行的代码ÿ…...
FileConverter:重构文件格式转换流程,实现设计师与教育工作者的效率突破
FileConverter:重构文件格式转换流程,实现设计师与教育工作者的效率突破 【免费下载链接】FileConverter File Converter is a very simple tool which allows you to convert and compress files using the context menu in windows explorer. 项目地…...
MongoDB(70)如何使用副本集进行备份?
使用副本集进行备份是一个常见的MongoDB备份策略,因为副本集提供了数据冗余和高可用性。通过从副本集中读取数据,可以在不影响主节点的情况下进行备份。以下是详细的步骤和示例代码,展示如何使用 MongoDB 副本集进行备份。方法一:…...
人工智能准备好进行多模态仇恨言论检测了吗?
摘要 网络仇恨言论针对个人或群体的身份属性进行攻击,传播迅速,带来严重的社会风险。模因(结合图像与文本的形式)已成为传播仇恨言论的一种隐蔽载体,其解读往往依赖文化背景知识。 然而,现有的多模态仇恨言…...
南北阁模型新玩法:一键部署极简WebUI,体验手机短信般AI对话
南北阁模型新玩法:一键部署极简WebUI,体验手机短信般AI对话 还在用那些界面老旧、反应迟钝的AI对话工具吗?每次发送问题后,只能盯着屏幕上的加载图标干等,几秒甚至十几秒后才能看到一大段文字“啪”地一下弹出来&…...
避坑指南:Matplotlib调用LaTeX渲染公式时,你可能会遇到的5个报错及解决方法
Matplotlib与LaTeX公式渲染:5个典型报错排查手册 当你第一次在Matplotlib中启用usetexTrue时,屏幕上突然弹出的红色LaTeX错误信息往往让人手足无措。这不是你代码逻辑的问题,而是两个强大工具在握手时产生的"语言障碍"。本文将带你…...
嵌入式Linux C++开发框架AppKit实战解析
1. 嵌入式Linux C开发框架AppKit深度解析在嵌入式Linux开发领域,C开发者经常面临一个尴尬局面:标准库功能有限,而ROS等框架又过于庞大。AppKit框架正是为解决这一痛点而生,它提供了恰到好处的中间层抽象。我在多个工业控制项目中实…...
WSL 启动闪退问题排查
第一步:检查当前状态在开始折腾 BIOS 之前,我们先确认一下系统到底有没有识别到虚拟化。按下快捷键 Ctrl Shift Esc 打开任务管理器。点击左侧的“性能”图标,选择 “CPU”。看右下角的信息,找到 “虚拟化”:如果是“…...
