中断与异常


title: 中断与异常
date: 2022-01-17 22:10:24
tags:
categories: 计算机体系结构
description: 中断和异常是指系统、处理器在执行指令过程中突然被别的请求打断而终止当前的程序,转而去处理其他程序。待该中断处理程序处理完后回到该程序中断点继续执行之前程序。

一、什么是中断/异常

中断和异常是指系统、处理器在执行指令过程中突然被别的请求打断而终止当前的程序,转而去处理其他程序。待该中断处理程序处理完后回到该程序中断点继续执行之前程序。

二、异常与中断向量

为了有助于处理异常和中断,每个需要被处理的异常和中断条件被赋予一个标识号,这个标识号就是向量。处理器将这些向量用作中断描述符 IDT 中的一个索引号,来定位一个异常或中断的处理入口点位置。

允许的向量号范围是 0 到 255。其中 0 到 31 保留用作 80X86 处理器定义的异常与中断。范围在 32 到 255 的向量号用于用户定义的中断。对于每个异常,该表给出了异常类型以及是否产生一个错误码并保存在堆栈上。

三、中断和异常源及其分类

3.1 中断源

  • 外部(硬件)中断

    外部中断通过处理器芯片上两个引脚(INTR 和 NMI)接收。其中,NMI 为不可屏蔽中断,INTR 为可屏蔽中断。

可屏蔽中断受标志寄存器 EFLAGS 的中断标志 IF(Interrupt enable Flag)控制。当 IF=0 时,处理器禁止发送到 INTR 引脚的的中断;当 IF=1 时。则发送到 INTR 引脚的中断信号会被处理器进行处理。

IF 标志可以使用指令 STI 和 CLI 来设置或清除。

  • 软件中断

    通过在指令操作数中提供中断向量号。INT n 指令可用于从软件中产生中断。

3.2 异常分类

  • Fault(故障)

    一种通常可以被纠正的异常,并且一旦被纠正,程序可以继续执行。

    当出现一个 Fault,处理器会把机器状态恢复到产生 Fault 的指令之前的状态。此时异常处理程序的返回地址会指向产生 Fault 的指令,而不是其后面一条指令。

  • Trap(陷阱)

    陷阱通常认为是“有意”的异常。陷阱通常由处理器正在执行的现行指令引起。陷阱处理程序提供的服务为当前进程所用。返回执行下一条指令

  • Abort(中止)

    一种不会总是报告导致异常的指令的精确位置的异常,并且不允许导致异常的程序重新继续执行。

    Abort 用于报告严重错误,例如硬件错误以及系统表存在不一致性或非法值。

3.3 异常和中断的优先级

四、中断描述符表

4.1 IDT

中断描述符表 IDT(Interrupt Description Table)将每个异常或中断向量分别与它们的处理过程联系起来。向量号×8 就可以找到相应的门描述符。由于只有 256 个中断会异常,所以 IDT 不必包含多于 256 个描述符。

由于 IDT 可以驻留在地址空间的任何位置,处理器使用 IDTR 寄存器来定位 IDT 的位置,IDTR 寄存器结构如下。它包含 32 位的基地址和 16 位的限长值。限长值表示 IDT 的长度。

4.2 IDT 描述符

IDT 表中可以存放三种类型的门描述符:

  • 中断门描述符
  • 陷阱门描述符
  • 任务门描述符

当相应一个异常或中断时,处理器使用异常或中断的向量表作为 IDT 表的索引。对应的门描述符中的段选择符指向 GDT 或者 LDT 中可执行的代码描述符。偏移字段指向异常或中断处理过程的开始处。这个过程有很多保护模式的知识,在这里就不赘述。

五、中断与异常处理过程

对于整个中断处理,我们可以总结出以下几个步骤:

  • 中断请求阶段
  • 中断响应阶段
  • 中断服务阶段
  • 中断返回阶段

5.1 中断请求阶段

5.1.1 硬件中断请求

当设备向处理器提出(中断)服务请求时,处理器会在执行完当前的一条指令后立刻应答设备的请求,并转而执行该设备的相关服务程序。当服务程序执行完成后,处理器会接着去做刚才被中断的程序。这种处理方式就叫做中断(interrupt)方法,而设备向处理器发出的服务请求则称为中断请求(IRQ- Interrupt Reqμuest)。处理器响应请求而执行的设备相关程序则被称为中断服务程序或中断服务过程(ISR- Interrupt Service routine)。
可编程中断控制器(PIC- Programmable Interrupt Controller)是用来管理设备中断请求的。它负责接收设备中断请求并将其发送给处理器。

5.1.2 软件中断请求

发生在 CPU 内部的中断,不需要中断请求,CPU 内部的中断控制逻辑直接接收处理。

5.2 中断响应阶段

  • 关中断;
  • 保护断点;
  • 获得中断服务程序的入口地址。

处理器根据中断向量在中断描述符表找到相应的门描述符,并通过描述符表 GDT/LDT 找到对应的异常或中断处理过程。

5.3 中断服务过程

  • 保护现场。在中断服务程序的起始部分安排若干条入栈指令,将各寄存器的内容压入堆栈保存。
  • 开中断。 在中断服务程序执行期间允许级别更高的中断请求中断现 行的中断服务程序,实现中断嵌套。
  • 中断服务。 完成中断源的具体要求。
  • 恢复现场。 中断服务程序结束前,必须恢复主程序的中断现场。通常是将保存在堆栈中的现场信息弹出到原来的寄存器中。
  • 中断返回。 返回到原程序的断点处,继续执行原程序。
_divide_error:
	pushl $_do_divide_error
no_error_code:
	xchgl %eax,(%esp)
	pushl %ebx
	pushl %ecx
	pushl %edx
	pushl %edi
	pushl %esi
	pushl %ebp
	push %ds
	push %es
	push %fs
	pushl $0		# "error code"
	lea 44(%esp),%edx
	pushl %edx
	movl $0x10,%edx
	mov %dx,%ds
	mov %dx,%es
	mov %dx,%fs
	call *%eax
	addl $8,%esp
	pop %fs
	pop %es
	pop %ds
	popl %ebp
	popl %esi
	popl %edi
	popl %edx
	popl %ecx
	popl %ebx
	popl %eax
	iret

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值