RISC-V 学习笔记(零):准备工作_星影沉璧的博客-CSDN博客
RISC-V学习笔记(一):RISC-V处理器和基础的RISC-V实现_星影沉璧的博客-CSDN博客
RISC-V学习笔记(二):RISC-V寄存器和指令系统_星影沉璧的博客-CSDN博客
RISC-V 学习笔记(零):准备工作_星影沉璧的博客-CSDN博客
RISC-V汇编学习笔记(一):RISC-V汇编语言和基础的算术指令_星影沉璧的博客-CSDN博客
RISC-V汇编学习笔记(二):RISC-V汇编语言访存指令_星影沉璧的博客-CSDN博客
RISC-V汇编学习笔记(三):RISC-V汇编语言和条件判断分支转移指令_星影沉璧的博客-CSDN博客
RISC-V汇编学习笔记(四):RISC-V汇编语言和逻辑运算指令_星影沉璧的博客-CSDN博客
RISC-V汇编学习笔记(五):RISC-V汇编语言和函数调用_星影沉璧的博客-CSDN博客
RISC-V汇编学习笔记(六):RISC-V汇编语言和栈的使用_星影沉璧的博客-CSDN博客
在前面的主线剧情当中着重讲了RISC-V的基本实现,包括了RISC-V的CPU结构、RISC-V功能的实现等。实践部分的RISC-V项目:
1.寄存器的宽度为32位的RISC-V是RV32;寄存器的宽度为64位的RISC-V是RV64。(这里就解释了为什么实践项目里的位宽都没有超过32)
1.RISC-V寄存器堆:对数据通路至关重要的结构。由一组寄存器组成,可通过提供要访问的寄存器号来进行读写。(p437)和(p25)
在RISC-V当中一共拥有32个通用寄存器,在RV32中是32位宽,RV64中是64位宽。
注释:No代表Caller;Yes代表Callee;在函数调用关系中,通常将发起调用的函数称为调用函数(caller),将被调用函数称为被调用函数(callee)
接口名称 寄存器编号 说明 zero(零寄存器) x0 用于做源寄存器(rs)或目标寄存器(rd) ra(链接寄存器) x1 用于保存返回时的返回地址 sp(栈指针寄存器) x2 用于指向栈的地址 gp(全局寄存器) x3 用于链接器松弛优化 tp(线程寄存器) x4 用于在OS中保存指向进程控制块(task_struct)数据结构的指针 t0 ~ t6(临时寄存器 x5 - x7和x28 - x31 s0 - s11 x8 - x9和x18 - x27 用于作为保存寄存器,保存原进程中的关键数据,避免在函数调用过程中被破坏。其中x8(s0/fp)又被称为帧指针寄存器 a0 - a7 x10 - x17 用于向调用的函数传递参数,a0和a1寄存器常用于传递返还值 注释:x0寄存器的值总为0
系统寄存器:状态寄存器(CSR),属于CPU自带的一类寄存器,需要使用csrr、csrw、csrrw等特定指令进行访问。直接与RV32特权架构关联。
转载自:【RISC-V】RISC-V寄存器_一苇以航fp的博客-CSDN博客
RISC-V一共有三种模式:
RISC-V的权限模式和它们的编码:
1.M模式:机器模式,是RISC-V中的hart(硬件线程)可以执行的最高权限模式,是所有RISC-V处理器都必须要有的。(在项目csr_reg.v中可以知道使用的就是这种模式)
2.S模式:监督模式,可选,若支持,为 Linux,FreeBSD 和 Windows 等操作系统提供支持,该模式可运行模式可运行Linux等os内核。
3.U模式:用户模式,实现对资源的保护,运行用户应用。
1.mtvec(Machine Trap Vector):保存发生异常时处理器需要跳转到得地址。
2.mepc(Machine Exception PC):指向发生异常得指令。
3.mcause(Machine Exception Cause):指示发生异常得种类。
4.mie(Machine Interrupt Enable):指出处理器目前能处理和必须忽略的中断。
5.mip(Machine Interrupt Pending):列出目前正准备处理的中断。(csr_reg.v中不包含)
6.mtval(Machine Trap Value):保存了陷入(trap)的附加信息:地址例外出错的地址、发生非法指令例外的指令本身,对于其他异常,值为0。(csr_reg.v中不包含)
7.mscratch(Machine Scratch):暂时存放一个字大小的数据。
8.mstatus(Machine Status):保存全局中断使能,以及其他状态
RISC-V指令:计算机语言中的单词,它的词汇表被称为指令系统
1.RISC-V指令集由基本指令集 + 扩展指令集组成,基础指令集是必选的,扩展指令是可选的。
2.RISC-V指令集中I(整数指令集)和E(嵌入式指令集,RV32E是32位特有)是基础指令集,在此基础上我们可以额外添加F(单精度浮点扩展)、M(整数乘除法)、A(原子扩展)等扩展指令。实践项目支持RV32IM指令集,也就是在RV32I的基础指令上添加了M扩展指令 。
3.实践项目使用的是RV32IM
基础指令集和扩展指令集描述:
转载自:RISC-V 入门笔记(新手必看!) - 知乎 (zhihu.com)
注释:1.看这个图头大吧?我 当初第一次翻开书本看到这个图人都傻了,这个不重要啊,这 里我掏出来吓人的而已。
2.把带下划线的字母从左到右连接就是RV32I的指令。花括号{}中的每个项目都是该指 令的变体。
6种基本指令格式:
注释:1.funct7:7位功能码,用于区分不同指令的种类。
2.rs2:源寄存器2,需要读取得通用寄存器,该Bit域是寄存器的地址。
3.rs1:源寄存器1,需要读取得通用寄存器,该Bit域是寄存器的地址。
4.funct3:3位的功能码。
5.rd:5位的目的寄存器,用于存储指令的运算结果。
6.imm:不同长度的立即数 ,一般会扩展为32位再进行运算操作。
7.opcode:7位指令操作码,用于区分不同的指令
1.R型指令:用于寄存器与寄存器之间算术运算操作。
2.I型指令:用于寄存器与立即数之间算术运算和读存储器操作。
3.S型指令:用于写存储器。
4.B型指令:用于分支转移操作(属于S型指令的变体,之前也叫SB型指令)。
5.U型指令:用于高20比特位立即数操作。
6.J型指令:用于直接跳转(属于U型指令的变体,之前也叫UJ型指令