当前位置: 首页 > news >正文

riscv中断处理软硬件流程总结

trap相关csr

在这里插入图片描述

trap初始化

需要在程序里先设置好mtvec,如果需要中断委托的话还需要设置mideleg、medeleg。

硬件处理过程

硬件先去关中断

  • 设置mstatus.xPIE为trap发生时xIE的值。
  • 设置mstatus.xIE为0。
  • 设置mepc为 当前指令(异常)或下一条指令的地址(中断)。
    指令触发同步异常后,处理程序处理后再重新执行一次这个指令。例如:缺页异常。
    如果是中断的话,在这个指令执行末尾才会跳异常处理程序,所以返回时直接跑下一条指令就可以。
  • 设置pc为mtvec设定的值。
  • 设置mcause为trap发生的原因(exception code)。
  • 设置mtval为该异常的附加信息。
  • 设置mstatus.xPP为trap发生时的权限级别值。

在这里插入图片描述

软件处理过程

  • 保存当前控制流的上下文信息(通用寄存器x1-x31),利用mscratch。
    mscratch中保存当前上下文信息的内存地址,没法直接使用,需要先用csr指令读出来放到一个通用寄存器里。比如:可以用x31(t6)寄存器,使用csrrw t6, mscratch, t6 交换寄存器的数据,然后就可以用sw指令来将信息保存进t6里的地址处了。
  • trap handler
  • 从trap handler返回,mepc可以调整。
  • 恢复上下文的信息。
  • 执行MRET返回到trap之前。

xRET后硬件处理流程

  • 将当前hart的特权等级改为mstatus.MPP的值。
  • 将mstatus.MPIE的值恢复到mstatus.MIE。
  • mstatus.MPIE更新为1。
  • 将pc设置为mepc。
http://www.dtcms.com/a/335790.html

相关文章:

  • C++算法题目分享:二叉搜索树相关的习题
  • 原子指标、派生指标和复合指标
  • nodejs 中间件
  • 【Jenkins】01 - Jenkins安装
  • C语言网络编程TCP通信实战:客户端↔服务器双向键盘互动全流程解析
  • [GWCTF 2019]枯燥的抽奖
  • Java线程的6种状态和JVM状态打印
  • [TryHackMe]Brainpan1( 内存溢出)
  • PERCEIVER IO:一种用于结构化输入与输出的通用架构
  • 脉冲计数实现
  • 深入剖析ROS参数服务器通信机制 ——共享全局数据的“云端仓库”实现原理
  • Node.js安装教程
  • MySQL的事务日志:
  • java之 junit4单元测试Mockito的使用
  • 26. Object.defineProperty 和 Proxy 用法
  • 中级统计师-会计学基础知识-第五章 财务报告
  • 计算机算术6-SRT2除法
  • Linux817 shell:until,nfs,random
  • TypeScript中的import语法详解
  • 6.Ansible自动化之-管理变量和事实
  • 关于第一次接触Linux TCP/IP网络相关项目
  • 牛客周赛 Round 105
  • Java -- 坐标体系--绘图方法
  • 《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
  • Originality AI:原创度和AI内容检测工具
  • thingsboard 服务器在2核CPU、2G内存资源配置下如何调优提速,适合开发/演示
  • 飞算JavaAI赋能高吞吐服务器模拟:从0到百万级QPS的“流量洪峰”征服之旅
  • C#读取文件, IO 类属性及使用示例
  • [GLM-4.5] GLM-4.5模型 | Claude Code服务集成
  • Qt 5.5 的安装与配置(使用 VSCode编辑)