RISC-V特权架构 - CSR寄存器

news2024/11/17 13:51:10

RV32/64 特权架构 - CSR寄存器

  • 1 CSR地址空间
  • 2 CSR定义
    • 2.1 用户级
    • 2.2 监管级
    • 2.3 超级监管级
    • 2.4 机器级
  • 3 CSR访问
    • 3.1 CSRRW
    • 3.2 CSRRS
    • 3.3 CSRRC
    • 3.4 CSRRWI
    • 3.5 CSRRSI
    • 3.6 CSRRCI

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。

1 CSR地址空间

RISC-V架构中定义了一些控制和状态寄存器(control and status register),简称CSR,与32个物理寄存器不同(物理寄存器可以认为是5位地址寻址的),这些CSR是用12位地址进行寻址的,因此理论上最多可以有4096个CSR寄存器,并且地址空间是私有独立的,不同于全局地址空间。

CSR地址空间,定义如下:
在这里插入图片描述
CSR地址的高4bits,用于编码CSR在各个权级上的可读写性:

  • [11:10],表示该寄存器是可读写(00,01或10),还是只读(11)。
  • [9:8],表示允许访问该寄存器的最低权级。
    00:用户级,用户模式及以上权级(用户、监管、机器)可访问。
    01:监管级,监管模式及以上权级(监管、机器)可访问。
    10:超级监管级(扩展模式),仅在虚拟化时使用,用于访问虚拟化专用的CSR。
    11:机器级,仅机器模式可访问。
    从上图也可以看到,根据[9:8]的值,整个CSR地址空间被分为了4个部分。

除此之外,上图还指定了哪些CSR地址是标准用途,而哪些是自定义用途。
用于自定义的CSR地址,不会在未来标准扩展中被重新定义。

2 CSR定义

我们知道,CSR寄存器被划分为4个级别:用户级、监管级、超级监管级、机器级。
接下来,我们看看各个权级,具体定义了哪些寄存器。

2.1 用户级

用户级CSR,定义了两个部分的寄存器:

  • Unprivileged Floating-Point CSRs
  • Unprivileged Counter/Timers

在这里插入图片描述
以上Number列,给出了该寄存器的12位地址。
具体寄存器含义见规范手册。

2.2 监管级

监管级CSR,定义了五个部分的寄存器:

  • Supervisor Trap Setup
  • Supervisor Configuration
  • Supervisor Trap Handling
  • Supervisor Protection and Translation
  • Debug/Trace Registers

在这里插入图片描述
具体寄存器含义见规范手册。

2.3 超级监管级

超级监管级CSR,定义了七个部分的寄存器:

  • Hypervisor Trap Setup
  • Hypervisor Trap Handling
  • Hypervisor Configuration
  • Hypervisor Protection and Translation
  • Debug/Trace Registers
  • Hypervisor Counter/Timer Virtualization Registers
  • Virtual Supervisor Registers

在这里插入图片描述
具体寄存器含义见规范手册。

2.4 机器级

机器级CSR,定义了九个部分的寄存器:

  • Machine Information Registers
  • Machine Trap Setup
  • Machine Trap Handling
  • Machine Configuration
  • Machine Memory Protection
  • Machine Counter/Timers
  • Machine Counter Setup
  • Debug/Trace Registers (shared with Debug Mode)
  • Debug Mode Registers

在这里插入图片描述
在这里插入图片描述
具体寄存器含义见规范手册。

3 CSR访问

针对CSR寄存器的读写,有相应的特殊指令,这些特殊指令都被定义在RV32I中,如下所示:
在这里插入图片描述
真正的指令只有CSRRW、CSRRS、CSRRC、CSRRWI、CSRRSI、CSRRCI这6条,其他资料中的CSR指令,均为伪指令。

CSR指令机器码中共有12位(第20-31位)用来指示,被“读改写”的是哪一个CSR寄存器,这里通常填写的就是前面讲过的CSR地址,比如:mtvec寄存器那就是0x305。

注意事项:

  • 试图访问一个不存在的CSR将造成一个非法指令异常(illegal instruction exception);
  • 试图在不当的权级下访问CSR,或者尝试写入一个只读寄存器也都将造成非法指令异常;
  • 可读写寄存器中也可能包含一些只读位,此时忽略对只读位的写入。

3.1 CSRRW

在这里插入图片描述
指令形式:csrrw rd, csr, rs1
指令功能:CSR寄存器读后写。记csr值为t,将rs1写入csr,再将t写入rd。

t = csr
csr = rs1
rd = t

例如:csrrw t0, mstatus, t0
将 mstatus 的值与 t0 的值交换。

3.2 CSRRS

在这里插入图片描述
指令形式:csrrs rd, csr, rs1
指令功能:CSR寄存器读后置位。记csr值为t,将t和rs1的按位或结果写入csr,再将t 写入rd。

t = csr
csr = t | rs1 
rd = t

3.3 CSRRC

在这里插入图片描述
指令形式:csrrc rd, csr, rs1
指令功能:CSR寄存器读后清位。记csr值为t,将rs1的反码和t按位与,结果写入csr,再将t写入rd。

t = csr
csr = t & ∼rs1
rd = t

3.4 CSRRWI

在这里插入图片描述
指令形式:csrrwi rd, csr, zimm[4:0]
指令功能:CSR寄存器读后写立即数。将csr 的值复制到rd 中,再将5 位立即数zimm 的零扩展结果写入csr。

rd = csr
csr = zimm

3.5 CSRRSI

在这里插入图片描述
指令形式:csrrsi rd, csr, zimm[4:0]
指令功能:CSR寄存器读后置位立即数。记csr 的值为t,将5 位立即数zimm 零扩展后,和t 按位或,结果写入csr,再将t 写入rd(csr 中的第5 及更高的位不变)。

t = csr
csr = t | zimm
rd = t

3.6 CSRRCI

在这里插入图片描述
指令形式:csrrci rd, csr, zimm[4:0]
指令功能:CSR寄存器读后清位立即数。记csr 的值为t,将5 位立即数zimm 零扩展后的反码和t 按位与,结果写入csr,再将t 写入rd(csr 中的第5 及更高的位不变)。

t = csr
csr = t & ∼zimm 
rd = t

此外,需要注意:

  • 若目的通用寄存器为x0,则不会执行读取操作;
  • 若源通用寄存器为x0或立即数0,也不会进行写入CSR操作。

基于以上6条指令和x0这样的特性,衍生出若干CSR伪指令,比如:csrr、csrc、csrci、csrs、csrw等。


参考文档:

  • 《riscv-spec-20191213》
  • 《riscv-privileged-20211203》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从 Flask 切到 FastAPI 后,起飞了!

我这几天上手体验 FastAPI,感受到这个框架易用和方便。之前也使用过 Python 中的 Django 和 Flask 作为项目的框架。Django 说实话上手也方便,但是学习起来有点重量级框架的感觉,FastAPI 带给我的直观体验还是很轻便的,本文就会着…

基于Python的电商评论数据采集与分析|电商API接口数据采集

引言 在电商竞争日益激烈的情况下,商家既要提高产品质量,又要洞悉客户的想法和需求,关注客户购买商品后的评论,而第三方商家获取商品评价主要依赖于人工收集,不但效率低,而且准确度得不到保障。通过使用Py…

经典DP-最大子数组

连续子数组的最大和 代码 //定义一个名为"连续子数组的最大和"的公共类 public class 连续子数组的最大和 { // 定义一个静态变量maxn,并赋值为100010 static int maxn100010; // 定义一个静态的整数数组dp,大小为maxn static int[] dp…

Java毕业设计-基于springboot开发的Web社区医院管理服务系统-毕业论文+答辩PPT(有源代码)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、用户功能模块4、医生功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发…

官网万词霸屏推广+关键词排名优化源码系统 带完整的安装代码包以及搭建教程

随着搜索引擎算法的不断更新和市场竞争的加剧,传统的SEO方法已经难以满足企业对于快速、高效推广的需求。罗峰结合多年的互联网营销经验和最新的搜索引擎优化技术,给大家推荐一款集网站搭建、关键词优化、数据分析于一体的源码系统。 以下是部分代码示例…

如何使用Spring Boot轻松实现国际化和本地化

文章目录 什么是国际化SpringBoot 国际化实践出真知新建Properties文件修改配置文件测试获取所有国际化资源 总结 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 什么是国际化 国际化&…

opencv--使用直方图找谷底进行确定分割阈值

直方图原理就不说了,大家自行百度 直方图可以帮助分析图像中的灰度变化,进而帮助确定最优二值化的灰度阈值(threshold level)。如果物体与背景的灰度值对比明显,此时灰度直方图就会包含双峰(bimodal histo…

Java核心API-多线程

多线程 文章目录 多线程前言一、多线程1、多线程的概念2、多线程的好处 二、主线程1、Thread类2、主线程 三、线程的创建和启动1、创建线程的两种方式2、使用线程的步骤 四、继承Thread类创建线程五、实现Runnable接口创建线程六、比较两种创建线程的方式1、继承Thread类2、实现…

Python爬取网站视频资源

思路: 在界面找到视频对应的html元素位置,观察发现视频的url为https://www.pearvideo.com/video_视频的id,而这个id在html中的href中,所以第一步需要通过xpath捕获到所需要的id 在https://www.pearvideo.com/video_id的页面&…

C语言while 语句的基本格式是什么?

一、问题 C语⾔中有三种循环语句,while 语句是其中的⼀个,它的基本格式是怎样的呢? 二、解答 while 语句的⼀般形式为: while(表达式) 语句; 其中,表达式是循环条件,语句为循环体。 注意: …

测试环境搭建整套大数据系统(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一:搭建kafka。 1. 三台机器执行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下俩内容 1.三台机器分别给予各自的broker_id…

奇点云:SAFe框架下,我们对平台软件工程生产线做了4项改造

导读: 客户规模扩大,如何保证大数据软件产品和服务质量始终如一?几乎所有成长中的软件厂商,尤其是需要通过私有化部署交付的厂商,都会面临这个问题。正如《人月神话》中多次表明的,单纯地增加人手、扩大团队…

npm使用国内淘宝镜像的方法整理

命令配置安装: 淘宝镜像: npm config set registry https://registry.npm.taobao.org/ 官方镜像: npm config set registry https://registry.npmjs.org 通过cnpm安装: npm install -g cnpm --registryhttps://registry.npm.…

Java-常用集合

Jva常用集合 一、Java 集合框架体系二、Collection接口和方法1. List接口List 接口主要实现类:ArrayListList 的实现类之二:LinkedListList 的实现类之三:Vector 2. Set接口Set 主要实现类:HashSetSet 实现类之二:Link…

SpringBoot 手写 Starter

spring-boot-starter 模块 1.介绍 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配…

WordPress分类目录ID怎么看?如何查找WordPress标签ID?

在WordPress网站中,我们需要判断某篇文章是否属于某个分类目录,或者是否拥有某个标签,那么就需要用到分类目录ID和标签ID,那么WordPress分类目录ID怎么看?如何查找WordPress标签ID?下面boke112百科就跟大家…

MySQL 自增列解析(Auto_increment)

MySQL数据库为列提供了一种自增属性,当列被定义为自增时。Insert语句对该列即使不提供值,MySQL也会自动为该列生成递增的唯一标识,因此这个特性广泛用于主键的自动生成。 一、自增列的用法 自增列具有自动生成序列值,整型&#…

Linux系统编程入门(下)

Linux系统编程 第一章 Linux系统编程入门(下)1.6 GDB 调试1.7 标准C库IO函数和Linux系统IO函数对比 第一章 Linux系统编程入门(上) 第一章 Linux系统编程入门(下) 1.6 GDB 调试 (1&#xff0…

AOP(黑马学习笔记)

AOP基础 学习完spring的事务管理之后,接下来我们进入到AOP的学习。 AOP也是spring框架的第二大核心,我们先来学习AOP的基础。 在AOP基础这个阶段,我们首先介绍一下什么是AOP,再通过一个快速入门程序,让大家快速体验A…

JVM性能优化

运行时优化 方法内联 方法内联,是指 JVM在运行时将调用次数达到一定阈值的方法调用替换为方法体本身 ,从而消除调用成本,并为接下来进一步的代码性能优化提供基础,是JVM的一个重要优化手段之一。 注: C的inline属于编…