离做出那个决定已经两年了。两年之后,对自己当初执意做的决定丝毫没有后悔,我的人生就该我自己来过,就像wall-e里船长说的:I don't wana survive,I wanna live.回首两年,基础已经学了一些,对此行业的水深也有所了解。资质平平的自己,也许终将不会成为一个专家,但于坚持和投入中得到的,已经远远超过最后的结果了。在这里看到当年出发前的忐忑,忽然有种“回首向来萧瑟处,也无风雨也无晴”的感觉,一切都只有当你踏出第一步后才会有所体会。希望再过些年,当我再次回首的时候,对我的人生会有更多感悟。 现在开始向更高一些的层次学习,感觉有必要将学过的一些概念理论彻底理解,而判断是否理解的标准就是能否清晰的解释给别人听。于是又想不偷懒了,把学到的概念认真总结一下,一来做个自己的小结资料,而来和各位同道交流分享,继续提高。希望能认识更多虽然很菜,却不停努力的朋友。好了,就从这里开始了。

近日阅读操作系统时,又涉及到中断的许多概念;于是又结合计算机接口技术和GOOGLE复习了一下中断。

中断(interrupt)的诞生,是来自于提高CPU利用率的考虑。试想一台无中断的计算机,假如CPU发出一个打印指令,然后只能不停忙等待,循环查询打印任务是否结束;在此期间CPU除了不停执行循环等待便什么都做不了,浪费了宝贵的CPU时间。于是人们想到,能否在发出打印任务后,让CPU去处理别的任务,而当打印完成后再转回来处理返回结果呢?

答案是肯定的,实现这一想法的技术就是中断。简单的说,中断就是在CPU向设备发出指令后立即返回处理其他任务,由设备自己处理指令;在设备完成指令后,向CPU发出一个信号,CPU就停下手头的任务,继续处理设备的返回信息。有点类似一个办公室的老大,向下属发出命令后就继续做其他事情,下属接到命令后就去处理这个命令,待命令结束后再敲老大的办公室,于是老大停下手头的工作,听下属完成任务后的汇报。

一切就是这么简单,计算机中的许多设置其实都和人类社会相似,因为计算机毕竟是一门人造科学嘛。好了,概念是简单的,但具体实现却未必那么简单了。中断涉及到软件、硬件各个方面。那么下面让我们来具体了解一下吧。

以8086为例,中断分为外部中断与内部中断,并且每个中断都有一个中断类型码。内部中断就是CPU内部产生的中断,如溢出中断、除法错中断、断电中断、单步中断、指令中断等,大多为报错和软件调用。而外部中断则是外设与CPU之间发生的中断,也是我们了解的重点。中断类型码顾名思义,就是判断中断属于哪个类型的。

好的,让我们关注外部中断。8086有两根外部中断线,分别是NMI——不可屏蔽中断请求和INTR——可屏蔽中断请求。为什么有这两个分类呢?其实思考下上面提出的办公室例子就不难理解,并不是任何时刻老大都会听你的汇报啊!一些紧急事情他当然是非处理不可,但对于非紧急事件,若他正忙,也可以不理你。CPU也是如此,所谓不可屏蔽中断,就是通知CPU发生了他一定要处理的事件,例如电源掉电,读写错,奇偶错等等。而可屏蔽中断,则可通过设置CPU的中断允许位IF来选择是否响应中断请求。

那么具体来看一下两个中断的特点。首先是NMI不可屏蔽中断请求,NMI是不受IF位控制的,也就是说无论怎么设置IF位对NMI都没有影响——这里来的中断必须得到处理。NMI信号一旦出现就立即被CPU锁存,是边沿触发,可见NMI待遇之高。NMI中断不需要中断源提供中断向量,他们有一个统一的中断向量2。为何用统一的中断向量?而这个统一的中断向量又如何区分不同的中断呢?答案是为了快,而区别类型的任务就交给中断查询程序了。若不是用统一中断向量,则CPU在响应中断前需要执行两个INTA中断响应总线周期,以进行中断前的一系列准备。而这对紧急的不可屏蔽中断来说是不可接受的时间代价!就好像火警当前,消防员们会慢吞吞的做准备吗?自然,NMI也是不会执行INTA总线周期的。于是NMI就使用这个统一的中断向量2,并按这个向量生成一个中断查询程序的地址,由中断查询程序来判断中断的类型,以求得对中断的最快速响应。

下面是INTR可屏蔽中断请求。前面讲过,INTR的屏蔽与否,就在于CPU的中断允许位IF的设置。可以将IF位看成一个办公室的门牌——若是1,则表示不要打扰,老大正忙;若是0则表示可以敲门进去。上面提到过CPU在响应INTR中断前要执行两个INTA总线周期,这两个总线周期里CPU都跑去干嘛了呢?正经事啦,第一个周期内,CPU通知中断控制器,你发来的中断请求我已经收到啦;第二个周期内,则通知中断控制器将中断类型码送过来以便我处理。看到这里大家应该发现不同了,是的,INTR的中断类型码是不同的。每个中断源都需要提供自己的中断类型码,而CPU则按这个中断类型码来找到处理这类中断的中断服务程序以便执行。

看起来好像不难嘛?是的,但是我们好像忽略了点什么?

对,我们忽略了一个重要的问题,CPU放下手头的任务,处理中断,处理完之后是不是该回过去继续之前的任务呢?如果是,那如何返回去呢?

我们都知道,CPU在任一时刻都有不同的状态,而CPU中的CS:IP在任一时刻都保存着下一步要执行的指令。那么我们就该在中断之前保存这两个东西,才能保证之后顺利返回啊。于是在中断信号来到之时,CPU便将FR(状态寄存器)和CS:IP的内容压进一个特定的栈中,这两步也叫做保护断点状态和保护断点地址。还需要做点别的来响应中断,分别是清除IF,也就是关掉别的中断,保证此刻只听你一个人的汇报;清除TF(单步执行位),保证CPU连续执行程序。

好了,做完这些CPU就可以响应NMI或是INTR信号了。

当然,中断还有许多具体的内容,比如如何根据中断向量生产中断服务程序的地址(中断向量表),中断控制器又是要来干什么的,以及多个中断同时出现时响应哪一个等等,这些就留给大家自己去查找啦。

小结一下:

中断是为了提高CPU的利用率。中断的大概过程为:设备完成任务后,向CPU发出中断信号,CPU若确定响应该中断信号,则根据中断源提供的中断向量生成中断服务程序的地址来执行中断服务程序,执行完成后CPU返回继续执行之前的工作。

转载于:https://www.cnblogs.com/nie_xin/archive/2009/05/30/1491960.html

浅析中断——回首两年相关推荐

  1. STM32使用串口IDLE中断的两种接收不定长数据的方式

    现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下: 方法1: ...

  2. 浅析P2P:两个没有公网IP的终端如何进行通信?

    转自P2P通信原理与实现(C++) 这个博主关于网络和信息安全的文章写得很详细,推荐 1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的 ...

  3. 浅析 Vue 的两个版本

    一.Vue 的两个版本 Vue 有两个版本,完整版和运行时版 完整版:同时包含编译器和运行时的版本,编译器就是用来将模板字符串编译成为 JavaScript 渲染函数的代码 运行时:用来创建 Vue ...

  4. STM32低功耗停止模式 以及简述判断中断的两种方式

    #include "wkup.h" #include "led.h" #include "delay.h" // //本程序只供学习使用,未 ...

  5. 终止线程的2种方法。标记法和中断

    引言 在原来的jdk版本中: 提供了暂停,恢复,终止线程的方法,分别是suspend(),resume(),stop(); 但是它们都存在缺陷,比如暂停suspend()方法在调用后,线程不会释放资源 ...

  6. linux kernel的中断子系统之(三):IRQ number和中断描述符【转】

    转自:http://www.wowotech.net/linux_kenrel/interrupt_descriptor.html 一.前言 本文主要围绕IRQ number和中断描述符(interr ...

  7. 【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 文章目录 ...

  8. 汇编cli(Clear Interrupt,禁止中断、关中断,对应的sti是开中断)

    CLI禁止中断发生,关中断 STI允许中断发生,开中断 这两个指令只能在内核模式下执行,不可以在用户模式下执行:而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中 ...

  9. 两个时间计算毫秒在线_蹲坑英语时间之in a jiffy

    话说前几天做了一个小视频,上传的时候网站跳出来一个温馨提示-- Your video will be ready in a jiffy. 不是in a second或者in a minute吗?jif ...

  10. linux内核同步之信号量、顺序锁、RCU、完成量、关闭中断【转】

    转自:http://blog.csdn.net/goodluckwhh/article/details/9006065 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一信号量 ...

最新文章

  1. linux开机自动打开全屏,如何修改Linux开机启动logo并使其全屏显示?
  2. (chap4 Http状态码) 5XX
  3. 剑指Offer(java答案)(51-60)
  4. 反射工具类,如斯优雅
  5. Soring冲刺计划第三天(个人)
  6. 强烈推荐|我做系统架构的一些原则
  7. 数平精准推荐 | OCR技术之数据篇
  8. HDU2612(BFS算法)
  9. Redis从入门到精通:初级篇(转)
  10. C语言 JSON 解析库 - MJSON使用介绍
  11. java数组 js数组的长度_js中split()方法得到的数组长度问题
  12. 关于 HTTP 请求头的内容
  13. mongodb与mysql的区别与具体应用场景
  14. 11G新特性 -- ASM Fast Mirror Resync
  15. 内核调试技巧-逆向寻踪,揭开 LACP 协议流程的神秘面纱
  16. 论述多媒体技术和计算机技术的发展,多媒体技术的发展现状和未来.doc
  17. 矩阵理论及其应用课后习题作业:第一章 第二章
  18. 对比无源蜂鸣器和有源蜂鸣器
  19. 基于Java毕业设计校园一卡通管理系统源码+系统+mysql+lw文档+部署软件
  20. 弘辽科技:淘宝保险保证金怎么开通?它和消保保证金有什么区别?

热门文章

  1. 初尝Spring Cloud Config
  2. [20141124]sql server密码过期,通过SSMS修改策略报错
  3. windows8 认识及使用
  4. 2013-07-23 IT 要闻速记快想
  5. JavaScript中单例模式的实现
  6. ElasticSearch6.8.1集群搭建及Java客户端编写
  7. win10软件安装出现错误代码2503/2502
  8. 【Spark】SparkStreaming-提交到集群运行
  9. codevs——T1048 石子归并
  10. pymysql 数据库操控