【RISC-V】risc-v架构学习笔记(架构初学)

Register

介绍

RISC-V架构提供31个用户可修改的通用(基本)寄存器,即x1到x31,以及一个额外的只读寄存器x0,硬连接到0。x0寄存器的一个常见用途是帮助将其他寄存器初始化为零。
• 共有31个通用寄存器。

• 其中7个是临时寄存器(t0−t6)。

• a0−a7用于函数参数。s0−s11用于保存寄存器或函数定义内。

• 一个堆栈指针,一个全局指针和一个线程指针寄存器。

• 一个返回地址寄存器(x1),用于存储函数调用的返回地址。

• 一个程序计数器(pc)。PC保存着当前指令的地址。

• 所有寄存器都可以作为通用寄存器使用
在这里插入图片描述

Stack Pointer Register(SP)

在RISC-V体系结构中,x2寄存器被用作栈指针(sp),并保存栈的基址。此外,栈基址必须对齐到4个字节。如果不这样做,可能会出现加载/存储对齐错误。

Global Pointer Register(GP)

RISC-V使用x3 (gp)寄存器将所有全局变量放置在指定的特定区域。x3寄存器将保存全局变量所在位置的基址。

Thread Pointer Register(TP)

在多线程应用程序中,每个线程可能有自己的私有变量集,称为“线程特定变量”。这组变量将由寄存器x4 (tp)指向。
因此,每个线程在其x4寄存器中都有一个不同的值。

Return Address Register(RA)

x1 (ra)寄存器用于保存子程序的返回地址。在执行子程序调用之前,x1设置为子程序的返回地址,通常为“pc + 4”。标准的软件调用约定使用x1 (ra)寄存器来保存函数调用的返回地址。

Argument Register(参数寄存器)

在RISC-V中,8个参数寄存器,即x10−x17(对应a0−a7)用于在子程序中传递参数。
在子程序调用之前,子程序的参数被复制到参数寄存器。在参数数量超过8的情况下使用栈。

Temporary Register(临时寄存器)

临时寄存器用于在指令执行期间保存中间值。在RISC-V中有7个临时寄存器(t0−t6)。

Privilege mode

在这里插入图片描述
在这里插入图片描述

risc-v架构将特权等级分为三个M、S、U。
User Mode:简称U 通常运行应用程序
Supervisor Mode:简称S 通常运行操作系统
Machine Mode:简称M 用于管理安全执行环境,最高权限,必选,其他两种模式都是可选的。
在这里插入图片描述
三种模式可以互相切换

Control and Status Registers (CSRs)

Registers

CSR寄存器非常多,下图为一些经常使用到的寄存器
在这里插入图片描述

MSTATUS(Machine Status Register)

Machine Status Register(MSTATUS)寄存器详细描述了机器的状态,并帮助控制机器的状态。mstatus寄存器有几个位来控制机器的不同状态。
!](https://img-blog.csdnimg.cn/f0edc61f00a84ea6ae1531f5dac9c6ee.png)

MSTATUS包含许多可以读取和更新的字段。通过修改这些字段,软件可以做一些事情,比如启用/禁用中断和更改虚拟内存模型等。
mstatus.MIE:Machine- Mode interrupt enable,机器模式全局中断使能位
mstatus.SIE: Supervisor-Mode interrupt enable,管理员模式全局中断使能位
x IE:=1则使能全局中断,=0则关闭全局中断,其只能控制小于或等于x模式下的中断,比如SIE=0,M模式下的中断不受其影响。
mstatus.MPIE:Machine- Mode previous interrupt enable,机器模式先前中断使能位
mstatus.SPIE:Supervisor-Mode previous interrupt enable,管理员模式先前中断使能位
x PIE:保存在trap之前interrupt-enable(x IE)位的值。
mstatus.MPP:Machine- Mode previous privilege,机器模式先前特权模式
mstatus.SPP:Supervisor- Mode previous privilege,管理员模式先前特权模式
x PP:保存trap之前的特权模式。xPP字段只能持有最多x的特权模式,因此MPP是2位宽,SPP是1位宽。
mstatus.MPRV:MPRV (Modify PRiVilege)位修改有效特权模式,即加载和存储执行时的特权级别。当MPRV=0时,使用当前特权模式的转换和保护机制,加载和存储行为正常。当MPRV=1时,加载和存储内存地址被转换和保护,并应用字节顺序,就好像当前特权模式被设置为MPP。指令地址转换和保护不受MPRV设置的影响。如果不支持U-mode,则MPRV为只读0。
当使用mret从trap中返回。会根据MPP的值来确定返回的新的特权模式,然后硬件改写mstatus中的MPP=0,MIE=MPIE,MPIE=进trap前的MIE,并设置PC=MEPC。

MCAUSE(Machine Cause Register)

Machine Cause Register寄存器是一个mxlen位的读写寄存器。当一个trap被带入m模式时,mcause被硬件写入一个代码,指示导致该trap的事件。如果trap是由中断引起的,则设置mcause寄存器中的中断bit位。
在这里插入图片描述
在这里插入图片描述

MTVEC(Machine Trap Vector Base Address register)

MTVEC用于存储Trap处理程序的地址。就是存储中断向量表的基地址。写入MTVEC的地址必须是4字节对齐的地址,不然异常向量表不生效
在这里插入图片描述
在这里插入图片描述
当MODE=Direct时,所有进入机器模式的trap都会导致pc被设置为BASE字段中的地址。当MODE= vector时,所有进入机器模式的同步异常都会导致pc被设置为BASE字段中的地址,而异步中断会导致pc被设置为BASE字段中的地址加上中断cause数的四倍。

MEPC(Machine Exception Program Counter)

它保存导致trap的指令的地址。
在这里插入图片描述

MIE(Machine Interrupt Enable Register)

中断使能寄存器,区别于mstatus.MIE作为全局控制,MIE是局部控制。
在这里插入图片描述
MEIE:M模式外部中断使能位
SEIE:S模式外部中断使能位
MTIE:M模式timer中断使能位
STIE:S模式外部中断使能位
MSIE:M模式软中断使能位
SSIE:S模式软中断使能位

MIP(Machine Interrupt Pending Register )

中断挂起寄存器,包含关于挂起中断的信息。
我的理解:当正在处理一个中断,并且mie关掉中断时,同时设置了mip,此时产生了另一个中断则其会被pending,则MIP里对应的中断信息会被记录。
在这里插入图片描述
MEIP:M模式外部中断挂起位
SEIP:S模式外部中断挂起位
MTIP:M模式timer中断挂起位
STIP:S模式外部中断挂起位
MSIP:M模式软中断挂起位
SSIP:S模式软中断挂起位

MSCRATCH

mscratch 寄存器用于机器模式下的程序临时保存某些数据。mscratch 寄存器可以提供一
种快速的保存和恢复机制。譬如,在进入机器模式的异常处理程序后,将应用程序的某个通
用寄存器的值临时存入 mscratch 寄存器中,然后在退出异常处理程序之前,将 mscratch 寄
存器中的值读出恢复至通用寄存器。

CSR Instructions

Register to Register instructions

在系统的两个寄存器上执行指定的操作,并将结果留在指定的寄存器中。

CSRRC

CSRRC:CSR Read and Clear Bits,用于清除CSR。
将之前CSR的值复制到目的寄存器,然后将CSR的一些选定位清除为0,rs1的值作为位掩码,用于选择CSR中哪些位需要清除(逻辑与 and)。
例子:
csrrc x1, mcause, x2 将之前的mcause读取到x1,并与x2逻辑与
在这里插入图片描述

CSRR

CSRR:CSR Read,用于读取CSR。
CSRR指令用于读取CSR的值。将CSR的前一个值复制到目标寄存器。这是一个原子读取操作。
例子:
csrr x1, mtvec 读取mtvec到x1
在这里插入图片描述

CSRRW

CSRRW:CSR Read and Write,用于读写CSR。
将CSR的前一个值复制到目标寄存器,源寄存器的值(rs1)被复制到CSR,这是一个原子写操作。要读取CSR而不写入它,源寄存器(rs1)可以指定为x0。要编写CSR而不读取它,目标寄存器(rd)可以指定为x0。这是一个原子操作。
简单来说就是rd是读CSR到rd中,rs1是将rs1的值写入到CSR。
例子:
csrrw x0, mtvec, x1 将x1中的值写入mtvec

csrrw x1, mtvec, x0 读取mtvec到x1
csrrw x1, mtvec, x2 读取之前mtvec到x1,将x2写入mtvec
在这里插入图片描述

CSRRS

CSRRS:CSR Read and Set Bits,用于设置CSR的位。
将CSR之前的值复制到目标寄存器,然后将CSR的某些位设置为0,rs1中的值用作位掩码,用于选择在CSR中设置哪些位(逻辑或 or)。
例子:
csrrs x1, mstatus, x2 读取mstatus到x1,并与x2逻辑或
在这里插入图片描述

Immediate Instructions

CSRRCI

CSRRCI:CSR Read and Clear Immediate
将之前CSR的值复制到目的寄存器,然后将立即数与CSR进行逻辑与操作,清除CSR指定的位。
例子:
csrrci x1, mie, 3 保存mie的值到x1中,并将mie与3按位与
在这里插入图片描述
其他的寄存器与上述寄存器到寄存器的指令同理

Trap

Exception

异常通常是同步的,并且总是与程序集指令相关联。异常可能在指令执行的任何阶段出现。例如,在指令解码阶段,硬件可能会检测到一个错误的操作码字段。这将触发一个“非法指令”异常。当异常发生时,硬件用相应的异常代码设置mcause寄存器。
pc被设置为trap处理程序的基地地址。异常代码有助于识别异常的类型。在RISC-V中可能的异常列在表中
Illegal instruction (非法指令异常):当程序试图执行任何非法指令时,会发生异常。例如,试图写入只读CSR寄存器将产生非法指令异常。
Instruction/Load/Store address misaligned (指令地址错位异常):当程序试图执行无条件跳转或执行目标地址不是4字节对齐的分支时,会发生异常。例如,执行一个起始地址为0x80000001的程序。这将在无条件跳转时生成一个指令地址错位异常。
Instruction/Load/Store access fault (访问异常):当程序试图执行加载指令以访问来自未对齐地址或非4字节对齐的地址的数据时,会发生异常。例如,试图访问一个数据段而没有正确对齐,就会导致这个异常。
Environment call (环境调用异常):当程序执行系统调用时发生此异常。需要使用RISC-V的ecall调用指令。调用指令还可以用于从低权限模式切换到高权限模式。指令:ecall
Break point :当程序执行程序中设置的断点以进入调试模式时,会发生异常。

Handle Exception

一旦发生异常,处理器将停止执行并将控制传递给trap处理程序。
在此过程中,处理器特权被设置为Machine模式,处理器使用异常代码设置mcause寄存器。mepc设置为发生异常前指令所在的pc。所有异常都首先出现在机器模式trap处理程序中。这适用于来自不同特权级别的异常。机器模式trap处理程序在机器模式中执行。在trap处理程序中,首先寄存器的上下文被保存在栈中。然后处理trap。在此之后,栈中保存的上下文将被恢复。通过这种方式,可以在不给执行流造成太多麻烦的情况下处理trap。

硬件如何跳转到trap处理程序? 这是通过使用trap处理程序的物理地址设置mtvec寄存器来建立的。通常将mtvec中的值称为“Trap entry”。

我们有时可能不希望在Machine Mode中处理异常。我们可能想把它弄进去
管理员模式甚至用户模式。因此,可以将一些或所有trap“delegate”委托给较低的特权级别。

MRET:机器模式Trap处理程序返回(MRET)用于从正在机器模式中执行的Trap处理程序返回。
一旦trap服务和保存的上下文被恢复。可以调用mret指令。
这条指令基本上是告诉处理器将控制权传递回mepc寄存器中的地址。来自较低特权级别的异常。MRET指令将控制转移到该特权级别。状态寄存器的MPP字段将被引用,以确定返回到哪个模式(m, s,或u)。返回将通过将保存的程序计数器从mepc复制到程序计数器(pc)来实现。

Exception Registers

mie、mstatus、mepc、mtvec、mcause等。参考CSR章节。

Interrupt

中断是由外部源触发的异步事件。处理器可能倾向于处理或忽略中断。中断可以是软件中断,也可以是硬件中断。在RISC-V中断中,分为定时器中断(Timer Interrupts)、软件中断(Software Interrupts)和外部中断(External Interrupts)。外部中断也称为全局中断。定时器中断在core中处理。软件中断是处理器内部(核间中断)的,外部中断由PLIC模块处理。在本章中,我们将学习如何在RISC-V中处理定时器和外部中断。

Timer Interrupts

当一个单独的定时器电路指示一个预定的间隔已经结束时,timer interrupt就会产生。将中断当前正在执行的代码。定时器中断由操作系统处理,操作系统使用它们来实现时间片多线程。
mtime Register
是一个同步计数器。它从处理器上电开始运行,并以滴答数提供当前的实时时间。
mtimecmp Register
这个寄存器用于存储计时器中断将要发生的时间。
mtimecmp的值与mtime进行比较。当mtime值大于mtimecmp时,发生定时器中断。mtime和mtimecmp寄存器都是64位内存映射寄存器。

External Interrupts

External Interrupts外部中断来自处理器外部,这种中断是异步的,由外部源通过硬件产生,由处理器处理。例如,在嵌入式过程控制系统中使用的RISC-V处理器可能会接收来自各种要求采取适当行动的传感器的外部中断。这些中断由平台级中断控制器(PLIC)处理。PLIC的中断源是连接到SoC (IO, UART, SPI等)的设备。根据RISC-V规范,这些被称为全局中断源,每个中断源被PLIC优先排序并路由到核心。

Software Interrupts

Software Interrupts软中断是由在机器状态字中设置一个位引起的。在多核芯片中,运行在一个核上的线程需要向另一个核发送中断信号。

  • 11
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: RISC-V架构手册是一本介绍RISC-V指令集体系结构的重要参考资料。RISC-V是一种开放的指令集架构,具有可扩展性、灵活性和高效性的特点。 首先,RISC-V架构手册详细介绍了RISC-V指令集中的所有指令,包括常用的算术指令、逻辑指令、存取指令、分支指令等。它不仅列出了每个指令的编码格式和操作码,还详细说明了每个指令的功能和使用方法。这样的信息对于开发RISC-V处理器的工程师来说至关重要。 其次,RISC-V架构手册还介绍了RISC-V处理器的基本结构和中断处理机制。它详细解释了数据通路、控制单元和存储器等组件的连接方式和工作原理。同时,手册还讨论了RISC-V处理器的中断处理流程,包括中断的触发条件、中断处理程序的执行和中断返回等。这对于编写操作系统或者驱动程序的开发者来说非常有帮助。 此外,RISC-V架构手册还包含了关于扩展特性和可选模块的说明。它介绍了如何在RISC-V架构上扩展自定义指令或者功能,以及如何添加可选的模块,如浮点单元、虚拟内存管理等。这样的灵活性使得RISC-V架构非常适合于各种应用领域,从嵌入式系统到超级计算机。 总的来说,RISC-V架构手册是开发人员和研究人员掌握RISC-V指令集和架构设计的重要参考资料。它全面介绍了RISC-V指令集的各个方面,并提供了实现RISC-V处理器的指导。通过学习和理解这本手册,人们可以更好地应用和推广RISC-V架构,推动开源指令集的发展。 ### 回答2: RISC-V(精简指令集计算机-五)架构手册是一份完整的指南,用于描述和解释RISC-V计算机架构的细节和规范。这个手册为开发者和研究人员提供了一个详细的参考,以了解和标准化他们在RISC-V处理器设计和实现方面的工作。 RISC-V架构手册包含多个章节和附录,涵盖了RISC-V指令集的不同方面。它首先介绍了RISC-V的设计原理和目标,比如简洁性、可扩展性和定制化能力。然后,手册详细说明了RISC-V指令集的不同指令格式和编码规则,包括指令解码过程和操作码的定义。 这个手册还涵盖了RISC-V的寄存器和寄存器文件,描述了它们的使用方法和特殊规则。此外,手册还提供了关于异常处理机制和中断处理机制的解释,以及RISC-V中的特权级别和特权模式的详细信息。 RISC-V架构手册还包含了有关内存管理单元(MMU)和虚拟内存系统的信息,说明了RISC-V支持的不同内存访问方式和存储体系结构的细节。此外,手册还提供了有关浮点运算和向量指令集的详细说明以及其使用方法。 除了这些主要内容外,RISC-V架构手册还提供了一些附录,包括指令集的变种和扩展,以及示例代码和编程实例。这些附录为开发者提供了实际应用和开发RISC-V处理器的指导支持。 总之,RISC-V架构手册是一个重要的参考资料,用于理解和使用RISC-V计算机架构。它的详细说明和规范为开发者提供了标准化和统一化的参考,以便设计、实现和优化RISC-V处理器。 ### 回答3: RISC-V架构手册是一本详细介绍RISC-V指令集架构的重要参考资料。RISC-V是一种新兴的开源指令集架构,其优势在于简洁、可扩展和高度灵活。RISC-V架构手册系统地介绍了RISC-V指令集的各种特性和用法。 首先,RISC-V架构手册提供了RISC-V指令集的全面介绍。它详细解释了RISC-V的指令编码方式、寄存器组织、内存管理机制等基本概念。通过学习手册,人们可以了解到RISC-V指令的格式和操作方式,从而能够编写符合RISC-V架构的程序。 其次,RISC-V架构手册系统介绍了RISC-V的扩展指令集。RISC-V提供了一种模块化的设计理念,允许用户根据不同的应用需求选择使用不同的指令集扩展。手册详细介绍了RISC-V的各种扩展,如乘法/除法扩展、向量扩展等,并提供了使用这些扩展的示例和指导。 另外,RISC-V架构手册还介绍了RISC-V的异常处理和中断机制。这些机制对于系统安全和稳定运行非常重要。手册详细解释了异常和中断的分类、处理流程以及相关的指令和寄存器。通过学习手册,人们可以了解到如何在RISC-V架构中设计有效的异常处理和中断控制机制。 最后,RISC-V架构手册还介绍了RISC-V的特殊指令和特殊寄存器。这些特殊指令和寄存器常用于系统级编程和性能优化。手册提供了这些指令和寄存器的详细说明和使用方法,帮助人们充分发挥RISC-V架构的优势。 综上所述,RISC-V架构手册是学习和理解RISC-V指令集架构的重要工具。通过研读手册,人们可以掌握RISC-V的基本概念、指令格式和操作方式,进而能够灵活应用RISC-V的各种扩展和特殊功能,为不同的应用场景设计高效的RISC-V架构系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值