制作一个RISC-V的操作系统十-Trap和Exception(流 mtvec mepc mcause mtval mstatus trap完整流程)
文章目录
- 流
- mtvec
- mepc
- mcause
- mtval
- mstatus
- trap 初始化
- trap的top half(硬件完成)
- trap的bottom half(软件完成)
- 从trap返回
- 代码实现
流
控制流:程序控制的执行流
trap分为中断和异常
mtvec
base:存储trap入口函数的基地址右移两位的即四字节对齐的地址
WARL:可以写任何值,但读出来的值需要是合法才行
mepc
异常执行完后恢复到原来执行流,
MXLEN:就是CPU处理长度
mcause
WLRL:读写该部分都必须是合法值
mtval
对mcause做的一个补充
在RISC-V架构中,mtval
是 Machine Trap Value 寄存器(机器陷阱值寄存器)的缩写,它是RISC-V架构定义的一部分,用于异常处理机制。
当发生硬件引发的异常,如load访问错误、store访问错误、非法指令等时,mtval
寄存器会被设置为相关的错误值。具体来说:
- 对于 load 或 AMO (原子操作) 访问错误,
mtval
保存的是导致错误的地址。 - 对于 store 访问错误,
mtval
同样保存的是试图进行非法存储操作的地址。 - 对于指令相关异常(如非法指令),
mtval
存储的是触发异常的指令的地址。
程序员或操作系统可以通过检查 mtval
寄存器的内容来确定导致异常的具体原因,这对于调试和异常处理程序非常重要。在RISC-V架构的特权模式下,不同的异常等级(如Machine、Supervisor、User等)会有对应的陷阱值寄存器,例如在Supervisor模式下,类似的寄存器可能是scause
和sbadaddr
。
mstatus
xPIE保持执行trap时前保持当前的xIE,trap执行后再恢复到xIE去
xPP保持陷入当前权限x之前的权限级别值,陷入到M权限之前的权限可以说M U S 所以用两个比特位表示这三种状态。陷入到S之前的权限可以是 U S 所以用一个比特位表示,陷入到U只能是U,那没有必要保存,因为执行完trap后恢复到的和执行trap时一样。
WPRI:读这个寄存器的时候忽略该部分的值,写这个寄存器的时候要保留该部分原来的值(不要变)
trap 初始化
设置mtvec地址为自己设置的异常处理程序的入口地址
在RISC-V架构中,mtvec
是 Machine Trap Vector Base Address Register(机器陷阱向量基地址寄存器)的缩写。此寄存器在RISC-V处理器中扮演着核心的角色,它负责决定在发生硬件异常或中断时,处理器应跳转到何处执行相应的处理代码。
mtvec
寄存器的结构通常包括两部分:
-
Base Address(基地址):存储了一个物理地址,当发生异常或中断时,处理器会跳转到这个地址处执行异常处理程序的第一条指令。
-
Mode(模式):
- Direct Mode(直接模式):在这种模式下,基地址字段直接指向异常处理程序的入口地址。
- Vectored Mode(向量化模式):这种模式下,基地址字段指向一个固定的向量表,向量表中的每一个条目对应一种特定的异常类型。当异常发生时,处理器根据异常类型从向量表中索引出相应的处理程序地址。
trap的top half(硬件完成)
- MIE复制到MPIE中,MIE清0
- 设置mepc,pc设置为mtvec(异常:异常程序处理完后需要重新执行异常指令 中断:执行完处理中断执行下一条指令)
- 设置mcause和mtval
- 设置MPP,权限进入M(无论啥trap都会先切换到machine模型)
.
trap的bottom half(软件完成)
- 切换上下文
- 调用对应的处理函数
- 恢复上下文
- mret
从trap返回
- 恢复权限
- 中断恢复,设置MPP
- pc恢复,设置MPIE
代码实现
https://github.com/FULLK/risllkos/tree/main/Fullkenerl5
相关文章:

制作一个RISC-V的操作系统十-Trap和Exception(流 mtvec mepc mcause mtval mstatus trap完整流程)
文章目录 流mtvecmepcmcausemtvalmstatustrap 初始化trap的top half(硬件完成)trap的bottom half(软件完成)从trap返回代码实现 流 控制流:程序控制的执行流 trap分为中断和异常 mtvec base:存储trap入…...

【爬虫开发】爬虫从0到1全知识md笔记第4篇:Selenium课程概要,selenium的介绍【附代码文档】
爬虫开发从0到1全知识教程完整教程(附代码资料)主要内容讲述:爬虫课程概要,爬虫基础爬虫概述,,http协议复习。requests模块,requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. request…...

对一个时间序列中的每个元素按照指定精度向上取整
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对一个时间序列中的每个元素 按照指定精度向上取整 例如:对小时处理, 则9:01处理为10:00 Series.dt.ceil() 选择题 以下代码的输出结果中正确的是? import pandas as…...

51单片机+TN901非接触式红外测温设计论文与源码PCB等资料
1、摘要 温度测量技术应用十分广泛,而且在现代设备故障检测领域中也是一项非常重要的技术。但在某些应用领域中,要求测量温度用的传感器不能与被测物体相接触,这就需要一种非接触的测温方式来满足上述测温需求。本论文正是应上述实际需求而设…...
AI创业项目:AI旅游规划定制师
在当前的旅游市场中,个性化旅游规划成为越来越多旅行者的需求。然而,现行的定制旅行服务主要依赖于人工定制师,这一模式面临着信息不透明、价格弹性大等挑战。定制师在客户与服务供应商之间掌握着信息差,依靠这一优势获得收益&…...
win 安装 Stable Diffusion
注:本人使用的是 RTX2060 - 6G版 特别提醒:安装一定要 CUDA 和 PyTorch 版本能配套用,不然会有生成保存问题(我是这样的),装完用 python -m xformers.info 这个看对应的版本 建议:有些命令安装在venv 虚拟机中做&…...

STM32F407+FreeRTOS+LWIP UDP组播
开发环境介绍: MCU:STM32F407ZET6 网卡:LAN8720A LWIP版本:V1.1.0 FreeRTOS 版本:V10.2.1 LAN8720A硬件原理图: 硬件连接说明: MII_RX_CLK/RMII_REF_CLK ------>PA1 …...

(源码+部署+讲解)基于Spring Boot + Vue的车位租赁系统设计与实现
前言 💗博主介绍:✌专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2024年Java精品实战案例《100套》 🍅文末获取源码联系🍅 🌟…...

Lecture 2~4 About Filter
文章目录 空间域上的滤波器- 线性滤波器盒状滤波器Box Filter锐化Sharpening相关运算 vs. 卷积运算 Correlation vs. Convolution - 非线性滤波器高斯滤波器Gaussian filter - 实际问题- 纹理texture 频域上的滤波器 滤波的应用- 模板匹配- 图像金字塔 空间域上的滤波器 图像…...
【LINUX】Linux 命令大全:系统管理与网络操作指南
开始之前 Linux命令行,也称为终端,是Linux最强大的特性之一。通过命令行,用户可以执行几乎所有的任务,比如文件操作、程序安装、系统监控和网络配置等。了解这些基本命令,将帮助你更好地掌握Linux系统。 文件和目录操…...
Day50 动态规划 part11
Day50 动态规划 part11 123.买卖股票的最佳时机III 我的思路: 这道题考虑了交易次数 j(最大次数为2),以及某天 i 应该买or卖股票(两种状态) 用三维数组表示 dp[i][j][0] – 第i天结束时,交易j…...

Docker 搭建私有镜像仓库
一、镜像仓库简介 Docker的镜像仓库是一个用于存储和管理Docker镜像的中央位置。镜像仓库的主要作用是提供一个集中的地方,让用户可以上传、下载、删除和共享Docker镜像。镜像仓库又可以分为公共镜像仓库和私有仓库镜像仓库: 公共镜像仓库 Docker Hub 是…...

Nginx反向代理与Tomcat实现ssm项目前后端分离部署
Nginx nginx是一款http和支持反向代理的web服务器,以其优越的性能被广泛使用。以下是百度百科的介绍。 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.…...
element UI 日期选择器 当前年份之前不可选
<el-date-pickertype"year"format"YYYY"value-format"YYYY"v-model"declareYear"placeholder"请选择年份":disabled-date"disabledDateFun"/>function disabledDateFun(time) {if (time.getFullYear() <…...

windows wireshark抓包rtmp推流出现TCP Retransmission
解决办法:tcp.port1935 && !(tcp.analysis.retransmission)...
C++之std::initializer_list详解
相关文章系列: C/C中{}的用法总结(全)_c {}-CSDN博客 目录 1.引言 2.容器的初始化 3.函数中使用std::initializer_list 4.自定义类型中使用std::initializer_list 5.迭代std::initializer_list 6. 在模板中使用std::initializer_list 7.std::initializer_lis…...

4月9日学习记录
[GXYCTF 2019]禁止套娃 涉及知识点:git泄露,无参数RCE 打开环境,源码什么的都没有,扫描后台看看 扫描发现存在git泄露 用githack下载查看得到一串源码 <?php include "flag.php"; echo "flag在哪里呢&#…...
解析快手滑块验证码的逆向工程
快手滑块验证码是一种常见的反机器人验证方式,通过模拟用户拖动滑块来验证用户身份。本文将介绍如何逆向工程快手滑块验证码的加密算法和轨迹生成方式,并提供详细的代码实现。 1. 加密算法解析 首先,我们需要了解滑块验证码生成时所用的加密…...

mysql运维知识总结
1. 日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过 程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&…...

【目标检测】-入门知识
1、回归与分类问题 回归问题是指给定输入变量(特征)和一个连续的输出变量(标签),建立一个函数来预测输出变量的值。换句话说,回归问题的目标是预测一个连续的输出值,例如预测房价、股票价格、销售额等。回归问题通常使用回归分析技术,例如线性回归、多项式回归、决策树…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...