分析流水线处理器的中断和异常响应机制
浅析处理器流水线冒险原因和解决方案

0 引言流水线技术一方面提升了处理器执行速率,另一方面单指令的执行和过程并没有缩减。
处理器在执行流水线作业时,还需要执行控制指令,从而增加系统的开销,所以单个指令平均执行时间会略有上升。
但就总体执行而言,CPU 执行指令的时间更短,吞吐量更大,这意味着程序整体运行得更快。
经典处理器采用五级流水线通路:IF(取指令) ID (指令译码,读寄存器堆) EX (指令执行或地址计算) MEM (数据内存访问)和WB (写回)。
指令执行时间方面:以五级流水线为例(如图1),假设每个时钟周期为t,总共需要执行n 条指令,那么所需时间为执行5*t (n-1)。
如果采用串行执行方式(如图2),执行时间为5*t*n。
这样当指令数较多时,理想状态下流水线方式的效率是串行的5倍。
CPU 流水线模式下,需要规避一些影响指令执行的问题:1)同一个时钟周期内,同一处理单元只能执行一个任务,如执行运算和内存访问不能由同一处理单元在同一时钟周期执行。
2)读取指令和操作数据需要使用各自独立的缓存,即哈弗结构,以避免二者同时访问存储单元。
3)译码与写回操作访问同一寄存器。
而流水线方式执行时,由于上述制约,以及时钟驱动偏差、软硬件延时等原因,有可能出现指令在该时钟周期无法顺利执行,延迟到下个时钟周期执行的情况,这就是流水线风险。
1 流水线冒险类型常见的冒险主要有结构冒险、数据冒险和控制冒险三种。
(1)结构冒险(structural hazard)是指由于资源争夺导致几条指令不能在同一时钟周期内执行,则称为处理器中含有结构性冒险。
如果流水线结构中有一个寄存器,访问内存和读取指令时都要访问同一个内存,流水线就会发生结构冒险。
(2)数据冒险:一个操作需要等待另一个操作完成后才能进行,这样流水线被迫停止,这种情况称为数据冒险。
Keywords: processor;branch prediction; processor pipeline design图2 串行执行方式图1 流水线执行方式2.2 数据冒险解决数据冒险的一个主流方法是转发(也叫旁路):即前一条指令得到的结果不回写至寄存器,而直接转发至下一条指令。
关于中断和异常的一些理解

关于中断和异常的⼀些理解中断中断(硬件中断)是cpu为了响应外部突发事件⽽引⼊的⼀种机制。
在没有中断机制之前cpu需要频繁查询外部设备的状态来与外部设备进⾏通信,⽽有了中断机制后,只有当外部设备要求cpu进⾏处理时cpu才会与其进⾏通信,这就⼤⼤提⾼了cpu的效率。
中断分类可屏蔽中断可屏蔽中断是为了使在执⾏某些任务时系统不希望被打断,所以需要把⼀些中断进⾏屏蔽。
可屏蔽中断请求信号通常是通过CPU的INTR引脚发给CPU的,可以通过CLI 指令把标志寄存器的IF位置零从⽽把可屏蔽信号屏蔽。
不可屏蔽中断不可屏蔽中断是为了处理某些特殊情况。
不可屏蔽中断请求信号是通过CPU的NMI引脚发给CPU的,这时即便使⽤了CLI指令把标志寄存器的IF位置零了也⽆法屏蔽这些中断请求信号,CPU依然需要暂停去执⾏相应的中断处理例程。
异常异常(有的书上也将其称为软中断,即内部中断)是指程序在执⾏过程中形成了某些预先设定的情景,即发⽣某些特定的异常然后cpu会去执⾏相应的异常处理程序。
因为异常有时被认为是软中断,⼜因为异常不基于硬件(也就是不依靠标志寄存器的IF位),所以所有的异常都属于不可屏蔽的中断。
异常分类错误类异常错误类异常⼀般是可以在异常处理后回到发⽣异常的地⽅继续执⾏的,也就是说eip指令指针还会指向引发异常的那条指令。
例如硬件执⾏断点引发的异常,在异常处理后依然会执⾏引发异常的那条指令,如果你不处理他就会⼀直循环引发异常⽆法往下继续运⾏。
陷阱类异常陷阱类异常⼀般是在执⾏完某条指令后引发的异常,因此当发⽣异常时eip指令指针寄存器已经指向引发异常的下⼀条指令。
但是也有⼀些特殊情况,如int3引发的断点异常就时陷阱类异常,但是系统为了⽀持调试会让异常处理程序令eip-1使其⼜指向引发异常的那条指令。
中⽌类异常中⽌类异常⼀般是发⽣了⼀些严重的错误,系统⽆法令程序恢复执⾏只能结束运⾏。
中断和异常的关系有时我们把中断和异常混为⼀谈,会把异常称之为软中断(内部中段)。
操作系统的中断处理与异常处理机制

操作系统的中断处理与异常处理机制在计算机系统中,操作系统是一个管理和协调系统资源的软件,中断处理和异常处理是操作系统的核心功能之一。
中断处理和异常处理机制使得操作系统能够及时响应硬件设备或软件程序的请求,并采取相应的措施进行处理,保证系统的稳定性和可靠性。
本文将详细介绍操作系统的中断处理与异常处理机制。
一、中断处理机制中断是指在计算机系统运行过程中,某个硬件设备或者软件程序发出的一种请求,通过打断正常的程序执行流程,通知操作系统去处理该请求。
中断可以分为硬件中断和软件中断两类。
1. 硬件中断硬件中断是由硬件设备发生的一种中断事件,比如外设设备的输入输出操作,时钟中断等。
当硬件设备发生中断事件后,会向处理器发送一个中断信号,处理器暂停当前的执行任务,保存当前的上下文信息,并转入中断处理程序来处理中断事件。
中断处理程序会根据中断类型来执行相应的操作,比如读取输入设备的数据,将数据写入输出设备等。
处理完中断事件后,处理器会恢复之前被中断的任务继续执行。
2. 软件中断软件中断是由软件程序主动触发的一种中断事件,也称为系统调用。
软件中断通常由用户态程序调用系统库函数来完成,通过系统调用指令将自己的执行权限转交给操作系统,由操作系统代为执行相应的操作。
常见的软件中断包括文件读写操作、进程创建与销毁等系统调用。
中断处理机制的优点在于能够及时响应外部设备和软件程序的请求,提高了系统的实时性和处理能力。
同时,使用中断处理机制可以实现很多复杂的功能,比如多任务处理、设备驱动程序等。
二、异常处理机制异常是指在程序执行过程中出现的一种非正常情况,例如非法指令、除数为零等。
异常处理机制能够捕捉这些异常事件并进行相应的处理。
异常处理机制主要分为硬件异常和软件异常两类。
1. 硬件异常硬件异常指的是由硬件设备产生的异常事件,如页错误、越界访问等。
当硬件设备检测到异常事件后,会向处理器发送一个异常信号,处理器会中断当前任务的执行,并把当前的上下文信息保存起来,然后转入异常处理程序去处理异常事件。
异常及中断处理讲解

ARM 异常中断处理概述1、中断的概念中断是一个过程,是 CPU 在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程。
因硬件原因引起的中断过程的出现是不可预测的,即随机的,而软中断是事先安排的。
2、中断源的概念我们把可以引起中断的信号源称之为中断源。
3、中断优先级的概念ARM 处理器中有 7 种类型的异常,按优先级从高到低的排列如下:复位异常( Reset)、数据异常(Data Abort )、快速中断异常 ( FIQ)、外部中断异常 (IRQ)、预取异常 (PrefetchAbort )、软件中断 (SWI)和未定义指令异常( Undefined instruction )ARM体系异常种类面是 ARM 的 7 种异常当异常发生时,处理器会把 PC设置为一个特定的存储器地址。
这一地址放在被称为向量表( vector table )的特定地址范围内。
向量表的入口是一些跳转指令,跳转到专门处理某个异常或中断的子程序。
当异常产生时, ARM core:拷贝CPSR 到SPSR_<mode> 设置适当的CPSR 位:改变处理器状态进入ARM 状态改变处理器模式进入相应的异常模式设置中断禁止位禁止相应中断(如果需要)保存返回地址到LR_<mode> 设置PC 为相应的异常向量返回时, 异常处理需要:从SPSR_<mode>恢复CPSR从LR_<mode>恢复PCNote:这些操作只能在ARM 态执行.当异常发生时,分组寄存器 r14 和 SPSR用于保存处理器状态,操作伪指令如下。
R14_<exception_mode> = return link SPSR_<exception_mode> = CPSRCPSR[4∶ 0] = exception mode numberCPSR[5] = 0 /* 进入 ARM状态 */If <exception_mode> = = reset or FIQ thenCPSR[6] = 1 /* 屏蔽快速中断 FIQ*/CPSR[7] = 1 /* 屏蔽外部中断 IRQ*/PC = exception vector address 异常返回时, SPSR内容恢复到 CPSR,连接寄存器 r14 的内容恢复到程序计数器 PC。
操作系统中的中断与异常处理机制

操作系统中的中断与异常处理机制在计算机系统中,操作系统起着至关重要的作用,它负责管理和控制计算机的资源,并提供给用户一个友好和高效的界面。
而在操作系统中,中断与异常处理机制是其中的重要组成部分。
一、什么是中断与异常处理机制中断与异常处理机制是操作系统用来响应特定事件或异常情况的方式。
当计算机系统发生某些事件,例如硬件故障、外部设备的请求等,操作系统会立即停止正在执行的任务,转而处理该事件。
在这种情况下,中断与异常处理机制起到了极为重要的作用。
二、中断与异常的区别尽管中断和异常都能够引发操作系统的响应,但两者之间存在一些区别。
1. 中断:中断是由外部设备发起的,例如键盘输入、鼠标点击等。
当外部设备需要与操作系统进行交互时,它会发出中断信号,这时操作系统会中断当前任务的执行,转而响应中断事件。
中断是一种在程序执行时突然发生的外部事件,需要处理器立即中断正在执行的任务并执行相应的中断处理程序。
2. 异常:异常是由程序内部产生的事件,也称为软中断。
当程序运行过程中出现错误、非法操作或者某些特殊事件时,会触发异常。
操作系统会根据异常的类型和优先级来处理该异常,进而采取相应的行动,例如打印错误信息、终止程序执行,或者进行异常处理。
三、中断与异常的处理流程中断与异常处理机制的处理流程如下:1. 中断发生:当外部设备产生中断信号时,处理器会暂停当前任务的执行,并将控制权交给操作系统。
2. 中断处理程序:操作系统会根据中断类型调用对应的中断处理程序。
中断处理程序会执行与中断相关的操作,例如获取键盘输入、响应鼠标事件等。
3. 中断处理完成:中断处理程序执行完毕后,操作系统会将控制权重新交还给之前的任务,使其继续执行。
4. 异常发生:在程序执行过程中,如果出现错误、非法操作或其他特殊事件,会触发异常。
5. 异常处理程序:操作系统会根据异常类型和优先级调用相应的异常处理程序。
异常处理程序会处理异常情况,例如打印错误信息、修复错误、终止程序执行等。
了解计算机中断和异常处理机制

了解计算机中断和异常处理机制计算机中断和异常处理机制是操作系统中非常重要的概念之一。
它们在计算机系统的正常运行中发挥着重要的作用,保证了计算机系统的稳定性和可靠性。
本文将详细介绍计算机中断和异常处理机制的相关知识。
一、计算机中断的概念和分类1.1计算机中断的概念计算机中断是指在计算机运行过程中,由于某些事件的发生而打断当前程序的执行,转而去执行相应的中断服务程序的一种机制。
1.2计算机中断的分类计算机中断可以分为硬件中断和软件中断两种类型:硬件中断:由硬件设备发起的中断,比如外部设备请求、时钟中断等。
软件中断:由正在执行的程序指令(软中断指令)或软件发起的中断,比如系统调用。
二、计算机中断的处理流程计算机中断的处理流程主要包括中断请求、中断响应、中断服务程序执行和中断返回这四个过程。
2.1中断请求当硬件设备发生某个事件需要处理时,会向CPU发送一个中断请求信号。
CPU收到中断请求信号后,暂停当前正在执行的程序,保存相关的寄存器信息,并响应中断请求。
2.2中断响应中断响应是指CPU收到中断请求信号后,根据中断请求信号的优先级,选择相应的中断服务程序进行处理。
中断响应的过程主要包括中断向量的选择和中断屏蔽。
2.3中断服务程序执行中断服务程序是用来处理中断事件的程序,它会根据中断请求的类型执行相应的处理操作。
中断服务程序会根据中断类型从中断向量表中查找相应的中断处理程序,并执行相应的操作。
2.4中断返回中断服务程序执行完毕后,会通过中断返回指令返回到原来被中断的程序继续执行。
中断返回的过程主要包括恢复相关的寄存器信息和清除中断屏蔽。
三、计算机异常的概念和分类3.1计算机异常的概念计算机异常是指在计算机运行过程中出现的一些非正常情况,比如非法指令、内存访问越界等。
当计算机发生异常时,会中断当前程序的执行,转而去执行相应的异常处理程序。
3.2计算机异常的分类计算机异常可以分为软件异常和硬件异常两种类型:软件异常:由正在执行的指令引起的异常,比如非法指令、除零错误等。
cpu中断处理机制

cpu中断处理机制
CPU中断处理机制是一种重要的计算机控制机制,它允许计算机
在处理其他任务时暂停执行,并向操作系统或其他进程发送中断请求。
中断请求通常由中断使能寄存器(中断 vector register)中的地址
传递到中断处理程序(中断服务程序,I泡菜)。
CPU中断处理程序通常是一段可重写的程序代码,它响应中断请
求并执行相应的操作,通常是将当前任务切换回操作系统或其他进程,暂停当前的执行,保存当前状态和中断使能寄存器中的地址,然后开
始处理中断请求。
在处理完中断请求后,CPU中断处理程序通常将当
前状态和中断使能寄存器中的地址返回给操作系统或其他进程,以便
继续执行后续的任务。
CPU中断处理机制的实现依赖于操作系统和计算机硬件的共同配合。
操作系统需要提供一组中断向量(中断服务程序地址),以便在需
要时传递中断请求给CPU中断处理程序。
计算机硬件也需要支持中断向量,并提供相应的中断控制器和中断使能寄存器。
此外,为了保证中断处理程序的正确性和安全性,操作系统还需要提供一系列的中断处
理流程和中断保护机制。
简述异常与中断处理的一般流程。

简述异常与中断处理的一般流程。
下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!简述异常与中断处理的一般流程在计算机系统中,异常和中断是两种重要的控制流程转移机制,它们使得处理器能够及时响应外部或内部的事件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分析流水线处理器的中断和异常响应机制——以ARM7系列3级流水线为例SC11011042-吴德云为增加处理器指令流的速度,ARM7系列使用3级流水线,允许多个操作同时处理,比逐条指令执行要快。
[1]图1ARM7流水线技术示意图PC 指向正被取指的指令,而非正在执行的指令。
ARM 流水线的一条指令只有在完全通过”执行”阶段才被处理。
这句话很重要,也就是说,当处理器开始取第四条指令时,第一条指令才完成执行。
我们如果不考虑流水线的设计,只看它的原理,其实是很简单的,他的复杂之处在于发生流水线冒险时,如何保证其工作得仍然很好。
流水线冒险一般分为控制冒险和数据冒险,而数据冒险一般可分为阻塞(即下一条指令依赖于前一条指令的结果)、分支和跳转、异常(异常和中断)。
由于ARM 是硬件flush 流水设计的,当发生冒险时,会暂停取指,然后清流水,(MIPS 解决冒险通常依赖于编译器,比如插入一条NOP 指令及重新排列指令序列)。
1.1ARM7的中断响应机制1.1.1中断延时从外部请求信号发出到取出对应的中断服务程序(ISR)的第一条指令,这期间的间隔时间。
1.1.2中断过程ARM 体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。
当一个异常出现以后,ARM 微处理器会执行以下几步操作:1)保存处理器当前状态、中断屏蔽位以及各条件标志位;2)设置当前程序状态寄存器CPSR 中相应的位;3)将寄存器lr_mode 设置成返回地址;4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处从存储器中读取指令解码指令寄存器读(从寄存器Bank )移位及ALU 操作寄存器写(到寄存器Bank )PC PC PC -4PC-2PC -8PC -4ARM Thumb理程序处执行。
在接收到中断请求以后,ARM处理器内核会自动执行以上四步,程序计数器PC总是跳转到相应的固定地址。
2.1ARM7的异常响应机制[2]所谓异常就是正常的用户程序被暂时中止,处理器就进入异常模式,例如响应一个来自外设的中断,或者当前程序非法访问内存地址都会进入相应异常模式。
2.1.1异常分类(1)复位异常当CPU刚上电时或按下reset重启键之后进入该异常,该异常在管理模式下处理。
(2)一般/快速中断请求CPU和外部设备是分别独立的硬件执行单元,CPU对全部设备进行管理和资源调度处理,CPU要想知道外部设备的运行状态,要么CPU定时的去查看外部设备特定寄存器,要么让外部设备在出现需要CPU干涉处理时“打断”CPU,让它来处理外部设备的请求,毫无疑问第二种方式更合理,可以让CPU“专心”去工作,这里的“打断”操作就叫做中断请求,根据请求的紧急情况,中断请求分一般中断和快速中断,快速中断具有最高中断优先级和最小的中断延迟,通常用于处理高速数据传输及通道的中数据恢复处理,如DMA等,绝大部分外设使用一般中断请求。
(3)预取指令中止异常该异常发生在CPU流水线取指阶段,如果目标指令地址是非法地址进入该异常,该异常在中止异常模式下处理。
(4)未定义指令异常该异常发生在流水线技术里的译码阶段,如果当前指令不能被识别为有效指令,产生未定义指令异常,该异常在未定义异常模式下处理。
(5)软件中断指令(swi)异常该异常是应用程序自己调用时产生的,用于用户程序申请访问硬件资源时,例如:printf()打印函数,要将用户数据打印到显示器上,用户程序要想实现打印必须申请使用显示器,而用户程序又没有外设硬件的使用权,只能通过使用软件中断指令切换到内核态,通过操作系统内核代码来访问外设硬件,内核态是工作在特权模式下,操作系统在特权模式下完成将用户数据打印到显示器上。
这样做的目的无非是为了保护操作系统的安全和硬件资源的合理使用,该异常在管理模式下处理。
(6)数据中止访问异常该异常发生在要访问数据地址不存在或者为非法地址时,该异常在中止异常模式下处理。
2.1.2异常发生的硬件操作在异常发生后,ARM内核会自动做以下工作:(1)保存执行状态当前程序的执行状态是保存在CPSR里面的,异常发生时,要保存当前的CPSR里的执行状态到异常模式里的SPSR里,将来异常返回时,恢复回CPSR,恢复执行状态。
(2)模式切换硬件自动根据当前的异常类型,将异常码写入CPSR里的M[4:0]模式位,这样CPU就进入了对应异常模式下。
不管是在ARM状态下还是在THUMB状态下发生异常,都会自动切换到ARM状态下进行异常的处理,这是由硬件自动完成的(当一个异常发生时,ARM处理器总是切换到ARM状态(即非Thumb状态)。
Thumb指令集没有包含进行异常处理时需要的一些指令,因此在异常中断时,还是要使用ARM指令。
),将CPSR[5]设置为0。
同时,CPU会关闭中断IRQ(设置CPSR寄存器I位),防止中断进入,如果当前是快速中断FIQ 异常,关闭快速中断(设置CPSR寄存器F位)。
(3)保存返回地址当前程序被异常打断,切换到异常处理程序里,异常处理完之后,返回当前被打断模式继续执行,因此必须要保存当前执行指令的下一条指令的地址到LR_excep(异常模式下LR,并不存在LR_excep寄存器,为方便读者理解加上_excep,以下道理相同),由于异常模式不同以及ARM内核采用流水线技术,异常处理程序里要根据异常模式计算返回地址。
(4)跳入异常向量表该操作是CPU硬件自动完成的,当异常发生时,CPU强制将PC的值修改为一个固定内存地址,这个固定地址叫做异常向量。
2.1.3异常返回地址一条指令的执行分为:取指,译码,执行三个主要阶段,CPU由于使用流水线技术,造成当前执行指令的地址应该是PC–8(32位机一条指令四个字节),那么执行指令的下条指令应该是PC–4。
在异常发生时,CPU自动会将将PC–4的值保存到LR里,但是该值是否正确还要看异常类型才能决定。
各模式的返回地址说明如下:(a)一般/快速中断请求:快速中断请求和一般中断请求返回处理是一样的。
通常处理器执行完当前指令后,查询FIQ/IRQ中断引脚,并查看是否允许FIQ/IRQ中断,如果某个中断引脚有效,并且系统允许该中断产生,处理器将产生FIQ/IRQ异常中断,当FIQ/IRQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当FIQ/IRQ 异常中断产生时,处理器将值(pc-4)保存到FIQ/IRQ异常模式下的寄存器lr_irq/lr_irq中,它指向当前指令之后的第2条指令,因此正确返回地址可以通过下面指令算出:SUBS PC,LR_irq,#4;一般中断SUBS PC,LR_fiq,#4;快速中断注:LR_irq/LR_fiq分别为一般中断和快速中断异常模式下LR,并不存在LR_xxx寄存器,为方便读者理解加上_xxx(b)预取指中止异常:在指令预取时,如果目标地址是非法的,该指令被标记成有问题的指令,这时,流水线上该指令之前的指令继续执行,当执行到该被标记成有问题的指令时,处理器产生指令预取中止异常中断。
发生指令预取异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令,因此指令预取中止异常中断应该返回到产生该指令预取中止异常中断的指令处,而不是当前指令的下一条指令。
指令预取中止异常中断由当前执行的指令在ALU里执行时产生,当指令预取中止异常中断发生时,程序计数器pc的值还未更新,它指向当前指令后面第2条指令(对于ARM 指令,它指向当前指令地址加8字节的位置;对于Thumb指令,它指向当前指令地址加4字节的位置)。
此时处理器将值(pc-4)保存到lr_abt中,它指向当前指令的下一条指令,所以返回操作可以通过下面指令实现:SUBS PC,LR_abt,#4注:LR_abt为中止模式下LR,并不存在LR_abt寄存器,为方便读者理解加上_abt (c)未定义指令异常:未定义指令异常中断由当前执行的指令在ALU里执行时产生,当未定义指令异常中断产生时,程序计数器pc的值还未更新,它指向当前指令后面第2条指令(对于ARM指令,它指向当前指令地址加8字节的位置;对于Thumb指令,它指向当前指令地址加4字节的位置),当未定义指令异常中断发生时,处理器将值(pc-4)保存到lr_und中,此时(pc-4)指向当前指令的下一条指令,所以从未定义指令异常中断返回可以通过如下指令来实现:MOV PC,LR_und注:LR_und为未定义模式下LR,并不存在LR_und寄存器,为方便读者理解加上_und (d)软中断指令(SWI)异常:SWI异常中断和未定义异常中断指令一样,也是由当前执行的指令在ALU里执行时产生,当SWI指令执行时,pc的值还未更新,它指向当前指令后面第2条指令(对于ARM 指令,它指向当前指令地址加8字节的位置;对于Thumb指令,它指向当前指令地址加4字节的位置),当未定义指令异常中断发生时,处理器将值(pc-4)保存到lr_svc中,此时(pc-4)指向当前指令的下一条指令,所以从SWI异常中断处理返回的实现方法与从未定义指令异常中断处理返回一样:MOV PC,LR_svc注:LR_svc为管理模式下LR,并不存在LR_svc寄存器,为方便读者理解加上_svc (e)数据中止异常:发生数据访问异常中断时,程序要返回到该有问题的指令处,重新访问该数据,因此数据访问异常中断应该返回到产生该数据访问中止异常中断的指令处,而不是当前指令的下一条指令。
数据访问异常中断由当前执行的指令在ALU里执行时产生,当数据访问异常中断发生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置)。
此时处理器将值(pc-4)保存到lr_abt中,它指向当前指令后面第2条指令,所以返回操作可以通过下面指令实现:SUBS PC,LR_abt,#8注:LR_abt为中止模式下LR,并不存在LR_abt寄存器,为方便读者理解加上_abt 上述每一种异常发生时,其返回地址都要根据具体异常类型进行重新修复返回地址,再次强调下,被打断程序的返回地址保存在对应异常模式下的LR_excep里。
2.1.4异常向量表异常向量表是一段特定内存地址空间,每种ARM异常对应一个字长空间(4Bytes),正好是一条32位指令长度,当异常发生时,CPU强制将PC的值设置为当前异常对应的固定内存地址。
如表1所示是S3C2440的异常向量表。