什么是中断
假设你在玩王者荣耀,突然一个电话过来…, 这就是中断!
对CPU来说就是:CPU在执行某一段程序的时候收到某些特定信号转而去执行另一段特定程序的过程。


那为什么需要中断呢?原因是CPU不能闷着头啥也不管一个劲的只管执行代码,还得和连接在主板上的其它硬件打交道。经常和CPU保持联系的硬件有键盘、鼠标、磁盘,还有网卡等。如果没有中断那就意味着你猛敲键盘电脑都没反应,这显然不是你想要的结果。注意一点就是上图中,当CPU收到一个中断请求转去执行中断处理程序之后,不一定会返回继续执行原来的程序A,有可能是另一段程序B。就好比你玩荣耀,突然接了一个电话之后可能就是扔下手机领快递去了。

中断如何发生
从某种角度来讲中断可以理解为外部硬件和CPU的一种通信方式。一般CPU与硬件通信的方式有两种轮询和中断,早期的CPU处理外设的事件(比如接收键盘输入),往往采用“轮询”的方式。轮询是指CPU像个查岗的一样轮番对外设顺序访问,比如它先看看键盘有没被按下,有的话就处理,没的话继续往下看鼠标有没有移动,再看看打印机……这种方式使CPU的执行效率很低。中断模式时就是说CPU不主动访问这些设备,只管处理自己的任务。如果有设备要与CPU联系,或要CPU处理一些事情,它会给CPU发一个中断请求信号。这时CPU就会放下正在进行的工作而去处理这个外设的请求。处理完中断后,CPU返回去继续执行中断以前的工作。
一般CPU每执行一条指令就会检查是否有中断过来。一旦发生了中断,就把手头的工作先放一边,去处理一下。
上文提到有很多种硬件要和CPU联系,那么CPU如何区分不同硬件的中断信号呢?答案是靠一个叫做可编程中断控制器PIC的东西,外号8259A,各种外设想发中断请求信号都得通过这个PIC,所以CPU只需要和PIC进行对接就行。

实际长这样:

所有的需要发中断的外设都要和中断控制器的引脚相连,控制器会根据引脚的编号来给中断编号,比如1号中断,2号中断,…这样CPU就可以区分中断了。接下来的问题是,一个特定的中断过来后,比如110号中断过来了,CPU如何找到所对应的的处理程序?
实际上操作系统也给不同中断处理都分配了一个编号,叫做中断向量。操作系统还准备了一个表格叫中断描述符表IDT,表格里记录了很多信息,其中就有处理这个中断号对应的函数地址。CPU找PIC拿到编号后就执行处理函数就OK了。中断描述符表一般是保存在内存中,然后用一个寄存器IDTR(Interrupt Descriptor Table Register ),中断描述符表寄存器来保存这个表的地址。上面的例子,CPU收到110号中断信号后,根据IDTR寄存器找到中断描述符表,然后读取这个表中的第110表项就能找到110号中断的处理程序的函数地址。


因为中断处理完之后是要回去继续执行之前的程序的,所以当发生中断的时候,操作系统需要进行上下文切换,就是要先保存当前的工作状态,以便中断处理完再恢复到原来的状态。具体就是把当前执行的这个线程的各个寄存器的值,执行到哪里了等等这些信息都保存在这个线程的内核栈里去。
不过有时候在执行一些非常重要的事情的时候,就不想被打断。于是CPU在一个叫eflags的寄存器中设置了一个标记,如果是1才允许被打断,如果是0那就算天王老子找也不管了。

当然,也有一些特别重要的中断是不能屏蔽的,一般是碰到了特别严重的故障!
中断的分类
其实上面讲的中断只是广义中断中的一种:外部中断。中断的分类如下:

外部中断

1、可屏蔽中断:通过INTR线向CPU请求的中断,主要来自外部设备如硬盘,打印机,网卡等。此类中断并不会影响系统运行,可随时处理,甚至不处理,所以名为可屏蔽中断。

2、不可屏蔽中断:通过NMI线向CPU请求的中断,如电源掉电,硬件线路故障等。这里不可屏蔽的意思不是不可以屏蔽,不建议屏蔽,而是问题太大,屏蔽不了,不能屏蔽的意思。
注:INTR和NMI都是CPU的引脚

内部中断
内部中断又叫软中断或者异常
1、陷阱:是一种有意的,预先安排的异常事件,一般是在编写程序时故意设下的陷阱指令,而后执行到陷阱指令后,CPU将会调用特定程序进行相应的处理,处理结束后返回到陷阱指令的下一条指令。如系统调用,程序调试功能等。

尽管我们平时写程序时似乎并没有设下陷阱,那是因为平常所用的高级语言对底层的指令进行了太多层的抽象封装,已看不到底层的实现,但其实是存在的。例如printf函数,最底层的实现中会有一条int 0x80指令,这就是一条陷阱指令,使用0x80号中断进行系统调用。

2、故障:故障是在引起故障的指令被执行,但还没有执行结束时,CPU检测到的一类的意外事件。出错时交由故障处理程序处理,如果能处理修正这个错误,就将控制返回到引起故障的指令即CPU重新执这条指令。如果不能处理就报错。

常见的故障为缺页,当CPU引用的虚拟地址对应的物理页不存在时就会发生故障。缺页异常是能够修正的,有着专门的缺页处理程序,它会将缺失的物理页从磁盘中重新调进主存。而后再次执行引起故障的指令时便能够顺利执行了。

3、终止:执行指令的过程中发生了致命错误,不可修复,程序无法继续运行,只能终止,通常会是一些硬件的错误。终止处理程序不会将控制返回给原程序,而是直接终止原程序

我所理解的CPU中断相关推荐

  1. 8086为什么不用c语言,现代汇编教材还是基于8086,对理解当今CPU(如i9)有帮助吗,还是教程太滞后?_科技数码通...

    汇编没用?胡说八道! 汇编难学?胡说八道! 任何一种高端应用场景,都需要汇编带来的高效率和高可靠性!何为高端?军事用途,工业用途,医疗领域!这些领域对运行效率和可靠性的需求都是无止境的高.你用c++可 ...

  2. 8.4-中断系统小结(cpu中断七个问题)

    [README] 本文转自bilibili<计算机组成原理(哈工大刘宏伟)>的视频讲解,非常棒,墙裂推荐: [1]中断介绍 1)作用:用中断系统实现了外设数据的输入输出: 还可以用于程序调 ...

  3. 理解linux cpu load

    理解linux cpu load 译文原文 你可能已经很熟悉linux的平均load. 平均load是3个数 (可以用uptime或者top命令查看), 他们看着像下面这样: load average ...

  4. 8086为什么不用c语言,现代汇编教材还是基于8086,对理解当今CPU(如i9)有帮助吗,还是教程太滞...

    基于8086的汇编教材对理解CPU i9没有多大帮助,至少应当从早期的32位X86的汇编教材入手,对32位的系统能有一个基础的了解,如保护地址模式.协处理器.高速缓存等,进而对后期多核多线程的i3,i ...

  5. 深入理解Intel CPU体系结构【值得收藏!】

    了<计算机系统结构>.<深入理解计算机系统>.<大话处理器>等经典书籍,也在google上搜了一大堆资料,前前后后.断断续续的折腾了一个多月,终于想通了,现在把自己 ...

  6. 【纯干货!】深入理解Intel CPU体系结构

    看了<计算机系统结构>.<深入理解计算机系统>.<大话处理器>等经典书籍,也在google上搜了一大堆资料,前前后后.断断续续的折腾了一个多月,终于想通了,现在把自 ...

  7. 现代汇编教材还是基于8086,对理解当今CPU(如i9)有帮助吗,还是教程太滞后?

    任何一种高端应用场景,都需要汇编带来的高效率和高可靠性!何为高端?军事用途,工业用途,医疗领域!这些领域对运行效率和可靠性的需求都是无止境的高.你用c++可以调用一个第三方函数库很方便的写出一个PID ...

  8. linux php cpu,理解Linux CPU负载和 CPU使用率

    CPU负载和 CPU使用率 这两个从一定程度上都可以反映一台机器的繁忙程度. cpu使用率反映的是当前cpu的繁忙程度,忽高忽低的原因在于占用cpu处理时间的进程可能处于io等待状态但却还未释放进入w ...

  9. C64x+ CPU中断

    中断类型 在 CPU 中有 4 种中断类型: • 复位 • 可屏蔽 • 不可屏蔽 • 异常 ( 仅 C64x+ 核 ) 表 1  中断优先级 Priority Interrupt Name Inter ...

  10. CPU中断的硬件实现原理

    内容整理自较早前的微机原理学习笔记,重点梳理了实现硬件中断机制所依赖几个数据结构和硬件原件. 为什么需要中断? 中断机制的出现是为了协调处理器与外部设备速度不一致的问题,以提高处理器的利用率. 试想我 ...

最新文章

  1. 30岁暂别职场、40岁提前退休:不上班的生活,开心吗?
  2. 计算机导论的学科知识体,依托学科课程体系的《计算机导论》课程改革
  3. python代码大全下载-最全Python算法实现资源汇总!
  4. 实验Matlab数值运算,MATLAB数值实验一(数据的插值运算及其应用完整版
  5. 湫湫系列故事——消灭兔子(优先队列)
  6. 使用numpy.tanh()打印矢量/矩阵元素的双曲正切值 使用Python的线性代数
  7. MacOS下MySQL配置
  8. wxpython pypi_Python iwx包_程序模块 - PyPI - Python中文网
  9. 悲催!谷歌员工中位数年薪达 170 万元,却仍买不起房!
  10. 95-130-020-源码-source-SourceFunction
  11. Excel中的图表制作(一) -各种商品销售量显示
  12. 微信小程序实现图片上传功能
  13. 【工具-SublimeText3】在SublimeText3中无法高亮 .vue 文件内容和less代码的解决方案
  14. Duang~ Golang 学习初探
  15. Cocos2d-x2.1.1-ClippingNodeTest 深入分析
  16. python编辑程序模型_用Python的SimPy库简化复杂的编程模型的介绍
  17. Java 泛型的本质——类型擦除
  18. 《剑与电——角色扮演游戏设计艺术》读书笔记(二)
  19. 计算机房英语单词,计算机与网络英语词汇(O1)
  20. 利用matlab工具箱的pid参数科学整定方法

热门文章

  1. matlab离散系统的频率响应,离散系统的频率响应分析
  2. 北大计算机博士毕业难度,北京大学博士毕业要求
  3. 打开html自动播放音乐,如何使背景音乐在打开网页时就自动播放
  4. 什么叫断章取义,什么叫曲解
  5. TILDE: A Temporally Invariant Learned DEtector学习笔记
  6. arm板上sqlite3移植及使用
  7. 10-24程序员们 节日快乐!
  8. 值得回忆2012年-飘渺的2013年
  9. 铲雪车(信息学奥赛一本通-T1374)
  10. 疫情之下,这10个技巧助你开启云面试的正确姿势