RISC-V特权架构 - 机器模式下的异常处理

RISC-V特权架构 - 机器模式下的异常处理

  • 1 进入异常
    • 1.1 从mtvec 定义的PC 地址开始执行
    • 1.2 更新CSR 寄存器mcause
    • 1.3 更新CSR 寄存器mepc
    • 1.4 更新CSR 寄存器mtval
    • 1.5 更新CSR 寄存器mstatus
  • 2 退出异常
    • 2.1 从mepc 定义的PC 地址开始执行
    • 2.2 更新CSR 寄存器mstatus
  • 3 异常服务程序

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

狭义的中断和异常,均可以被归于广义的异常范畴,因此本文自此将用“异常”作为统一概念进行论述,其包含了狭义上的“中断”和“异常”

RISC-V 定义的三种模式 User、Supervisor 和 Machine,均可发生异常,但是只有特权模式 SupervisorMachine 才能处理异常,因为处理异常需要 CSR 寄存器。默认情况下,RISC-V所有的异常,都在Machine模式下处理。除此以外,还可以通过委托机制,将异常委托给Supervisor模式下处理。

这里本文介绍的是Machine模式下的异常处理机制。

1 进入异常

进入异常时,RISC-V 架构规定的硬件行为,可以简述如下:

(1)停止执行当前程序流,转而从CSR 寄存器mtvec 定义的PC 地址开始执行。

(2)进入异常,不仅会让处理器跳转到,上述的PC 地址开始执行,还会让硬件,同时更新其他几个CSR 寄存器,分别是以下4 个寄存器:

  • 机器模式异常原因寄存器mcause(Machine Cause Register)
  • 机器模式异常PC 寄存器mepc(Machine Exception Program Counter)
  • 机器模式异常值寄存器mtval(Machine Trap Value Register )
  • 机器模式状态寄存器mstatus(Machine Status Register)

下文将分别予以详述。

1.1 从mtvec 定义的PC 地址开始执行

RISC-V 架构规定,在处理器的程序执行过程中,一旦遇到异常发生,则终止当前的程序流,处理器被强行跳转到一个新的PC 地址。该过程在RISC-V 的架构中定义为“陷阱(trap)”,字面含义为“跳入陷阱”,更加准确的意译为“进入异常”。

RISC-V 处理器trap 后跳入的PC 地址,由一个叫做机器模式异常入口基地址寄存器mtvec(Machine Trap-Vector Base-Address Register)的CSR 寄存器指定,其要点如下:

(1)mtvec 寄存器是一个可读可写的CSR 寄存器,因此软件可以编程更改其中的值。

(2)mtvec 寄存器的详细格式,如下图所示,其中的最低2 位是MODE 域,高30 位是BASE 域。(32位架构下,XLEN为32;64位架构下,XLEN为64。)
在这里插入图片描述

  • 假设MODE 的值为0,则所有的异常响应时,处理器均跳转到BASE 值指示的PC 地址。
  • 假设MODE 的值为1,则狭义的异常发生时,处理器跳转到BASE 值指示的PC 地址;狭义的中断发生时,处理器跳转到BASE+4*CAUSE 值指示的PC 地址。CAUSE的值,表示中断对应的异常编号(Exception Code),如下图所示(Machine cause register (mcause) values)。譬如机器计时器中断(Machine Timer Interrupt)的异常编号为7,则其跳转的地址为BASE+4×7=BASE+28= BASE+0x1c。

1.2 更新CSR 寄存器mcause

RISC-V 架构规定,在进入异常时,机器模式异常原因寄存器mcause(Machine Cause Register)被同时更新,以反映当前的异常种类,软件可以通过读此寄存器,查询造成异常的具体原因。

mcause 寄存器的详细格式,如下图所示,其中最高1 位为Interrupt 域,低31 位为异常编号域。
在这里插入图片描述
此两个域的组合表示值,如下图所示,用于指示RISC-V 架构定义的12 种中断类型和16 种异常类型。 在这里插入图片描述

1.3 更新CSR 寄存器mepc

RISC-V 架构定义,异常的返回地址由机器模式异常PC 寄存器mepc(Machine Exception Program Counter)保存。
在这里插入图片描述
在进入异常时,硬件将自动更新mepc 寄存器的值,为当前遇到异常的指令PC 值(即当前程序的停止执行点)。该寄存器将作为异常的返回地址,在异常结束之后,能够使用它保存的PC 值,回到之前被停止执行的程序点。

(1)值得注意的是,虽然mepc 寄存器会在异常发生时,自动被硬件更新,但是mepc 寄存器,本身也是一个可读可写的寄存器,因此软件也可以直接写该寄存器以修改其值。

(2)对于狭义的中断和狭义的异常而言,RISC-V 架构定义其返回地址(更新的mepc 值)有些细微差别:

  • 出现中断时,中断返回地址mepc 的值,被更新为下一条尚未执行的指令
  • 出现异常时,中断返回地址mepc 的值,被更新为当前发生异常的指令PC

注意:
如果异常由ecall 或ebreak 产生,由于mepc 的值被更新为ecall 或ebreak 指令自己的PC。因此在异常返回时,如果直接使用mepc 保存的PC值作为返回地址,则会再次跳回ecall 或者ebreak指令,从而造成死循环(执行ecall 或者ebreak 指令导致重新进入异常)。正确的做法是,在异常处理程序中,软件改变mepc指向下一条指令,由于现在ecall/ebreak(或c.ebreak)是4(或2)字节指令,因此改写设定 mepc=mepc+4(或+2) 即可。

1.4 更新CSR 寄存器mtval

在这里插入图片描述
RISC-V 架构规定,在进入异常时,硬件将自动更新机器模式异常值寄存器mtval(Machine Trap Value Register ),以反映引起当前异常的存储器访问地址或者指令编码。

  • 如果是由存储器访问造成的异常,譬如遭遇硬件断点、取指令、存储器读写造成的异常,则将存储器访问的地址,更新到mtval 寄存器中。
  • 如果是由非法指令造成的异常,则将该指令的指令编码,更新到mtval 寄存器中。

注意:mtval 寄存器,又名mbadaddr 寄存器,在某些早期版本的RISC-V 编译器中仅识别mbadaddr 名称。

1.5 更新CSR 寄存器mstatus

RISC-V 架构规定,在进入异常时,硬件将自动更新机器模式状态寄存器mstatus(Machine Status Register)的某些域。
在这里插入图片描述
(1)mstatus 寄存器的详细格式,如上图所示,其中的MIE 域,表示在Machine Mode 下中断全局使能。

  • 当该MIE 域的值为1 时,表示Machine Mode 下所有中断的全局打开。
  • 当该MIE 域的值为0 时,表示Machine Mode 下所有中断的全局关闭。

(2)RISC-V 架构规定,异常发生时有如下情况。

  • MPIE 域的值,被更新为异常发生前MIE 域的值。MPIE 域的作用,是在异常结束之后,能够使用MPIE 的值,恢复出异常发生之前的MIE 值。
  • MIE 的值,则被更新成为0(意味着进入异常服务程序后,中断被全局关闭,所有的中断都将被屏蔽不响应)。也就是说,RISC-V架构默认不支持中断嵌套。
  • MPP 的值,被更新为异常发生前的模式。MPP 域的作用,是在异常结束之后,能够使用MPP 的值,恢复出异常发生之前的工作模式。对于只支持机器模式(Machine Mode Only)的处理器核,则MPP 的值永远为二进制值11。

注意:由于为简化知识模型,在此仅介绍“只支持机器模式”的架构,因此对SIE、UIE、SPP、SPIE 等不做赘述。

2 退出异常

当程序完成异常处理之后,最终需要从异常服务程序中退出,并返回主程序。RISC-V架构定义了一组专门的退出异常指令(Trap-Return Instructions),包括MRET、SRET、和URET。

  • 其中MRET 指令是必备的;
  • 而SRET 和URET 指令,仅在支持监督模式和用户模式的处理器中使用。

注意:由于为简化知识模型,在此仅介绍“只支持机器模式”的架构,对SRET 和URET 指令不做赘述。

在机器模式下,退出异常时,软件必须使用MRET 指令。
RISC-V 架构规定,处理器执行MRET 指令后的硬件行为,如下:

  • 停止执行当前程序流,转而从CSR 寄存器mepc 定义的PC 地址开始执行。
  • 执行MRET 指令,不仅会让处理器跳转到上述的PC 地址开始执行,还会让硬件同时更新CSR 寄存器机器模式状态寄存器mstatus(Machine Status Register)。

下文将分别予以详述。

2.1 从mepc 定义的PC 地址开始执行

在上文中曾经提及,在进入异常时,mepc 寄存器被同时更新,以反映当时遇到异常的指令的PC 值。通过这个机制,意味着MRET 指令执行后,处理器回到了当时遇到异常的指令的PC 地址,从而可以继续执行之前被中止的程序流。

2.2 更新CSR 寄存器mstatus

mstatus 寄存器的详细格式,如上图所示。RISC-V 架构规定,在执行MRET 指令后,硬件将自动更新机器模式状态寄存器mstatus(Machine Status Register)的某些域。

RISC-V 架构规定,执行MRET 指令退出异常时有如下情况:

  • mstatus 寄存器MIE 域的值,被更新为当前MPIE 的值(恢复)。
  • mstatus 寄存器MPIE 域的值,则被更新为1。

在上文中曾提及,在进入异常时,MPIE 的值曾经被更新为异常发生前的MIE 值。而MRET 指令执行后,再次将MIE 域的值更新为MPIE 的值。通过这个机制,则意味着MRET指令执行后,处理器的MIE 值被恢复成异常发生之前的值(假设之前的MIE 值为1,则意味着中断被重新全局打开)。

3 异常服务程序

如上文中所述,当处理器进入异常后,即开始从mtvec 寄存器定义的PC 地址执行新的程序。该程序通常为异常服务程序,并且程序还可以通过查询mcause 中的异常编号(Exception Code)决定进一步跳转到更具体的异常服务程序。

譬如当程序查询mcause 中的值为0x2,则得知该异常,是非法指令错误(Illegal Instructions)引起的,因此可以进一步跳转到,非法指令错误异常服务子程序中去。

下图所示为一异常入口程序实例片段,程序通过读取mcause 的值,进而判断异常的类型,从而进入不同的异常服务子程序。
在这里插入图片描述

注意:
由于RISC-V 架构规定的进入异常和退出异常机制中没有硬件自动保存和恢复上下文的操作,因此需要软件明确地使用指令进行上下文的保存和恢复。


参考文档:

  • 《手把手教你设计CPU.RISC-V处理器》

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

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

相关文章

Android Tombstone 分析

1.什么是tombstone Tombstone是指在分布式系统中用于标记数据已被删除的记录,通常包含删除操作的时间戳和相关信息。 当一个动态库(native程序)开始执行时,系统会注册一些连接到 debuggerd 的signal handlers。当系统发生崩溃时…

Spark Shuffle Tracking 原理分析

Shuffle Tracking Shuffle Tracking 是 Spark 在没有 ESS(External Shuffle Service)情况,并且开启 Dynamic Allocation 的重要功能。如在 K8S 上运行 spark 没有 ESS。本文档所有的前提都是基于以上条件的。 如果开启了 ESS,那么 Executor 计算完后&a…

MySQL 表的基本操作,结合项目的表自动初始化来讲

有了数据库以后,我们就可以在数据库中对表进行增删改查了,这也就意味着,一名真正的 CRUD Boy 即将到来(😁)。 查表 查看当前数据库中所有的表,使用 show tables; 命令 由于当前数据库中还没有…

基于Python3的数据结构与算法 - 09 希尔排序

一、引入 希尔排序是一种分组插入排序的算法。 二、排序思路 首先取一个整数d1 n/2,将元素分为d1个组,每组相邻量取元素距离为d1,在各组内直接进行插入排序;取第二个整数d2 d1/2, 重复上述分组排序过程&#xff0…

CSS 自测题 -- 用 flex 布局绘制骰子(一、二、三【含斜三点】、四、五、六点)

一点 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>css flex布局-画骰子</title><sty…

Unity 切换场景

场景切换前必须要将场景拖动到Build中 同步加载场景 using System.Collections; using System.Collections.Generic; //using UnityEditor.SearchService; using UnityEngine; // 场景管理 需要导入该类 using UnityEngine.SceneManagement;public class c3 : MonoBehaviour {…

redis五大基础类型【重点】

之前写过一点小知识&#xff1a;https://blog.csdn.net/qq_45927881/article/details/134959181?spm1001.2014.3001.5501 参考链接 https://xiaolincoding.com/redis/data_struct/command.html#%E4%BB%8B%E7%BB%8D 目录 1. string&#xff08;字符串&#xff09;2. Hash&#…

MySql安全加固:配置不同用户不同账号禁止使用旧密码禁止MySql进程管理员权限

MySql安全加固&#xff1a;配置不同用户不同账号&禁止使用旧密码&禁止MySql进程管理员权限 1.1 检查是否配置不同用户不同账号1.2 检查是否禁止使用旧密码1.3 禁止MySql进程管理员权限 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496…

【c++】通讯录管理系统

1.系统功能介绍及展示 2.创建项目 3.菜单实现 4.退出功能实现 5.添加联系人—结构体设计 6.添加联系人—功能实现 7.显示联系人 8.删除练习人—检测联系人是否存在 9.删除联系人—功能实现 10.查找联系人 11.修改联系人 12.清空通讯录 #include <iostream> #include <…

什么是VR虚拟社区|VR元宇宙平台|VR主题馆加盟

VR虚拟社区是指一种基于虚拟现实技术构建的在线社交平台或环境&#xff0c;用户可以在其中创建虚拟化的个人形象&#xff08;也称为avatars&#xff09;并与其他用户进行交流、互动和合作。在VR虚拟社区中&#xff0c;用户可以选择不同的虚拟场景和环境&#xff0c;如虚拟公园、…

fly-barrage 前端弹幕库(3):滚动弹幕的设计与实现

项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff1b; &#x1f451;&#x1f40b;&#x1f389;如果感觉项目还不错的话&#xff0c;还请点下 star &#x1f31f;&#x1f31f;&#x1f31f;。 Gitee&#xff1a;https://gitee.com/fei_fei27/fly-barrage&a…

显示器开机正常,插入HDMI线却不显示画面,换了HDMI线还是不行?

环境&#xff1a; 惠普/P24VG4 DELL笔记本 问题描述&#xff1a; 显示器开机正常&#xff0c;插入HDMI线却不显示画面&#xff0c;换了HDMI线还是不行&#xff0c;是不是显示器坏了&#xff1f; 解决方案&#xff1a; 1.前往显示器设置菜单里面查看input 2.把输入源默认设…

二百二十五、海豚调度器——用DolphinScheduler调度执行Flume数据采集任务

一、目的 数仓的数据源是Kafka&#xff0c;因此离线数仓需要用Flume采集Kafka中的数据到HDFS中 在实际项目中&#xff0c;不可能一直在Xshell中启动Flume任务&#xff0c;一是项目的Flume任务很多&#xff0c;二是一旦Xshell页面关闭Flume任务就会停止&#xff0c;这样非常不…

案例研究|DataEase助力众陶联应对产业链数据可视化挑战

佛山众陶联供应链服务有限公司&#xff08;以下简称为“众陶联”&#xff09;成立于2016年&#xff0c;是由34家陶瓷企业共同创办的建陶行业工业互联网平台&#xff0c;股东产值占整个行业的22.5%。众陶联以数据赋能为核心&#xff0c;积极探索新的交易和服务模式&#xff0c;构…

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版 带自动采集 开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 包含火车头采集规则和模块&#xff0c;采集目标站非小号官网。 专业的数字货币大数据平台模板&#xff0c;采用帝国cms7.5内核仿制&#xff0…

Ai-WB2-32S在window下使用vs 和 msys2编译以及烧录

文章目录 前言一、使用前准备第一步 安装vscode第二步 安装msys2 二、使用步骤1.打开MSYS2 MINGW64&#xff08;1&#xff09;在开始栏中找到MSYS2 MINGW64并打开&#xff08;2&#xff09;安装git&#xff08;3&#xff09;安装make&#xff08;4&#xff09;安装好之后的文件…

Redis 之五:Redis 的主从复制

概念 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务器都是主节…

云天励飞战略投资神州云海,布局机器人市场

日前,AI上市企业云天励飞(688343.SH)完成了对深圳市神州云海智能科技有限公司(以下简称“神州云海”)的B轮战略投资。 公开资料显示,自2015年于深圳创立以来,神州云海始终聚焦人工智能与服务机器人广阔的应用市场,依托自主的核心算法能力,深耕机器人硬件本体研发,整合上下游产…

RabbitMQ-TTL/死信队列/延迟队列高级特性

文章目录 TTL死信队列消息成为死信的三种情况队列如何绑定死信交换机 延迟队列RabbitMQ如何实现延迟队列 总结来源B站黑马程序员 TTL TTLTTL(Time To Live):存活时间/过期时间当信息到达存活时间后&#xff0c;还没有被消费&#xff0c;会被自动清除。RabbitMQ可以对消息设置过…

Win10系統如何重置系统

Win10系統如何重置 大家可以使用Win10內建的重設電腦設定&#xff0c;如以下操作&#xff1a; 首先&#xff0c;可以先到桌面左下角的【開始】 選擇【設定】 在【設定】裡找到【更新與安全性】 在左側欄有一項【復原】 在復原的標題下&#xff0c;副標題有一項【重設此電腦】…