这篇文章是四月写的一份报告,当时花费了很长时间,现在重新整理下。
中断(Interrupt)是硬件和软件驱动事件,它使得CPU暂停当前的主程序,并转而去执行一个中断服务程序。
当CPU与外设交换信息时,若用查询方式,则CPU就要浪费很多时间去等外设。这是快速的CPU与慢速的外设之间的矛盾,也是计算机发展过程中遇到的一个严重的问题之一,为了解决这个问题,一方面要提高外设的工作速度;另一方面引入了中断的概念。
在微机系统中,中断可分为外部中断(或硬件中断)和内部中断(或软件中断)。
外部中断是指由外部设备通过硬件请求的方式产生的中断,也称为硬件中断。
外部中断又可分为非可屏蔽中断(non-maskable interrupt,NMI)和可屏蔽中断(interrupt request),CPU通过NMI和INTR引脚分别接收这两种中断。
系统中必须由硬件实现的中断有:保护中断点,转向中断服务程序入口。
内部中断是由CPU运行程序错误或执行内部程序调用引起的一种中断,也称为软件中断,它分为异常和INT n指令中断两类,内部中断不受eflags中IF位的影响。
异常分为故障(Fault)、陷阱(Trap)和中止(Abort)3种。是在指令执行过程中由于微处理器内部操作发生异常引起的,如硬件失效或非法的系统调用,以及程序员预先设置断点等。
INT n指令中断是指系统执行INT n指令所引起的中断。其实INT n和INT0也归类于异常,属同步性事件。
系统中必须由软件实现的中断有:中断服务,返回到中断点。
在微机系统中,对于外部中断,中断请求信号是由外部设备产生,并施加到CPU的NMI或INTR引脚上,CPU通过不断地检测NMI和INTR引脚信号来识 别是否有中断请求发生。对于内部中断,中断请求方式不需要外部施加信号激发,而是通过内部中断控制逻辑去调用。无论是外部中断还是内部中断,中断处理过程 都要经历以下步骤: 请求中断→响应中断→关闭中断→保留断点→中断源识别→保护现场→中断服务子程序→恢复现场→中断返回。
详细的过程如下:
X86 CPU支持256个中断向量,0~19是系统预定义的异常和NMI,20~31被Intel保留,所以外部中断从32开始(Linux使用80h实现系统调用)。
CPU处理的流程都一样,在执行完当前指令后,根据中断源提供的中断向量,在IDT中找到并调用相应的服务例程。
x86中断分为实模式中断和虚模式中断。在实模式下,0~1KB的内存存放中断向量表,每项由2字节的段地址和2字节的段偏移组成,共256项。
保护模式下,通过中断门实现。x86中断系统具体分类如下结构:
ARM处理器的中断主要有两种:IRQ普通中断和FIQ快速中断。快速中断本质上与普通中断没有太大的差别,它们在处理机制上有许多相同的地方。IRQ中断是最频繁的也是最为影响系统性能的。
在IRQ中断发生时,ARM处理器的硬件会自动执行以下工作:
FIQ适用于对一个突发事件的快速响应,这是因为该模式下有8个寄存器用来满足寄存器保护的需要。特权模式下,可通过置位CPSR的F位禁止FIQ异常。
IRQ异常由nIRQ输入端的低电平所产生的正常中断。IRQ的优先级低于FIRQ。相应的在一个特权模式下,都可通过置位CPSR中的I位来禁止IRQ。
主要由中断源和控制寄存器两大部分组成,其寄存器主要有四种:模式、屏蔽、优先级、挂起寄存器。具体如下图:
中断系统有6个分仲裁器和一个总仲裁器,每一个仲裁器都可以处理6路中断。
MIPS中有3种中断模式:
MIPS的中断处理,通常来说,和其他体系结构的 中断处理,没有太多的区别,总的来说分为三段:
从异常状态返回的这个动作,是由硬件完成的。它必须同时完成三个操作:
如果这三个过程没有能够“原子地”执行完毕,那么将会导致一个安全漏洞,用户有可能在某种情况下僭越CPU内核态设定的壁垒,从而非法获得管理员权限。
MIPS CPU有8个独立的中断位(在Cause寄存器中),其中,6个为外部中断,2个为内部中断(可由软件访问)。一般来说,片上的时钟计数/定时器,会连接到一个硬件位上去。
当MIPS CPU发生中断后,CPU的状态变化到如下状态,总结如下列表:
EPC寄存器保存了发生中断是程序执行指令的地址
CP0中STATUS寄存器 EXL置位为1,表示正在异常状态,这个时候CPU不能再响应中断(不管IE是否开启),自动进入核心状态。
CP0中CAUSE寄存器中ExcCode为0,表示是中断异常
CP0中CAUSE寄存器IP被设置为不同的中断号
规则如下:
中断处理程序也是用通用异常入口。但有些新的CPU有变化。
当CPU响应中断、保护断点之后,就要进行中断源的识别,即寻找中断源,找到相应的中断服务程序入口。识别中断源有三种方法:查询法、向量法和强置程序计数器法。
这是通过程序来查询是哪一个中断源提出的中断请求。该方法需要必要的硬件支持。设置一个输入端口,以便CPU可通过该端口读取各个中断请求触发器的 状态。在响应中断周期之后,对所有的中断,都先进入到这个查询流程。先看中断源1 是否提出请求,若是,转去执行中断源1的中断服务程序,否则再看中断源2是否提出 请求,若是,转去执行中断源2的中断服务程序。否则继续查看后面的中断源。
查询的顺序决定了中断的优先级,这是因为,当发现一个中断源提出中断请求后,就转去执行相应的服务程序,而不再继续向下查找,不管它们是否也提出了请求。中断源1的级别最高,中断源2的级别次之,中断源n的级别最低。
查询法的优点是硬件简单、程序层次分明,只要改变程序中的查询次序即可改变中断源的中断优先级,而不必变更硬件连接,其缺点是速度慢(从CPU响应中断到进入中断服务的时间较长),实时性差,特别是当中断源较多时,尤为突出。此外,查询要占用CPU时间,降低了CPU的使用效率。
这是一种硬件方法。在CPU发出中断响应信号INTA时,由硬件产生请求中断且在当前所有请求中级别最高的中断源的中断标识码(早期微机系统中称之为中断向量,向量法因此得名,而在8086/8088系统以及PC系列机中称之为中断类型码)。中断标识码是中断源的识别标志,可用来形成相应的中断服务程序的人口地址或存放中断服务程序的首地址。该方法需要的硬件支持。当有中断源提出请求时,中断排队与编码器进行判优并产生其中级别最高的中断源的中断标识码。在INTA来时,CPU通过三态门获得中断标识码。
用向量法识别中断源不占用CPU额外的时间,在中断响应周期即可完成,所以得到广泛的应用。即便在功能相对简单的单片机中,一般也采用此方法。
MIPS和ARM都是RISC架构,但是两者在很多方面有比较大的区别。CPU的行为比ARM更加精简,连TBL查找都需要靠软件来设置。ARM更像是介于MIPS和X86之间的一种CPU,结合了两者的一些特点。
《计算机系统结构》(第二版)清华出版社 郑炜民 汤志忠 编著
《嵌入式系统结构》清华出版社 李宥谋 编著