当前位置:首页 > 行业动态 > 正文

Linux中中断异常是如何发生的?

Linux 中的中断异常处理机制包括信号、中断向量表和异常处理程序,用于响应硬件或软件事件。

在Linux操作系统中,中断和异常是处理器响应外部或内部事件的重要机制,它们通过打断CPU的正常执行流程,让系统能够及时处理紧急或特殊的任务,以下是对Linux中中断和异常的详细解析:

Linux中中断异常是如何发生的?  第1张

中断与异常的基本概念

中断(Interrupt)

中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序,Linux中通常分为同步中断(又叫硬件中断)和异步中断(又叫异常)。

同步中断:当指令执行时由CPU控制单元产生,只有在一条指令执行完毕后CPU才会发出中断,例如系统调用。

异步中断:由其他硬件设备依照CPU时钟信号随机产生,意味着中断能够在指令之间发生,例如键盘中断。

异常(Exception)

异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的,异常可以分为以下几类:

故障(Fault):通常可以纠正,一旦纠正,程序就可以在不失连贯性的情况下重新开始,保存在EIP中的值是引起故障的指令地址,当异常处理程序终止时,那条指令会被重新执行。

陷阱(Trap):在陷阱指令执行后立即报告;主要用于调试程序,在这种情况下,中断信号的作用是通知调试程序一条特殊指令已被执行。

中止(Abort):发生一个严重的错误,异常处理程序会强制终止当前进程。

编程异常:也叫软中断,是由int或int3指令触发的,当into(检查溢出)和bound(检查地址出界)指令检查的条件不为真时,也引起编程异常,控制单元把编程异常作为陷阱来处理。

中断信号的作用

中断信号提供了一种特殊的方式,使处理器转而去运行正常控制流之外的代码,当一个中断信号到达时,CPU必须停止它当前正在做的事情,并且切换到一个新的活动,为了做到这一点,就要在内核态堆栈保存程序计数器的当前值,并把与中断类型相关的一个地址放入程序计数器,中断处理与进程切换有一个明显的差异:由中断或异常处理程序执行的代码不是一个进程,更确切地说,它是一个内核控制路径,代表中断发生时正在运行的进程。

中断和异常的分类

Intel文档把中断和异常分为以下几类:

类别 原因 异步/同步 返回行为
中断 来自I/O设备的信号 异步 总是返回到下一条指令
陷阱 有意的异常 同步 总是返回到下一条指令
故障 潜在可恢复的错误 同步 返回到当前指令
终止 不可恢复的错误 同步 不会返回

异常中断向量表

CPU是根据中断号获取中断向量值,即对应中断服务程序的入口地址值,为了让CPU由中断号查找到对应的中断向量,需要在内存中建立一张查询表,即中断向量表(在32位保护模式下该表称为中断描述符表),80×86微机支持256个中断,对应每个中断需要安排一个中断服务程序。

IRQ线和高级可编程中断控制器

每个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线,所有现有的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,可编程中断控制器执行下列动作:监视IRQ线,检查产生的信号;如果一个引发信号出现在IRQ线上,把接收到的引发信号转换成对应的向量;把这个向量存放在中断控制器的一个I/O端口,从而允许CPU通过数据总线读此向量;把引发信号发送到处理器的INTR引脚,即产生一个中断;等待,直到CPU通过把这个中断信号写进可编程中断控制器的一个I/O端口来确认它;当这种情况发生时,清INTR线,然后返回到第1步,IRQ线是从0开始顺序编号的。

Linux内核对异常的处理

Linux内核对异常的处理包括初始化各种异常的处理向量,以及在异常发生时执行相应的处理函数,这些处理函数通常涉及保存寄存器状态、更新计数器等操作,以便在中断处理完成后能够正确地返回到中断前的执行位置。

Linux中的中断和异常机制是操作系统响应外部或内部事件的重要手段,通过合理地设置和管理中断和异常,可以提高系统的实时性和稳定性,了解中断和异常的工作原理也有助于开发人员更好地进行系统编程和故障排查。

以上内容就是解答有关“中断异常 linux”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。

0