CPU设计实战—异常处理指令
异常类型以及精确异常的处理
异常有点像中断,处理完还要回到原来的状态,所以需要对之前的状态进行保存。本CPU主要实现对以下异常的处理:
1.外部硬件中断
2.复位异常
3.系统调用异常(发生在译码阶段)
4.溢出异常(发生在执行阶段)
5.自陷指令异常(发生在执行阶段因为需要进行条件判断)
6.无效指令异常(发生在译码阶段)
为了不破坏原程序的执行,异常指令之前的指令都要确保执行完成,而异常指令和其之后的指令需要取消。这要求异常发生的循序和指令发生的顺序相同。可会有例外吗?
由于流水线的特性,不同指令的异常可能发生在不同阶段。例如:加载指令在访存阶段发生未对齐异常,而下一个指令是无效指令在译码阶段发生异常。无效指令先发生异常,顺序错误。如何解决?
先发生的异常不立即处理,先进行标记,所有的异常统一留到访存阶段进行处理。
一、异常处理过程
异常发生之后进行的处理:
如果发生,先看当前是否处于异常处理阶段(根据状态寄存器的EXL字段);
如果正在异常处理,接着判断是否处于中断阶段,是的话则不处理此中断(异常处理过程会禁止中断);
不是处于中断异常则保存异常原因,进入异常处理例程即可。
如果没有正在进行异常处理:
1.先保存异常原因(Cause寄存器的Execode字段)
2.将保存异常返回地址到EPC(这时候需要判断是否为延迟槽指令?PC-4,BD=1:PC,BD=0)
4.转移到异常处理例程(最后就是根据异常类型确定PC的值是哪一个入口地址)
EXL表示当前是否在异常状态,EPC保存异常返回地址,BD是当发生异常的指令在分支延迟槽时被置位
如果异常指令是延迟槽指令,那么也必须执行上一条转移指令(PC-4)
二、实现思路
我们先在译码(系统调用,无效,异常返回)执行阶段(自陷,溢出)判断是否有相关异常发生并传递给访存阶段对不同异常结合CP0寄存器进行具体判断。如果需要处理,就转移到异常处理入口地址(在异常向量表中有定义),同时需要清除回写阶段前的所有寄存器。
自陷异常
通过条件判断是否发生异常,如果发生就进入异常处理例程
系统调用异常
当我们想要切换工作模式(比如获得更高权限进入内核模式),通过调用系统异常指令来实现修改工作模式状态位:即CP0中Status的UM字段。但是本CPU没有实现其他模式。
系统异常返回
作用是返回异常出现之前的指令,异常结束,具体操作为:
1.EPC寄存器(存储异常指令地址)的值给到PC
2.清除异常状态(EXL字段清零)
三 具体实现思路
1.在各个阶段(译码阶段需要判断延迟槽)收集异常状态将信号(异常判断信号与异常地址)传送到访存阶段
2.访存阶段判断异常是否处理(需要根据CP0中的一些寄存器):
需要处理:进入异常地址(如果是异常返回指令则进入EPC的地址);清除之前阶段;修改CP0(进入异常状态等)
四 各个阶段具体实现
1.PC阶段
如果异常到来就使用新的PC值
end else if(stall[1] == `NoStop) beginid_pc <= if_pc;id_inst <= if_inst;
2.各个寄存器阶段
如果异常来临把所有输出信号赋初始值
end else if(flush == 1'b1 ) beginex_aluop <= `EXE_NOP_OP;ex_alusel <= `EXE_RES_NOP;ex_reg1 <= `ZeroWord;ex_reg2 <= `ZeroWord;ex_wd <= `NOPRegAddr;ex_wreg <= `WriteDisable;ex_excepttype <= `ZeroWord;ex_link_address <= `ZeroWord;ex_inst <= `ZeroWord;ex_is_in_delayslot <= `NotInDelaySlot;ex_current_inst_address <= `ZeroWord; is_in_delayslot_o <= `NotInDelaySlot;
3.译码阶段
对指令进行译码,如果是异常指令保存状态:如系统调用,异常返回,自陷指令在执行阶段还要进行条件判断所以这里不记录
然后把异常状态都保存到一个信号中
//exceptiontype的低8bit留给外部中断,第9bit表示是否是syscall指令//第10bit表示是否是无效指令,第11bit表示是否是trap指令assign excepttype_o = {19'b0,excepttype_is_eret,2'b0,instvalid, excepttype_is_syscall,8'b0};
4.执行阶段
判断执行阶段里的异常状态:如溢出,自陷指令条件判断并把相关信号输出:
assign excepttype_o = {excepttype_i[31:12],ovassert,trapassert,excepttype_i[9:8],8'h00};
5.访存阶段
主要目的是进一步判断是否要发生异常类型(结合CP0中的信号判断)以及具体哪个异常
什么时候发生异常:复位,异常和暂停情况不处理异常,所以取指地址不为0才发生异常
区分是哪个异常类型(不能只根据传过来的异常类型,因为有些还需要CP0中的额外条件):
中断异常:当处于中断或者异常情况下不处理中断:
发生中断的依据是: Cause 寄存器的IP字段不为0,且Status寄存器中相应的中断掩码字段IM也不为0,另外,Status 寄存器的EXL字段为0,表示不处于异常处理过程中,Status 寄存器的IE字段为1,表示中断使能。
其他异常类型没有额外条件,只要之前异常触发了就可以。
if(current_inst_address_i != `ZeroWord) beginif(((cp0_cause[15:8] & (cp0_status[15:8])) != 8'h00) &&
(cp0_status[1] == 1'b0) && (cp0_status[0] == 1'b1)) beginexcepttype_o <= 32'h00000001; //interruptend else if(excepttype_i[8] == 1'b1) beginexcepttype_o <= 32'h00000008; //syscallend else if(excepttype_i[9] == 1'b1) beginexcepttype_o <= 32'h0000000a; //inst_invalidend else if(excepttype_i[10] ==1'b1) beginexcepttype_o <= 32'h0000000d; //trapend else if(excepttype_i[11] == 1'b1) begin //ovexcepttype_o <= 32'h0000000c;end else if(excepttype_i[12] == 1'b1) begin //返回指令excepttype_o <= 32'h0000000e;endend
具体每个异常类型对应的输出回顾译码和执行阶段做的定义:
到这一步才算完成对异常类型的判断!!!
下面是根据不同的异常类型做不同的操作,主要是给修改PC以及寄存器
6.根据不同的异常类型修改CP0的值(主要记载返回地址和返回原因)
CP0中重要寄存器作用:
1.EPC是异常程序计数器(Exception Program Counter),用来存储异常返回地址,一般情况下,存储发生异常的指令的地址,但是,如果发生异常的指令位于延迟槽中,那么EPC存储的是前一条转移指令的地址。该寄存器可读、可写。
2.cause寄存器的BD字段
当发生异常的指令处于分支延迟槽(Branch DelaySlot)时,该字段被置为1。ExeCode是表示异常原因
3.Status寄存器的EXL字段
表示是否处于异常级( Exception Level), 当异常发生时,会设置本字段为1,表示处理器处于异常级,此时,处理器会进入内核模式下工作,并且禁止中断。
中断指令:
依据发生异常的指令是否位于延迟槽中,保存返回地址设置EPC寄存器的值,以及Status 寄存器的BD字段,如果位于延迟槽中,那么设置EPC寄存器为上一条指令的地址,Status 寄存器的BD字段为1,反之,设置EPC寄存器为发生异常指令的地址,Status寄存器的BD字段为0。另外,设置异常状态设置Status 寄存器的EXL字段为I,表示处于异常级,中断禁止。最后,保存返回原因设置Cause寄存器的ExcCode字段5'b00000,表示异常原因是中断。
系统调用异常:
分两种情况。
(1)如果Status寄存器的EXL字段为0,那么依据发生异常的指令是否位于延迟槽中,设置EPC寄存器的值,以及Status寄存器的BD字段。如果位于延迟槽中,那么设置EPC寄存器为上一条指令的地址,Status 寄存器的BD字段为1,反之,设置EPC寄存器为发生异常指令的地址,Status 寄存器的BD字段为0。然后,设置Status寄存器的EXL字段为1,表示处于异常级,中断禁止。最后,设置Cause寄存器的ExcCode字段为5"b01000,表示异常原因是系统调用指令syscall,参考第10章的表10-7。
(2)如果Status寄存器的EXL字段为1,表示当前已经处于异常级了,又发生了新的异常,那么只需要将异常原因保存到Cause寄存器的ExcCode字段,此处设置为5'b01000,表示异常原因是系统调用指令syscall。
3.无效指令异常
与系统调用异常的处理过程类似,只是设置Status寄存器的ExcCode字段为5"b01010,表示异常原因是无效指令。
4.自陷异常
与系统调用异常的处理过程类似,只是设置Status寄存器的ExcCode字段为5'b01101,表示异常原因是自陷.
5.溢出异常
与系统调用异常的处理过程类似,只是设置Status寄存器的ExcCode字段为5'b01100,表示异常原因是溢出。
6.异常返回指令eret
清除Status寄存器的IE字段,表示中断允许。
6.控制模块
根据异常类型给出下一个PC应有的值,这个值根据异常处理入口例程;
如果是异常返回地址,则跳转到异常返回地址
always @ (*) beginif(rst == `RstEnable) beginstall <= 6'b000000;flush <= 1'b0;new_pc <= `ZeroWord;end else if(excepttype_i != `ZeroWord) beginflush <= 1'b1;stall <= 6'b000000;case (excepttype_i)32'h00000001: begin //interruptnew_pc <= 32'h00000020;end32'h00000008: begin //syscallnew_pc <= 32'h00000040;end32'h0000000a: begin //inst_invalidnew_pc <= 32'h00000040;end32'h0000000d: begin //trapnew_pc <= 32'h00000040;end32'h0000000c: begin //ovnew_pc <= 32'h00000040;end32'h0000000e: begin //eretnew_pc <= cp0_epc_i;enddefault : beginendendcase end else if(stallreq_from_ex == `Stop) beginstall <= 6'b001111;flush <= 1'b0; end else if(stallreq_from_id == `Stop) beginstall <= 6'b000111; flush <= 1'b0; end else beginstall <= 6'b000000;flush <= 1'b0;new_pc <= `ZeroWord; end //ifend //always
7.定时中断的结构实现
将时钟中断输出作为一个中断信号输入,这样就可以处理时钟中断了,从而验证异常相关指令是否实现正确。
8、测试程序
系统调用异常测试程序
当指令根据系统调用异常的指示入口地址跳转到这里后,需要自己写代码去进行在EPC内进行PC+4的操作,不然等异常返回指令后PC按照EPC内的值跳转后还是在系统调用指令处继续异常。
相关文章:

CPU设计实战—异常处理指令
异常类型以及精确异常的处理 异常有点像中断,处理完还要回到原来的状态,所以需要对之前的状态进行保存。本CPU主要实现对以下异常的处理: 1.外部硬件中断 2.复位异常 3.系统调用异常(发生在译码阶段) 4.溢出异常&…...
Elasticsearch(13) match_phrase的使用
elasticsearch version: 7.10.1 match_phrase 语法 POST <index>/_search {"query": {"match_phrase": {"<field_name>": {"query": "<your_search_phrase>","slop": <max_dis…...

通过路由器监控,优化网络效率
路由器是网络的基本连接组件,路由器监控涉及将路由器网络作为一个整体进行管理,其中持续监控路由器的性能、运行状况、安全性和可用性,以确保更好的操作和最短的停机时间,因此监控路由器至关重要。 为什么路由器监控对组织很重要…...

使用canvas实现图纸标记及回显
图纸 图纸标记后的效果图 最近做的一个qms项目里面,需要前端在图纸上实现标记及标记后的内容还要能够回显,然后后端通过标记的点,去读取标记图纸的内容,如一些公式、数据之类的,目前实现的功能有 在图纸上面进行矩形…...

鸿蒙-自定义组件的生命周期
目录 自定义组件的生命周期 1.aboutToAppear 2.aboutToDisappear 3.onPageShow 4.onPageHide 5.onBackPress 日志输出 1.显示页面 2.页面点击返回按钮 3.页面跳转 4.页面返回 自定义组件的生命周期 先来一段列子 import router from ohos.router Entry Component…...

【Linux】自动化构建工具-make/Makefile
个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 认识make/Makefile3. 了解make/Makefile原理3.1 依赖关系和依赖方法3.2 make检测的顺序3.3 PHONY:XXX 4. makefile内置符号 1. 前言 在上一篇中已经了解了【Linux】编译器-gcc/g使用,这次来一起…...
week07day03(power bi dax公式 零售数据业务分析)
一. 切片器(筛选)相关的三个函数 1.all (all后面的数据意思是 不受其影响) #ALL 筛选的是 筛选器 或 切片器#计算 销售金额 ,并且 不受到 门店ID 控制 计算金额 CALCULATE(SUM(销售表[金额]),ALL(销售表[门店ID]))#计算 销售金额 &#x…...

rembg报错onnxruntime_providers_tensorrt.dll
报错: 2024-03-16 04:16:59.4413827 [E:onnxruntime:Default, provider_bridge_ort.cc:1534 onnxruntime::TryGetProviderInfo_TensorRT] D:\a_work\1\s\onnxruntime\core\session\provider_bridge_ort.cc:1209 onnxruntime::ProviderLibrary::Get [ONNXRuntimeErro…...

精酿啤酒:一口啤酒,一份享受
在繁华的都市生活中,我们总是匆匆忙忙,追求着各种目标和成就。然而,在这个过程中,我们往往忽略了生活的本质,那就是享受。而Fendi Club 啤酒,正是为那些追求品质生活的都市精英们量身打造的。 Fendi Club啤…...

git报: “fatal: detected dubious ownership in repository“
“fatal: detected dubious ownership in repository”的中文翻译是:“致命错误:检测到仓库中存在可疑的所有权问题”。 这句话意味着 Git 在检查代码仓库时发现所有权存在问题,可能是由于文件或目录的所有权与 Git 仓库预期的所有权不匹配。…...

代码随想录算法训练营第27天|93.复原IP地址、78.子集、90.子集二
目录 一、力扣93.复原IP地址1.1 题目1.2 思路1.3 代码1.4 总结 二、力扣78.子集2.1 题目2.2 思路2.3 代码2.4 总结 三、力扣90.子集二3.1 题目3.2 思路3.3 代码3.4 总结 一、力扣93.复原IP地址 (比较困难,做起来很吃力) 1.1 题目 1.2 思路 …...

Java微服务轻松部署服务器
我们在日常开发微服务之后需要再服务器上面部署,那么如何进行部署呢,先把微服务的各个服务和中间件以及对应的端口列举出来,都打包成镜像,以及前端代码部署的nginx,使用docker-compose启动,访问服务器nginx…...

Wordpress站点通过修改.htaccess 设置重定向实现强制 https 访问
要在WordPress站点上通过修改.htaccess文件实现强制HTTPS访问,您可以按照以下步骤进行操作: 登录到WordPress站点管理后台。 在文件管理器或通过FTP访问网站根目录,找到并打开名为 .htaccess 的文件。 在打开的文件中添加以下代码…...

人大金仓助力国家电网调度中心培养国产数据库专家人才
近日,为进一步提升调度自动化安全可靠水平,提高电网数据应用效能,人大金仓助力国家电网调度中心培养国产数据库专家人才。 调度自动化系统拥有海量电网数据资源,是支撑电网安全经济优质运行的重要保障。数据库是调度自动化系统稳定运行的基石之一,其结构严谨、运行稳定、扩展灵…...

什么是增强型SSL证书?购买一张需要多少钱?
增强型SSL证书是一种提供更高级别安全验证与用户信任度的网络安全工具,也被称为EV证书。相较于DV(域名验证)和OV(组织验证)证书,它通过严格的身份核实流程确保网站所有者的合法性和真实性。 首先࿰…...

C++:函数传参到函数执行结束发生了什么
首先要明确两个概念 函数实参的入栈从右向左栈区从高地址向低地址偏移 接下来看下面一段代码 void fun(int a,int b,int c){std::cout<<&a<<" "<<&b<<" "<<&c<<std::endl; } int main(){fun(1,2,3); }…...

QT中dumpcpp以及dumpdoc使用
qt中调用COM的方式方法有四种,参考解释在 Qt 中使用 ActiveX 控件和 COM (runebook.dev) 介绍dumpcpp的使用方法Qt - dumpcpp 工具 (ActiveQt) (runebook.dev): 在安装好了的qt电脑上,通过powershell窗口来实现,powershell比cmd要…...

RPM与DNF的操作实践
这几课有三个目标: 第一步:先配置软件源 跳转到yum.repos.d目录,用vim创建一个openeuler_x84_64.repo文件。这个文件就是我们将会用到的软件源。 我们在里面添加这些东西,保存并退出即可。 然后,我们用yum list all就…...

车道线检测之LaneNet
论文:Towards End-to-End Lane Detection: an Instance Segmentation Approach Github:https://github.com/MaybeShewill-CV/lanenet-lane-detection?tabreadme-ov-file 论文提出一种车道线检测网络LaneNet,该网络以enet为主干网络结构&…...

MySQL连接数不足导致服务异常GetConnectionTimeoutException
文章目录 场景复现解决方案一、调整连接数二、优化程序 场景复现 已经上线正常运行的项目突然很多功能无法使用,查看程序日志发现MySQL报错,异常信息: Could not open JDBC Connection for transaction; nested exception is com.alibaba.druid.pool.Ge…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...