什么是中断

本文详细介绍了中断的概念,包括外部中断(可屏蔽与不可屏蔽)、内部中断(软中断与异常),并探讨了中断处理过程和中断时的压栈技巧。重点讲解了中断在操作系统并发中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是中断

之前博主的博客里面反复使用了中断这个词汇,可能我是明白这是啥的。但是对于读者来说可能还有些陌生,所以今天就好好来讲讲什么是中断。

一个宏观的中断定义如下:由于CPU获知了计算机中发生了某件事,CPU暂停正在执行的程序,转而去执行处理该事件的程序。当这段程序执行完毕后,CPU继续执行刚才的程序。这个过程就叫中断。

一般来说,操作系统是一个死循环。那么它是如何进行并发运行的呢?原因就是中断。中断虽然会打断当前系统的运行,但是它却是提升整个系统利用率最有效的方式,也是操作系统并发运行的基石

中断分类

一般来说,来自CPU外部的中断就称为外部中断,来自CPU内部的中断就被称之为内部中断。再细分一点,外部中断可用按照是否会导致宕机分为可屏蔽中断和不可屏蔽中断两种;内部中断又可按照中断是否正常分为软中断和异常。

外部中断

外部中断的来源一般是某个硬件,所以外部中断又被称之为硬件中断。比如说,往来接收到了来自网络的数据包,这个时候网卡就会通知CPU,CPU的到通知就会将数据放到内核缓冲区。而CPU收到信号这个过程就是通过提供统一的接口作为中断信号的公共线路,所有来自外设的中断信号都功能公共线路连接到CPU

CPU会为外设提供两条信号线:

  • 一根是INTR,从这引脚收到的中断都是不影响系统运行的,可用随时处理甚至不处理;
  • 另外一根是NMI,这个引脚收到的信号都是致命错误,不得不处理甚至没办法处理。

在这里插入图片描述
CPU在收到中断后,会通过传入的中断向量号在中断向量表中进行查询。而这个中断向量号就是通过这两个引脚之一被传入的。

可屏蔽中断

可屏蔽中断就是通过我们刚刚所说的INTR引脚触发的。这里的可屏蔽的意思是此外部设备发出的中断,CPU可以不理会,因为它不会让系统宕机,所以可以通过寄存器eflags寄存器的IF位将所有的这些外部设备的中断屏蔽。

即使CPU理会这些中断,也可以只执行中断处理程序的上半部分。

:中断处理程序分为上半部分和下班部分,把中断处理程序中需要立即执行的部分划分为上半部分,这部分是需要紧急执行的;而中断处理程序中那些不紧急的部分则被推迟到下半部分中去执行。

一般来说,当上半部分执行完之后,就把中断打开了;所以说,中断处理程序的下半部分是处于开中断情况下执行的。

不可屏蔽中断

不可屏蔽中断是通过NMI引脚触发的,它表示系统中发生了致命的错误,计算机的本次执行就到此为止了。

内部中断

内部终端分为软中断异常

  • 软中断:是由软件主动发起的中断,因为来自于软件,所以称之为软中断。
  • 异常:异常时另外一种内部中断,是指令执行期间CPU内部产生的错误引起的

引发内部中断

以下指令是可以发起中断的指令:

  • int + 8位立即数:系统调用常用指令
  • int3:其为调试断点指令,其所触发的中断向量号为3。我们常用的gdb调试程序的时候,实际上就是调试器fork了一个子进程,子进程用于运行被调试的程序。调试器中经常要设置断点,其原理就是父进程修改了子进程的指令,将其用int3指令替换,从而子进程调用int3指令触发中断。之后会保存当前的一个状态,这个时候调用print便可以查看变量信息了。
  • into:中断溢出指令,触发的中断向量号为4
  • bound:检查数组索引越界指令,触发5号中断
  • ud2:未定义指令,触发6号指令。该指令表示指令无效,CPU无法识别

引发异常

  • fault:故障,其是一种可以被修复的异常。最常见的就是 page fault 缺页异常了。
  • trap:陷阱,这个异常会导致程序停下来,其实也就是刚刚的int3指令。
  • abort:终止,最严重的异常类型,一旦出现就表示错误已经无法被修复了。系统为了自保会 kill 此进程。

以下是常用的异常和中断表:
在这里插入图片描述

中断处理过程

中断的处理过程一般来说分以下几部分:

  1. 中断信号的接收:
    • CPU外:中断代理芯片接收外部中断,之后将该终端的中断向量号发送到CPU
    • CPU内:CPU执行该中断向量号对应的中断处理程序
  2. 在收到中断向量号之后,CPU根据其取定位中断处理程序。
  3. 处理器进行特权级检查
  4. 执行中断处理程序

在这里插入图片描述
而在执行完程序之后,这个时候我们需要用到iret命令返回。它会从栈中弹出数据到cs、eip、eflags等等。

中断时的压栈

当当前进程被中断打断后,为了从中断返回后能继续运行该进程,处理器自动把CS、EIP、EFLAGS的当前值保存到中断处理程序使用的栈中。另外,如果涉及到特权级的编号,我们处理器还会压入SS和ESP这两个寄存器。

我们细说一下这个过程:
1) 之前说到会进行一个特权级的检查,如果当前的特权级CPL数值上比将要执行的中断处理程序的特权级DPL大的话,这表示要向高特权转移。于是处理器就会先保存当前旧栈的SS和ESP的值。
在这里插入图片描述
2)在栈中压入EFLAGS寄存器
在这里插入图片描述
3)因为涉及到远段间转移,所以需要压入CS和EIP寄存器
在这里插入图片描述
4)某些异常会有错误码,其会跟着EIP进行入栈
在这里插入图片描述

参考文献

[1] 操作系统真相还原
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenmingik

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值