提交 6581fbfa 编写于 作者: haimianjie2012's avatar haimianjie2012

second commit

上级 c624e559
# CPU中断的工作原理
@[TOC](目录)
## 前言
使用线程切换及状态管理、异常处理、硬件与处理器的交互、I/O操作等指令时,都会使用中断服务。
处理器基于硬件封装对外的指令集==》底层语言封装指令集提供简单的抽象===》高级语言基于底层语言赋予程序更明确的语义。在这条关系链条上,下层变动会影响到上层;上层想要提高效率,改变机制必须得到下层的支持。
## 什么是中断
中断是为了顺应人们对实时性交互的需求而产生的技术。中断之所以有用,是因为它会立刻停下当前的程序去做另一件事情。
> ###### 什么是实时性交互?
> 点击鼠标或键盘时,计算机立即反馈处理结果给我们,计算机与我们的交互就是实时性交互。
1956年, IBM 7049机器上首先使用了中断技术,并开始使用“中断”这一术语。
为了了解中断的运作机制,需要理解下面这些概念:
### 时钟周期
数字电路系统包括:时序电路和组合电路
时序电路 = 逻辑门电路+反馈逻辑回路(输出到输入)或器件
时序电路有记忆功能,组合电路没有记忆功能。
> 时序电路的输出并不只依赖于输入,还依赖于上个周期的电路状态,因此往往包含大量的存储单元
除此之外,经常要求时序电路在同一时刻同步动作。触发器和锁存器是响应时钟周期并协调整个电路动作一致性的关键。在每个存储单元电路上引入一个时钟脉冲(CLK)作为控制信号,只有但CLK到来的时候电路才被“触发”而动作,并根据输入信号改变输出状态。
时序电路需要依靠时钟信号来工作,时钟信号对时序电路来说就像人类的心跳,所有的动作都随心跳的节拍进行,心跳过快或过慢都会产生严重问题。
对于时序电路来说,一次心跳所花费时间叫做时钟周期。时钟周期就是从一次高电平到相邻最近一次高电平之间的间隔,它是时序电路最基本的时间单位。
<img src="file:///C:/Users/xrw020/Documents/%E6%97%B6%E5%BA%8F%E7%94%B5%E8%B7%AF%E5%88%86%E7%B1%BB.jpeg">
![时序电路分类](时序电路分类.jpeg)
```markdown
时序电路分类
动作特点
同步时序电路
存储电路内所有触发器的时钟输入都接于同一个时钟脉冲源
所有触发器的状态变化都与所加时钟脉冲信号同步
异步时序电路
没有统一的时钟脉冲
输出信号的特点
Mealy型
输出信号不仅取决于存储电路状态,还取决于输入变量
Moore型
输出信号只取决于存储电路状态
Moore型电路是Mealy型电路的一种特例
```
**时钟周期是由CPU时钟定义的定长时间间隔,是CPU工作的最小时间单位,也称接怕脉冲或T周期**
### 时序电路
> 为什么cpu要用时序电路,时序电路与普通逻辑电路有什么区别?
> 触发器、锁存器以及时钟脉冲对时序电路的作用是什么?它们是如何工作的?
想要回答这两个问题,就需要了解逻辑电路,了解逻辑电路首先应当了解逻辑电路的基本单位:逻辑门。
#### 逻辑门
逻辑门是数字电路组成的基本单元,输出是输入位置的布尔函数。最常用的逻辑门包括:与、或、非。
![逻辑门](逻辑门.PNG)
* 逻辑与门and,只有a、b同时输入1时,输出才为1
* 逻辑或门or,只要a、b有一个为1,输出便是1
* 逻辑非门not,若输入为1则输出为0,输入为0则输出为1
与、或、非是基本的逻辑门,可以通过它们的组合得到复杂的逻辑推演,如与或、异或等。
如果更复杂的逻辑,用最基本的逻辑特定组合来实现。
逻辑门总是活动的,一旦一个门的输入变化了,在很短的时间内,输出便会相应的变化。
使用很多的逻辑门构建成一张网,便得到了一个实现复杂逻辑的计算块,这个计算块称为组合电路。
组合电路的构成遵循以下三个原则:
* 每个逻辑门的输入必须连接了一个系统的输入、某个存储单元的输出或某个逻辑门的输出(三选一)
* 两个或多个逻辑门的输出不能连接在一起,否则会产生相互矛盾的信号,造成错误或电路故障
* 这个网必须是无环的,也就是说不能有回路,否则计算逻辑会有歧义
#### 控制信号
为了更好的了解控制信号是如何工作的,介绍一种非常有用的组合电路:位多路复用器
![](位多路复用器.PNG)
图:位多路复用器
* 其中s输入控制着两个与门,上面的与门逻辑是!s&&b,下面的与门逻辑是s&&b
* 当s输入1时,b输入无法达到或门,0&&b恒为零,整个电路的输出是a;反之,则输出b.
* s输入的电位高低决定着a,b哪个输入有效,这便是控制信号的一个典型例子。
> ##### 控制信号是如何工作的呢?
> 假想一下寄存器是如何依赖一个时钟控制信号工作的?
如下图所示,一个时钟周期的低电平变为高电平再由高电平变为低电平:
![](时钟控制信号.PNG)
图:时钟控制信号
以该信号作为寄存器的控制信号,寄存器每一位输入位都与该时钟控制信号逻辑与后进入寄存器。那么,在时钟周期内的低电平部分,任何信号无法写入寄存器,等到时钟控制信号变为高电平时寄存器才变为写入状态。这就是一个简单的触发器了,随着时钟信号周而复始的改变这自己的状态。
### 普通组合逻辑电路与时序电路的区别
#### 区别1:毛刺容忍
组合逻辑电路,只是简单的响应输入信号,产生符合输入的某个逻辑表达式结果的输出。
时序电路拥有自己的状态,时序电路某一个状态除了依赖当前的输入外,还依赖电路上的一个状态。
为了拥有自己的状态并给予这个状态进行计算,必须在组合逻辑电路中引入存储设备和控制存储设备周期性变化的时钟信号。
存储设备是存储电路状态信息的载体。
> 时钟周期有什么作用呢?
时钟信号的组合逻辑电路:
![](时钟信号的组合逻辑电路.PNG)
前面说过,逻辑门总是活动的,一旦一个逻辑门的输入改变,则输出会在很短的时间内发生改变。
  但是需要注意的是,这个“很短时间内”的描述。由于元器件的质量/种类不同、路线的长度不同等物理因素的限制,不同的输入到达输出的时间是不同的。
比如图中,c输入到达下方的与门与到达上方的与门的两条路线中,到达下方与门的路线多出了一个非门。那么 c 信号到达上方的与门自然要比到达下方的与门的速度快。
所以当 c 信号发生改变时,有一段时间内,F 端的输出是错误的,因为 A&&C 已经到达 F 端但 B&&!C 还没有到达,也就是说 F1 是比 F0到达的慢的,存在延迟,如下图所示:
![](毛刺.PNG)
这种情况叫做“毛刺”。
虽然毛刺出现的时间是很短暂的,但是对于一个电路系统的输出来说却是致命的。如果在发生毛刺的时间内将错误的输出写入存储器,接下来的逻辑会一错再错并让人摸不到头脑。
而时序电路则不会出现上述问题,将A/B/C的输入到F的输出看作一个完整的动作,在一个时钟周期内完成。那么,A/B/C的输入将在时钟沿触发,F也将在时钟沿采集结果。而在采集结果时,F的输出已经跨越了毛刺处于稳定状态。当然,一个钟周期内高电平持续的时间必须足够使 F 输出达到稳定状态。
![时序电路无毛刺](时序电路无毛刺.PNG)
这样,下一个动作(发生在下一个时钟周期)如果基于 F 输出,将得到正确的结果。这是时序电路与普通逻辑电路的区别之一:对毛刺的容忍。
通过时钟周期,组合逻辑电路中输入的变化可以看作一个一个的动作。而在一个时钟周期内,电路完成一个最基本的动作,保证下个时钟周期的动作可以获取正确的电路状态。
 如果无法理解电路按动作的意义,看一个非常简单的例子:
```C++
int a=0;
int b=a;
```
需要将 a=0 执行完后,执行 b=a 才有意义。a=0没有执行完成或未执行时,b=a 的执行完全没有意义。这就是程序按指令运转的重要性,正如电路按动作运转的重要性。
时钟周期将一个一个的动作隔离开来,确保每个动作在执行时,上一个动作已经完全执行完成了。而存储器则记录电路的状态,每个动作的执行结果放在存储器中供下个动作使用。
这正是CPU所需要的,CPU执行一条一条的指令正可以看作一个一个的动作(当然这里并不是指的一条指令,CPU的基本动作是比指令更加细化的单位,尤其是在流水线的引入之后。指令正是由一个个基本的动作构成的,这些基本动作指的是取指令/指令译码/指令执行/访存/写回/PC增加等等)。
时钟周期像人类的心跳,CPU随着时钟节拍快速又有条不紊的运行。正如前面所说,一个时钟周期必须足够CPU完全完成耗时最长的基本动作,时钟周期对于不同的CPU来说并不是固定的,确定一个CPU的时钟周期也是一个非常复杂的任务。
#### 区别2:支持反馈逻辑
如果要实现一个计数器,如果用非时序电路实现是这样的:
![逻辑电路版的计数器](逻辑电路版计数器.PNG)
上述电路是完全无法使用的,电路的下一个输出依赖电路现在时刻的状态,除了上一节所述的毛刺现象会造成结果的不可预计外,电路本身的逻辑存在死循环。
要支持反馈逻辑,必须使用寄存器将结果暂存起来,由时钟沿控制数据的反馈更新。
![时序电路版的计数器](时序电路版的计数器.PNG)
### 时序电路构成处理器
一个最基本的处理器:
* 可以完成逻辑的运算
* 电路需要有自己的状态
* 每一个输出除了基于输入和处理逻辑外,还需要基于当前电路的状态。
时序电路可以很好的满足上述特性。对于时序电路来说,时钟脉冲便是电路的心跳,而寄存器是协同整个电路按心跳节拍运转的动脉瓣。
### 机器周期
在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,**取指令、存储器读、存储器写**等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为**机器周期**
机器周期是CPU执行一个基本动作所需要的最小时间。 机器周期又叫CPU周期:CPU访问一次内存所花的时间较长,因此用从内存读取一条指令字的最短时间来定义。
### 指令周期
指令周期是取出一条指令并执行这条指令的时间。
一般一条完整的指令包括:取指周期、间址周期、执行周期、中断周期。
MP X:该指令的指令周期只有取指周期。
ADD X:该指令只有取指周期、执行周期。
一个指令周期包含的机器周期个数亦与指令所要求的动作有关,如单操作数指令,只需要一个取操作数周期,而双操作数指令需要两个取操作数周期。实际上,不同的指令可以有不同的机器周期个数,而每个机器周期又可包含不同的时钟脉冲个数。
取指周期:在取指周期中CPU主要完成两个操作:(1)按程序计数器PC的内容取指令(2)形成后继指令的地址;
间址周期:当遇到间接寻址的指令时,由于指令字中只给出操作数有效地址的地址,因此,为了取出操作数,需先访问一次存储器,取出有效地址,然后再访问存储器,取出操作数。
执行周期:间址周期是取出操作数的有效地址。执行周期是取出操作数,并执行。
机器周期(CPU周期):CPU访问一次内存所花的时间较长,因此用从内存读取一条指令字的最短时间来定义。
指令周期的每个阶段都是一个机器周期。指令周期中所包含的CPU周期的长度并不是相同的,因此指令周期又有定长CPU周期组成的指令周期,不定长CPU周期组成的指令周期。
时钟周期:通常称为节拍脉冲或T周期。一个CPU周期包含若干个时钟周期。
![指令周期](指令周期.PNG)
每条指令的CPU周期数不同,每个CPU周期的长度也不一定相同。
---
中断周期:当CPU采用中断方式实现主机与I/O交换信息时,CPU在每条指令执行阶段结束前, 都要发中断查询信号,以检测是否有某个I/O提出中断请求。如果有请求,CPU则要进入中断响应阶段,又称中断周期。在这阶段,CPU必须将程序断点保存到存储器中。
---
> cpu是如何响应外部中断的?
---
对于外部中断,CPU在执行当前指令的最后一个时钟周期都会发送中断查询信号,查询中断应交INTR引脚。
如果查询中断请求信号有效,而且系统开中断(即IF=1)的情况下,CPU向发送中断请求的外部设备回送一个低电平有效的中断应答信号,作为中断INTR的应答,系统自动进入中断效应周期。
---
### 中断隐指令
中断隐指令是CPU在响应中断信号时随机做出的一系列动作,主要包括:识别中断源、找到中断程序、保存当前任务的各个寄存器状态、进入中断处理程序后的返回。
这些动作是在检测到中断信号后便随即发生的,因而不能由软件来完成,而是由硬件来处理。**中断隐指令并不是指令系统中的一条真正的指令,它没有操作码**,所以中断隐指令是一种不允许、也不可能为用户使用的特殊指令。
下面分阶段详细介绍中断隐指令的具体工作内容:
#### 保存现场
目的:保证中断处理程序完毕后能够返回原来的程序。
将原来程序的断点保存起来,断点就是程序计数器PC的内容。
断点可以压入堆栈,也可以存入主存的特定单元。
#### 暂不允许中断
暂不允许中断就是关中断。
目的:中断服务程序执行时,保护中断现场不被新的中断打断,必须关中断。
这样才能保证:被中断的程序,在中断服务程序执行完毕后能够正确的执行下去。
关中断方式:硬件自动关闭,软件(中断服务程序)关闭,但硬件自动关闭有更好的可靠性和实时性。
#### 引出中断服务程序
引出中断服务程序就是取出中断服务程序的入口地址送程序计数器(PC)。
对于向量中断和非向量中断,引出中断服务程序的方法是不相同的。
#### 中断分发
硬件中断处理
在windows所支持的硬件平台上,外部I/O中断进入到中断控制器的一根线上。
该控制器接着在某一根线上中断处理器。处理器一旦被中断,就会询问控制器以获得中断请求(IRQ)。
中断控制器将该IRQ转译成一个中断号,利用该编号作为索引,在一个成为中断分发表(IDT)的结构中找到一个IDT项,并且将控制权传递给恰当的中断分发例程。
每个处理器都有单独的IDT,如果合适,不同处理器可以运行不同的ISR.
> **note:**
> 不能用软件去保护断点,因为中断以后,CPU的PC值改变了,软件访问不到原来的PC值; 软件可以保护现场;恢复断点是软件来做的,硬件不知道中断处理程序什么时候返回。
> 软件是顺序执行的,至少是有规律的;但是中断是无法预料的事情,程序无法预料何时发生中断,何时执行中断处理函数。所以,只能在某个地址写上一段中断处理代码,等中断到来时由硬件将程序强行跳转到你的中断处理程序中。
## 参考文献
[markdown自动生成目录](https://www.cnblogs.com/Higurashi-kagome/p/12724993.html) 不能链接
[实用帖 | 如何为 Markdown 文件自动生成目录](https://www.jianshu.com/p/4721ddd27027) 待验证
[cpu中断的工作原理](https://www.cnblogs.com/niuyourou/p/11907858.html)
[markdown图片标签转换器|解决CSDN无法导入图片问题](https://github.com/jermyhunter/image-tag-transformer)
[解决CSDN博客“外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传”的问题](https://blog.csdn.net/Grantr/article/details/113748526)待验证
[这可能是用 Markdown写微信公众号的终极解决方案](https://blog.csdn.net/wirelessqa/article/details/105876032)
[计算机组成原理]
[Markdown格式转换为富文本格式(支持微信公众号)只需两步](https://blog.csdn.net/qq_44130638/article/details/105307751)
\ No newline at end of file
img @ c624e559
Subproject commit c624e5592d4fe0567e132ef9af8867af651e1209
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册