离做出那个决定已经两年了。两年之后,对自己当初执意做的决定丝毫没有后悔,我的人生就该我自己来过,就像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