RISC-V(1)——RISC-V是什么,有什么用

目录

1. RISC-V是什么

2. RISC-V指令集

3. RISC-V特权架构

4. RiscV的寄存器描述

5. 指令 

5.1 算数运算—add/sub/addi/mul/div/rem

 5.2 逻辑运算—and/andi/or/ori/xor/xori

5.3 位移运算—sll/slli/srl/srli/sra/srai

5.4 数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw

5.5 比较指令—slt/slti/sltu/sltiu

5.6 条件分支指令—beq/bne/blt/bge

5.7 无条件跳转指令—j/jal/jalr


1. RISC-V是什么

         RISC发明者是美国加州大学伯克利分校教师David Patterson,RISC-V(拼做risk-five)是第五代精简指令集,也是由David Patterson指导的项目,但许多贡献者是该大学以外的志愿者和行业工作者。

        指令集是一个CPU的基石,要实现CPU 计算和控制功能,就必须定义好一系列与硬件电路相匹配的指令系统。指令就是我们交代CPU 要执行的操作,指令集就可以简单理解为指令的集合。我们把cpu 能够识别的指令汇总在一起就构成了一个指令集。不同的CPU 有不同的指令集,根据他们的繁简程度可以分为两种:复杂指令集CISC 和精简指令集 RISC。

2. RISC-V指令集

        RISC-V就是RISC的第五代指令集架构。而RISC-V目标就是“成为一种完全开放的指令集架构,可被任何学术机构或商业组织自由使用”。       

         RISC-V指令集由“基本指令集 + 扩展指令集”组成。

        基本指令集是必选的,扩展指令集是可选的。意思就是可以根据你的实际需求,选择需要使用的指令。例如在一个项目中,如果不需要用到压缩指令,那么就不需要把压缩指令添加进来,从而做到定制化,这也是RISC-V的一大特点。

        RISC-V指令集有RV32I、RV32E、RV64I、RV64E、RV64I等等,RV代表RISC-V,32/64代表32位或64位,I和E都是基本指令集,在I和E的基础上,可以添加D(双精度浮点扩展)、M(整数乘除法)、A(原子扩展)、C(压缩扩展)等扩展指令。例如,在RV64I基础上,添加原子、整数乘除法、双精度浮点、压缩指令,则该指令集称为RV64IMADC。

基本指令集和扩展指令集描述如下:

名称类别说明
RV32I基础指令整数指令:包含算法、分支、逻辑、访存指令,有32个32位寄存器。能寻址32位地址空间
RV64I基础指令整数指令:包含算法、分支、逻辑、访存指令,有32个64位寄存器。能寻址64位地址空间
RV128I基础指令整数指令:包含算法、分支、逻辑、访存指令,有32个128位寄存器。能寻址128位地址空间
RV32E基础指令与RV32I一样,只不过只使用前16个(0~15)32位寄存器
M扩展指令包含乘法、除法、取模求余指令
F扩展指令单精度浮点指令
D扩展指令双精度浮点指令
Q扩展指令四倍精度浮点指令
A扩展指令原子操作指令:比如比较并交换,读改写等指令
C扩展指令压缩指令:单指令长度为16位,主要用于改善程序大小
P扩展指令单指令多数据(Packed-SIMD)指令
B扩展指令位操作指令
H扩展指令支持(Hypervisor)管理指令
J扩展指令支持动态翻译语言指令
L扩展指令十进制浮点指令
N扩展指令用户中断指令
G通用指令包含I、M、A、F、D 指令

        我们可以选择一个基础指令集,加上若干个扩展指令集进行搭配使用,就可以得到我们想要的指令集架构,进而根据这样的指令架构,设计出贴合我们需求的CPU。其中最核心部分是一个基础指令集,叫做RV32I。RV32I 包含的指令是固定不变的,这为编译器设计人员,操作系统开发人员和汇编语言程序员提供了稳定的基础框架。

3. RISC-V特权架构

        ARM有7种工作模式,而RISC-V也有不同的模式,这些模式在RISC-V中也被称为特权架构。

RISC-V总共有四种模式,分别是U、S、H和M模式: 

模式缩写编码
机器模式M11
HypervisorH10
监管者模式S01
用户模式U00
  • U模式被编码为00
  • S模式编码为01
  • H模式编码为10
  • M模式编码为11

        Level越高,等级越高。等级越高,拥有的访问权限也更高。按照特权等级,有高到低依次为M、H、S、U。

        上图中编码为10的模式是保留的,这个模式实际上就是H模式,H模式是用作虚拟化,但是目前RISC-V对虚拟化还不太完善,基本不支持。因此上图并没有将H模式标出来,而是作为保留。也正是因此,有人经常将RISC-V的模式说成三种U、S和M。

  • U模式:User,用户模式
  • S模式:Supervisor,监管者模式
  • M模式:Machine,机器模式

        以RISC-V Linux为例,Linux应用程序处于U模式,Linux内核/uboot处于S模式,M模式则是OpenSBI。M模式拥有最高访问权限,Linux内核如果要访问CSR寄存器,则必须由S模式切换到M模式,由OpenSBI读取CSR寄存器,然后将数据返回给内核。

        M模式是必须要选择的,RISC-V的裸机代码都运行在M模式下

4. RiscV的寄存器描述

RISC-V定义了32个通用寄存器和一个PC寄存器,32个通用寄存器如下:

寄存器ABI名称说明
x0zero0值寄存器,硬编码为0,写入数据忽略,读取数据为0
x1ra用于返回地址(return address)
x2sp用于栈指针(stack pointer)
x3gp用于通用指针(global pointer)
x4tp用于线程指针
x5t0用于存放临时数据或者备用链接寄存器
x6~x7t1~t2用于存放临时数据寄存器
x8s0/fp需要保存的寄存器或者帧指针寄存器
x9s1需要保存寄存器
x10~x11a0~a1函数参数或者返回值寄存器
x12~x17a2-a7函数传递参数寄存器
x18~x27s2-s11需要保存的寄存器
x28~x31t3~t6用于存放临时数据寄存器

5. 指令 

5.1 算数运算—add/sub/addi/mul/div/rem

add rd,rs1,rs2:将寄存器rs1与rs2的值相加并写入寄存器rd。
sub rd,rs1,rs2:将寄存器rs1与rs2的值相减并写入寄存器rd。
addi rd,rs1,imm:将寄存器rs1的值与立即数imm相加并存入寄存器rd。
mul rd,rs1,rs2:将寄存器rs1与rs2的值相乘并写入寄存器rd。
div rd,rs1,rs2:将寄存器rs1除以寄存器rs2的值,向零舍入并写入寄存器rd。
rem rd,rs1,rs2:将寄存器rs1模寄存器rs2的值并写入寄存器rd。

 5.2 逻辑运算—and/andi/or/ori/xor/xori

and rd,rs1,rs2:将寄存器rs1与rs2的值按位与并写入寄存器rd。
andi rd,rs1,imm:将寄存器rs1的值与立即数imm的值按位与并写入寄存器rd。
or rd,rs1,rs2:将寄存器rs1与rs2的值按位或并写入寄存器rd。
ori rd,rs1,imm:将寄存器rs1的值与立即数imm的值按位或并写入寄存器rd。
xor rd,rs1,rs2:将寄存器rs1与rs2的值按位异或并写入寄存器rd。
xori rd,rs1,imm:将寄存器rs1的值与立即数imm的值按位异或并写入寄存器rd。

5.3 位移运算—sll/slli/srl/srli/sra/srai

//左移会在右边补0,逻辑右移会在最高位添0,算数右移在最高位添加符号位。

sll rd,rs1,rs2:将寄存器rs1的值左移寄存器rs2的值这么多位,并写入寄存器rd。
slli rd,rs1,imm:将寄存器rs1的值左移立即数imm的值这么多位,并写入寄存器rd。
srl rd,rs1,rs2:将寄存器rs1的值逻辑右移寄存器rs2的值这么多位,并写入寄存器rd。
srli rd,rs1,imm:将寄存器rs1的值逻辑右移立即数imm的值这么多位,并写入寄存器rd。
sra rd,rs1,rs2:将寄存器rs1的值算数右移寄存器rs2的值这么多位,并写入寄存器rd。
srai rd,rs1,imm:将寄存器rs1的值算数右移立即数imm的值这么多位,并写入寄存器rd。

5.4 数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw

//在RISC-V中1word=4Bytes=32bits。l是load的首字母,即加载数据;s是store的缩写,即存储数据。b,h,w分别是byte,half word,word的首字母,除此之外还有存取双字的d,即double word。

lb rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个字节,符号扩展后存入rd
lh rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读半个字,符号扩展后存入rd
lw rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个字,符号扩展后存入rd
lbu rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个无符号的字节,零扩展后存入rd
lhu rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读半个无符号的字,零扩展后存入rd
lwu rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个无符号的字,零扩展后存入rd
sb rs1,offset(rs2):把寄存器rs1的值存入地址为寄存器rs2的值加offset的主存中,保留最右端的8位
sh rs1,offset(rs2):把寄存器rs1的值存入地址为寄存器rs2的值加offset的主存中,保留最右端的16位
sw rs1,offset(rs2):把寄存器rs1的值存入地址为寄存器rs2的值加offset的主存中,保留最右端的32位

5.5 比较指令—slt/slti/sltu/sltiu

有符号数:
slt rd,rs1,rs2:若rs1的值小于rs1的值,rd置为1,否则置为0
slti rd,rs1,imm:若rs1的值小于立即数imm,rd置为1,否则置为0
无符号数:
sltu rd,rs1,rs2:若rs1的值小于rs1的值,rd置为1,否则置为0
sltiu rd,rs1,imm:若rs1的值小于立即数imm,rd置为1,否则置为0

5.6 条件分支指令—beq/bne/blt/bge

beq rs1,rs2,lable:若rs1的值等于rs2的值,程序跳转到lable处继续执行
bne rs1,rs2,lable:若rs1的值不等于rs2的值,程序跳转到lable处继续执行
blt rs1,rs2,lable:若rs1的值小于rs2的值,程序跳转到lable处继续执行
bge rs1,rs2,lable:若rs1的值大于等于rs2的值,程序跳转到lable处继续执行

5.7 无条件跳转指令—j/jal/jalr

j label:程序直接跳转到lable处继续执行
jal rd,label:用于调用函数,把下一条指令的地址保存在rd中(通常用x1),然后跳转到label处继续执行
jalr rd,offset(rs):可用于函数返回,把下一条指令的地址存到rd中,然后跳转到rs+offset地址处的指令继续执行。若rd=x0就是单纯的跳转(x0不能被修改)

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

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

相关文章

Zebec Protocol:模块化 L3 链 Nautilus Chain,深度拓展流支付体系

过去三十年间,全球金融科技领域已经成熟并迅速增长,主要归功于不同的数字支付媒介的出现。然而,由于交易延迟、高额转账费用等问题愈发突出,更高效、更安全、更易访问的支付系统成为新的刚需。 此前,咨询巨头麦肯锡的一…

iOS 17 及 Xcode 15.0 Beta7 问题记录

1、iOS 17 真机调试问题 iOS 17之后,真机调试Beta版本必须使用Beta版本的Xcode来调试,用以前复制DeviceSupport 方式无法调试,新的Beta版本Xcode中,已经不包含 iOS 17目录。如下图: 解决方案: 1&#x…

机器学习深度学习——NLP实战(自然语言推断——微调BERT实现)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——针对序列级和词元级应用微调BERT 📚订阅专栏:机器学习&&深度学习 希望文…

【SpringSecurity】三、访问授权

文章目录 1、配置用户权限2、针对URL授权3、针对方法的授权 1、配置用户权限 继续上一章,给在内存中创建两个用户配置权限。配置权限有两种方式: 配置roles配置authorities //哪个写在后面哪个起作用 //角色变成权限后会加一个ROLE_前缀,比…

物种气候生态位动态量化与分布特征模拟

在全球气候快速变化的背景下,理解并预测生物种群如何应对气候变化,特别是它们的地理分布如何变化,已经变得至关重要。利用R语言进行物种气候生态位动态量化与分布特征模拟,不仅可以量化描述物种对环境的需求和适应性,预…

Webstorm 入门级玩转uni-app 项目-微信小程序+移动端项目方案

1. Webstorm uni-app语法插件 : Uniapp Support Uniapp Support - IntelliJ IDEs Plugin | Marketplace 第一个是不收费,第二个收费 我选择了第二个Uniapp Support ,有试用30天,安装重启webstorm之后,可以提高生产率…

6.物联网操作系统信号量,二值信号量,计数信号量

一。信号量的概念与应用 信号量定义 FreeRTOS信号量介绍 FreeRTOS信号量工作原理 1.信号量的定义 多任务环境下使用,用来协调多个任务正确合理使用临界资源。 2.FreeRTOS信号量介绍 Semaphore包括Binary,Count,Mutex; Mutex包…

Python爬虫猿人学逆向系列——第六题

题目:采集全部5页的彩票数据,计算全部中奖的总金额(包含一、二、三等奖) 地址:https://match.yuanrenxue.cn/match/6 本题比较简单,只是容易踩坑。话不多说请看分析。 两个参数,一个m一个f&…

PID直观感受简述

0、仿真控制框图 1、增加p的作用(增加响应)P 2、增加I的作用(消除稳差)PI 3、增加D的作用(抑制波动)PID 加入对噪声很敏 4、综合比对

【Linux】一张图了解系统文件

首先先认识磁盘结构 系统文件分布图 文件查找 文件删除 文件的增删改查都是围绕inode来完成的,所以当我们要进行文件删除的时候,只需要通过inode来获取到它对应的block bitmap和inode bitmap数据块容器和保存文件属性的位置置为 0即可 ,如果想…

Pytorch学习:常见数据集torchvision.datasets及数据集的使用DataLoader

文章目录 1. Datasets常见数据集1.1 CIFAR101.2 Fashion-MNIST1.3 ImageNet 2. DataLoader2.1 shuffle2.2 drop_last 1. Datasets常见数据集 Torchvision在 torchvision.datasets 模块中提供了许多内置的数据集,以及用于构建自己的数据集的实用程序类。 官方文档&a…

前端需要理解的 TypeScript 知识

Typescript是添加了类型系统的JavaScript,属于弱类型(即允许隐式类型转换)、静态类型语言,适应于任何规模的项目,支持 ES6,由微软开发并开源。Typescript增加的功能包括:类型批注和编译时类型检…

JAVA-编程基础-10-集合

Lison <dreamlison163.com>, v1.0.0, 2023.04.23 JAVA-编程基础-10-集合 文章目录 JAVA-编程基础-10-集合List、Set、Map、队列全面解析ListArrayList创建ArrayList 向ArrayList中添加元素 List、Set、Map、队列全面解析 Java 集合框架可以分为两条大的支线&#xff1a;…

一种IDEA疑难杂症的解决办法

解决办法 重启IDEA 针对于IDEA各种羡慕解析&#xff0c;运行时问题&#xff0c;但是无法通过搜索引擎得到答案的问题请试试此方法。 删除根目录下[.idea]文件夹后重启 此文件夹为idea首次导入项目时根据项目情况自动生成的配置文件。方便idea下次更快的解析项目。但是某些情…

Flask 单元测试

如果一个软件项目没有经过测试&#xff0c;就像做的菜里没加盐一样。Flask 作为一个 Web 软件项目&#xff0c;如何做单元测试呢&#xff0c;今天我们来了解下&#xff0c;基于 unittest 的 Flask 项目的单元测试。 什么是单元测试 单元测试是软件测试的一种类型。顾名思义&a…

hive中的DDL操作以及数据的导入导出

文章目录 DDL库操作表操作内部表&外部表分区表修改表&删除表 数据的导入导出数据导入数据导出 DDL DDL(data definition language)&#xff0c;命令有CREATE、ALTER、DROP等。主要用在定义、修改数据库对象的结构或数据类型&#xff1b; 理解 库操作 创建 语法 CRE…

021-从零搭建微服务-短信服务(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…

图数据库Neo4j学习五渲染图数据库neo4jd3

文章目录 1.现成的工具2.Neo4j JavaScript Driver3.neovis4.neo4jd34.1neo4jd3和neovis对比4.2获取neo4jd34.3neo4jd3的数据结构4.4Spring data neo4.4.1 定义返回数据格式4.4.1.1NeoResults4.4.1.2GraphVO4.4.1.3NodeVO4.4.1.4ShipVO 4.4.2 SDN查询解析4.4.2.1 Repo查询语句4.…

LVS DR模式搭建

目录 一、DR模式概述 一、与NET模式的区别 二、操作命令图 三、搭建流程 一、首先配置三台虚拟机并配置环境&#xff08;关闭防火墙&#xff0c;宽容模式&#xff09; 二、ping通百度 三、在115.3的&#xff08;lvs&#xff09;虚拟机上安装 ipvsadm 四、调整ARP参数 五…

【云原生】Docker私有仓库 RegistryHabor

目录 1.Docker私有仓库&#xff08;Registry&#xff09; 1.1 Registry的介绍 1.2 Registry的部署 步骤一&#xff1a;拉取相关的镜像 步骤二&#xff1a;进行 Registry的相关yml文件配置&#xff08;docker-compose&#xff09; 步骤三&#xff1a;镜像的推送 2. Regist…