首页 > temp > python入门教程 >
-
CPU中断的硬件实现原理
内容整理自较早前的微机原理学习笔记,重点梳理了实现硬件中断机制所依赖几个数据结构和硬件原件。
为什么需要中断?
中断机制的出现是为了协调处理器与外部设备速度不一致的问题,以提高处理器的利用率。
试想我们打开了编辑器处理器就不干活了,等着键盘输入,这会浪费多少处理器计算资源?
另一种方式是处理器忙自己的,等有输入时再通知一下处理器。这种异步通知处理器就是利用的中断机制。
从工作流程上看有点类似Java语言通过try-catch捕获InterruptedException,主流程收到其他线程的打断通知后转向处理异常情况。
(键盘向中断控制器发送电信号的示例图)
处理器如何发现中断信号?
通常有两种模式感知外部事件的发生。一种是主动的检测,每隔一段去询问一次,也叫轮询,另一种是被动的,当事件发生时由对方通知自己。处理器接受中断信号采用的轮询方式。
处理器的控制单元是一个时序逻辑电路,同时也是一个有限状态机(FSM) [1],基础的FSM有三个状态FETCH、DECODE、EXECUTE,它表示处理器执行一条指令的有序序列是:从内存读取指令 -> 解释指令 -> 执行指令。
后来在计算机设计上出现了中断机制,就在原来FSM的基础上增加了一个新状态——中断,
处理器执行一条指令的流水线就变成了从内存读取指令 -> 解释指令 -> 执行指令 -> 检测中断。
由此可见,检测中断事件发生在每一次CPU指令周期中
(一个有中断机制的CPU指令周期(instruction-cycle))
中断控制器
在物理实现中,CPU上有两个引脚NMI和INTR [2],专门用于接收外部设备的中断信号。不过由于CPU的引脚数量有限,给每个外设预留一个引脚是不现实的。
其实在外设和处理器中间还有一个叫做可编程中断控制器(Programmable Interrupt Controller,PIC)的硬件,外设通过电路向PIC发送一个中断信号,然后PIC再发送给处理器。
PIC是可编程的,意味着可以调整每个引脚对应的外部设备,以及当同时发生多个中断时,设置不同中断类型的优先级。
处理器如何处理中断?
中断只是一个电信号,不能传递更多的数据,那么处理器要如何知道具体怎么处理一个中断请求(interrupt request,IRQ)?
处理逻辑就在中断处理程序(interrupt service routine, ISR)中,该程序是硬件驱动的一部分。
就是说,我们在安装键盘驱动、鼠标驱动时也向操作系统注册了ISR。
虽然中断类型有很多,处理器倒也不用预先记录每个ISR在什么位置。操作系统在启动时会创建一个中断向量表(interrupt vector table,IVT),这个数据结构是中断ID到对应ISR的入口地址的映射,存放在一个操作系统和处理器都知道的内存位置。当中断发生时,处理器根据中断ID获取到ISR程序的入口地址,开始处理中断。
名词释义
[1]有限状态机(Finite State Machine,FSM):一种数学计算模型,该模型在任意时刻只有有限个状态,且往下一个状态的转移依赖上一个状态的输入。
[2]中断有两种,NMI不可屏蔽中断,INTR可屏蔽中断。处理器即便检测到中断请求,也不是每次都要处理。