RISC-V-中断和异常 笔记


1.0 中断(interruupt)

中断是处理器在顺序执行程序指令流的过程中突然被别的请求打断而终止执行当前的程序,转而去处理别的事情,待处理完别的事情,然后重新回到之前程序中断的点继续执行之前的程序指令流。中断处理是一种正常的机制,而不是一种错误情形。
处理器收到中断请求之后,需要保存当前程序的现场,简称为“保存现场”;等到处理完中断服务程序之后,处理器需要恢复之前的现场,从而继续执行之前被打断的程序,简称为“恢复现场”。
多个中断源同时向处理器发起请求,需要“中断仲裁”,同时可以给不同中断分配优先级以便仲裁(中断优先级)。

1.0.1 中断类型

外部中断(external interrupt)
     来自于处理器核外部的中断,譬如外部设备UART、GPIO等产生的中断。机器模式外部中断可以作为处理器核的一个单比特输入信号,假设处理器需要支持很多个外部中断源,RSIC-V架构定义了一个平台级别中断控制器(PLIC)可用于多个外部中断源的优先级仲裁和派发。
----PLIC可以将多个外部中断源仲裁为一个单比特的中断信号送入处理器核中,处理器核收到中断进入异常服务程序后,可以通过读PLIC的相关寄存器查看中断源的编号和信息。
——PLIC的每个中断目标均可以设置特定的优先级阈值(threshold),只有中断源 的优先级高于此阈值,中断才能够被发送给中断目标。中断目标的优先级阈值寄存器应该是存储器地址映射的可读可写寄存器,从而软件可以通过编程配置不同的阈值来屏蔽比阈值低优先级的中断源。
×××PLIC为每个中断源分配了功能组件和参数:
××××闸口(gateway)和IP
每个闸口都有对应的中断等待寄存器;闸口将不同触发类型的外部中断转换成统一的内部中断请求,对与同一个中断源而言,闸口保证一次只发送一个中断请求(request)。闸口发送一个中断请求后则启动屏蔽,如果中断没有被处理完成,则后续的中断会被闸口屏蔽住。
××××编号(ID)
PLIC为每一个中断源分配了一个独一无二的编号(ID),ID标号0被预留,作为表示“不存在的中断“,因此有效的ID从1开始。
××××优先级(priority)
每个中断源的优先级寄存器应该是存储器地址映射的可读可写寄存器,从而使得软件可以对其编程配置不同的优先级。优先级0意味着”不可能中断“,相当于此中断源屏蔽。
××××使能(enable)
PLIC为每个中断目标的每个中断源分配了一个中断使能寄存器,配置为0时,表示此中断源对应中断目标被屏蔽;配置为1时,表示此中断源对应中断目标被打开。
×××PLC的处理机制:
××××对于每个中断目标来说,必须满足IE(中断使能寄存器)为1、优先级大于0、经过了闸口发送(IP寄存器的值为1),才可以参与仲裁。如果参与仲裁的多个中断源具有相同的优先级,仲裁则选择ID数目最小的中断源。
××××如果仲裁出的中断源优先级高于中断目标的优先级阈值,则产生最终的中断通知(Notification),否则不产生最终中断通知。经过仲裁之后,如果对中断目标产生中断通知,则向该中断目标生成一根电平触发的中断线。
××××如果收到了中断通知,且决定对该中断进行响应,则需要向PLIC发送中断响应(interrupt claim)的消息。PLIC实现一个存储器地址映射的可读寄存器,中断目标可以通过对此寄存器进行读操作,达到中断响应的目的。作为反馈(claim response),此读操作将返回一个ID,表示当前仲裁出的中断源对应的中断ID。PLIC接收到中断响应的寄存器读操作,且返回了中断ID之后,硬件自动将对应中断源的IP寄存器清0 。
××××完成了某个中断源的中断处理操作,则需要向PLIC发送中断完成(completion)的消息。PLIC实现一个存储器地址映射的可写寄存器,中断目标可以通过对此寄存器进行写操作达到中断完成的目的。接收到中断完成的寄存器写操作之后,硬件中断将对应中断源的闸口解除屏蔽。
----处理器核在处理完相应的中断服务程序后,可以通过写PLIC的相关寄存器和具体的外部中断源的寄存器,从而清除中断源。
计时器中断(timer interrupt)
—-RSIC-V架构在机器模式、监督模式和用户模式下均有对应的计时器中断。
—-mtime寄存器用于反映当前计时器的计数值(为实时(real-time)计时器),mitemecmp用于设置计时器的比较值。当mtime中的计数值大于或者等于mtimecmp中设置的比较值时,计时器便会产生计时器中断。计时器中断会一直拉高,直到软件重新写mtimecmp寄存器的值,使得其比较值大于mtime中的值,从而将计时器中断清除。
软件中断(software interrupt)
—-是指来自软件自己触发的中断。
—-RSIC-V架构在机器模式、监督模式和用户模式下均有对应的软件中断。
—-机器模式软件中断可以通过软件写1至msip(存储器地址映射的系统寄存器)寄存器来触发。
调试中断(debug interrupt)
—专用于实现调试器(debugger),只有调试器介入调试时才发生。正常情况下不会发生。

1.0.2 中断优先级

3中中断同时发生时,其响应的优先级顺序如下,mcause寄存器中将按此优先级顺序选择更新异常编号的值。
—外部中断(优先级最高)
—软件中断(其次)
—计时器中断(再次)

2.0 异常(exception)

异常,是处理器核在顺序执行程序指令流的过程中突然遇到了异常的事情而中止执行当前的程序,转而去处理该异常。异常和中断的最大区别在于中断往往是一种外因,而异常是处理器内部事件导致的(比如硬件故障、程序故障)。与中断服务程序类似,处理器也会进入异常服务处理程序。

2.0.1 进入异常

1.停止执行当前程序流,转而从CSR寄存器mtvec定义的pc地址开始执行(4.0.10小节)。
2.进入异常不仅会让处理器跳转到上述指定的PC开始执行,还会让硬件同时更新其他几个CSR寄存器(mcause、mepc、mtval、mstatus)。

2.0.2 退出异常

当程序完成异常处理之后,最终要从异常服务程序中退出,并返回主程序。RSIC-V专门定义了一组退出异常指令(trap-return instructions),
在机器模式下退出异常时,软件必须使用MRET指令。

3.0 同步异常和异步异常

从广义上来讲,中断和异常都被认为是一种广义上的异常。

3.1 同步异常(synchronous exception)

是指由于执行程序指令流或者试图执行程序指令流而造成的异常。这种异常能够被精确定位于某一条执行的指令。

3.2 异步异常(asynchronous exception)

指那些产生原因不能够被精确定位于某条指令的异常。最常见的异步异常是“外部中断”,它的发生是由外围设备驱动的,本身就带有偶然性。

3.2.0 精确异步异常(precise)

指响应异常后的处理器状态能够精确反映为某一条指令的边界,即某一条指令执行完之后的处理器状态。

3.2.1 非精确异步异常(imprecise)

指响应异常后的处理器状态能够精确反映为某一条指令的边界,即某一条指令执行完之后的处理器状态。
eg:访问存储器需要一定的时间,处理器往往不可能等待该访问结束,而是继续执行后续的指令。等到访存结果从目标存储器返回来之后,发现出现了访存错误并报异常,但是处理器此时可能已经执行到了后续的某条指令,难以精确定位。

4.0 控制和状态寄存器(CSR)

RSIC-V的架构中定义了CSR,用于配置或记录一些运行的状态,是核内部的寄存器,使用自己的地址编码空间,与存储器寻址的地址空间没有关系。使用其专有的12位地址编码空间。

4.0.1 misa

用于指示当前处理器所支持的架构特性,最高两位misa[63:62]用于指示当前处理器所支持的架构位数。misa[25:0]用于指示当前处理器所支持的RSIC-V ISA中不同模块化指令子集,比如G:I、M、A、F和D对应域的值即为高。

valuemeaning
0reserved
1RV32
2RV64
3RV128

4.0.2 mvendorid

该寄存器是只读(read-only)寄存器,反映该处理器的商业供应编号(vendor ID)。

4.0.3 marchid

该寄存器是只读(read-only)寄存器,反映该处理器的硬件实现微架构编号(micro-architecture ID)。

4.0.4 mimpid

该寄存器是只读(read-only)寄存器,反映该处理器的硬件实现编号(implementation ID)。

4.0.5 mhartid

该寄存器是只读(read-only)寄存器,反映当前Hart的编号(Hart ID)。RSIC-V架构规定,如果在单Hart或多Hart的系统中,起码要有一个Hart的编号必须是0。Hart表示一个硬件线程。

4.0.6 fflags

fflags寄存器为浮点控制状态寄存器(fcsr)中浮点异常标志位域的别名。方便使用CSR指令直接地单独读写浮点异常标志位域。

4.0.7 frm

该寄存器为浮点舍入模式(rounding mode)域的别名,方便使用CSR指令直接地单独读写浮点舍入模式。

4.0.8 fcsr

RSIC-V规定,如果支持单精度浮点指令或双精度浮点指令,则需要增加一个控制状态寄存器。它包含了浮点异常标志位域和浮点舍入模式域。

4.0.9 mstatus

该寄存器是机器模式(machine mode)下的状态寄存器,包含了若干不同的功能域。
MIE域: 表示全局中断使能,为1时表示所有中断的全局开关打开;为0时表示全局关闭所有的中断。
MPIE 和 MPP域:分别用于保存进入异常之前MIE域和特权模式(privilege mode)的值。
      RSIC-V架构规定,处理器进入异常时:
      MPIE域的值被更新为当前MIE的值。
      MIE的值则被更新为0(进入异常服务程序后中断被屏蔽)。
      MPP的值被更新为异常发生前的模式(如果只支持机器模式,则MPP的值永远为11)。作用是在异常结束后,能够使用MPP的值恢复出异常发生之前的工作模式。
FS 域:用于维护或反映浮点单元的状态。
      FS域上电后的默认值为0,意味着浮点单元的状态为off。使用浮点单元时,需要使用CSR写指令将FS的值改写为非0值。
      如果FS的值为1或者2,当执行了任何的浮点指令之后,FS的值会自动切换为3,表示浮点单元的状态为脏(dirty)(状态发生了改变)。
     当浮点单元的功能关闭之后,任何访问浮点CSR寄存器的操作或者任何执行浮点指令的行为都将会产生非法指令异常。
XS 域:与FS域的作用类似,但是其用于维护或反映用户自定义的扩展指令单元状态,这个域主要由软件控制。
SD 域:该域是一个只读域,反映了XS域或FS域处于(dirty)状态(方便快速查阅)。

4.0.10 mtvec

机器模式异常入口基地址寄存器,可读可写(因此软件可以编程更改其中的值);用于配置异常入口的地址,在处理器的程序执行过程中,一旦遇到异常发生,则终止当前的程序流,处理器被强行跳转到一个新的PC地址,该过程在RSIC-V的架构中定义为陷阱(trap),字面的含义为“跳入陷阱”,更加准确的含义为“进入异常”。进入异常后跳入的pc地址由mtvec指定。

4.0.11 mepc

机器模式异常PC寄存器,可读可写(软件可以直接写该寄存器以修改其值);用于保存进入异常之前指令的PC值,作为异常的返回地址。处理器进入异常时,mepc寄存器被同时更新以反映当前遇到异常的指令的pc值。
     出现中断时:中断返回地址mepc被指向下一条尚未执行的指令,因为中断时的指令能够被正确执行。
     出现异常时:mepc则指向当前指令,因为当前指令触发了异常。

4.0.12 mcause

机器模式异常原因寄存器;用于保存进入异常之前的出错原因,以便对异常原因进行诊断和调试。处理器进入异常时,mcause寄存器被同时更新以反映当前遇到异常的原因。其最高位为中断域,低31位为异常编号(exception code)。

4.0.13 mtval

机器模式异常值寄存器;用于保存进入异常之前出错指令的编码值或存储器访问的地址值,以便对异常原因进行诊断和调试。

4.0.14 mie

该寄存器用于控制不同中断类型的局部屏蔽(mstatus寄存器中的mie域提供了全局的中断使能)。mie寄存器的每一个域用于控制每个单独的中断使能,MEIE/MTIE/MSIE域分别控制机器模式下的外部中断(external interrupt)、计时器中断(timer)和软件中断(software)的屏蔽。

4.0.15 mip

该寄存器用于查询中断的等待(pending)状态,每一个域用于反映每个单独的中断等待状态。

4.0.16 mscratch

用于机器模式下的程序临时保存某些数据,

4.0.17 mcycle、mcycleh

RSIC-V架构定义了一个64bit 的时钟周期计数,反映处理器执行了多少个时钟周期。只要处理器出去执行状态,此计数器便会不断自增计数,其自增的时钟频率由处理器的硬件实现自定义。mcycle反映了该计数器低32位值,mcycleh反映了该计数器高32位值,衡量了处理器的性能

4.0.18 minstret、minstreth

RSIC-V架构定义了一个64bit 的执行指令计数器,反映处理器成功执行了多少条指令。只要处理器每成功执行一条指令,此计数器便会自增计数。上面两个寄存器分别存储计数器的低、高32bit 。

4.0.19 mtime、mtimecmp、msip

RSIC-V架构定义了一个64bit 的计时器,计时器的值实时反映在mtime寄存器中,且该计时器可以通过mtimecmp寄存器配置其比较值,从而产生中断。RSIC-V架构定义了一种软件中断,可以通过软件写1至msip寄存器来触发。将(mtime、mtimecmp)寄存器定义为存储器地址映射的系统寄存器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值