找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4404|回复: 0

计算机中断处理架构

[复制链接]

238

主题

329

帖子

2119

积分

超级版主

Rank: 8Rank: 8

积分
2119
QQ
发表于 2016-3-3 13:27:42 | 显示全部楼层 |阅读模式
本帖最后由 xiaoyu 于 2016-3-3 13:31 编辑

1601.JPG
1.关于中断

在前面的文章中我们提出了硬件要和CPU打交道,就必须使用中断机制。从某种意义上来说,现代计算机架构是由大量的中断事件驱动的,中断提供给外部硬件设备一种 “ 打断 CPU 当前执行任务,并响应自身服务” 的手段。
中断可以分为外部中断、可屏蔽中断和软件产生的中断:外部中断一般是指由计算机外设发出的中断;可屏蔽中断是指通过某种方式(例如CLI指令〉进行屏蔽的中断,与之对应的是不可屏蔽中断;软件产生的中断是指通过INTn指令产生的中断。
中断从设备到CPU需要经过中断控制器的转发,计算机发展至今,中断控制器经历了可编程中断控制器(Programmable Interrupt Controller, PIC)和高级可编程中断控制器(Advanced Prograrmiable Interrupt Controller, APIC)两个阶段。

2.PIC

在讲解中断细节之前,我们得给大家介绍PIC和APIC这两个专业术语。
PIC又叫做8259A,一个PIC包含了7个管脚,分别是IR0-IR7 (Interrupt Request0-7,用于连接设备 ,其中IR0优先级最高,IR7最低〉、INT(连接CPU,用于通知 CPU 中断的到来)、INTA(连接CPU,用于CPU应答中断请求,并通知PIC提交中断的vector 到数据线)。
在现在的计算机架构中,通常将两个或着多个PIC连在一起构成可连接很多个设备的PIC。这样我们的CPU就有很多的管脚来处理我们的外部硬件设备。PIC有如下三个重要的寄存器:
  • IRR <Interrupt Request Register,中断请求寄存器),共8位,对应IR0-IR7八个中断管脚。
  • ISR(In Service Register,服务中寄存器),共8位,对应 IR0-IR7八个中断管脚。
  • lMR (Interrupt Mask Regi ster,中断屏蔽寄存器),共8位,对应IR0-IR7八个中断管脚。

PIC向CPU递交中断的处理流程如下:
  • 首先IRR(中断请求寄存器)的管脚上会收对应的IR连接的设备的信号,然后将其进行缓存,同时向lMR (中断屏蔽寄存器)查询该中断是否被屏蔽。
  • 如果该中断被屏蔽,那么IRR(中断请求寄存器)就丢弃该中断;如果该中断没有被屏蔽,就将该管脚的电平信信号置为1。
  • 这个时候,INT的这个连接CPU的管脚就会有电流产生,CPU就感知到了有中断事件产生。
  • 就像TCP 三次握手一样,CPU也会回复一个信息给PIC,上面我们说了,通过INTA管脚进行回复。
  • PIC收到CPU的应答,就会将IRR中的缓存中断信号置0,并在ISR中对相应的管脚置1。表示该中断已经由CPU在处理了。

PIC在单处理器平台上发挥过巨大的作用,但它的管脚较少,导致能连接的设备不足,无法满足现代计算机拥有较多设备的需求,并且它最大的缺点在于无法适用于多处理器平台,因此随着SMP系统的快速普及,PIC己渐渐退出历史舞台,并最终被APIC所取代。

3.APIC

APIC相较于PIC来说,最大的优点是能适用于多处理器平台。另一个优点是它的管脚较多。 APIC由两部分组成。一部分称为LAPIC(LocalAPIC,本地高级可编程中断控制器),另一部分称为IOAPIC(1/0 APCI, 1/0高级可编程中断控制器)。前者位于CPU 中,每个CPU都有一个自己的LAPIC,后者通常位于南桥或着北桥上(注意,这里之所以说北桥,是因为现在的计算机体系架构中,其实南桥的功能以及有大部分的移植到了北桥上面,南桥只用于来连接一些低速的设备,比如打印机什么的。甚至最新的计算机架构中,南桥直接就被摒弃掉了),像PIC一样,连接各个产生中断的设。在一个典型的具有多个处理器的计算机中,通常有一 个IOAPIC和多个LAPIC,它们相互配合,形成一 个中断的分发网络。
APIC向CPU递交中断的处理流程如下:
  • IOAPIC具有24个中断管脚,每个管脚对于一个硬件设备。APIC的管脚是没有优先级的,和PIC是不同的。它对管脚的优先级由在CPU中的来LAPIC决定。IOAPIC在收到中断信号后,会将该消息以轮训的方式(这其中有很多的算法,针对多核处理器的环境下使用什么算法来进行),选择发送到某个CPU的LAPIC。
  • LAPIC 收到来自IOAPIC的中断消息后,会将该中断消息交由CPU处理。LAPIC 具有更多的寄存器以及更复杂的机制。对于处理来自 IOAPIC的中断消息,最重要的寄存器还是IRR、ISR以及EOI。与PIC中的IRR、 ISR不同的是,LAPIC的ISR、IRR均为 256 位寄存器,对应 x86 平台上的 256 个中断vector,其中0-15为架构预留。
  • 由于LAPIC位于CPU上,所以其处理机制和PIC类似。IOAPIC最大的作用就在于在多核处理器的情况下对于中断的分发。

4、Linux处理中断的流程
虽然各个操作系统对中断处理的实现过程不尽相同,但基本流程都遵循的一定的顺序。下面以Linux 操作系统为例说明中断的处理流程:
  • 设备产生的中断首先发送到IOAPIC,当IOAPIC接收到设备中断后,计算中断向量, 根据算法发送给某个CPU的 LAPIC 。
  • LAPIC判断自己是否接受中断,如果接受则通知CPU处理。
  • CPU挂起正在进行的任务,处理该中断。
  • 将该中断处理完成后,通知EOI寄存器 通知处理完成。
  • 恢复被打断任务的上下文,返回继续进行任务。

5.总结
在本文档中我们介绍了计算机中断的基本组成和处理流程架构,使大家明白计算机到底是如何和硬件进行交互的。当我们插入一个u盘,我们的计算机是如何识别的?当我们在电脑前面点击鼠标的时候,计算机里面发生了什么?你要知道,你对鼠标的每一次点击,在计算机内部,都会产生一次中断给处理器进行处理。所以我们的计算机运行就是由大量的中断事件驱动的。





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表