精华内容
下载资源
问答
  • “ 中断系统是现代PC的基础架构之一,我们常常能听到很多相关概念:IRQ,PIRQ,PCI Interrupt PIN,MSI,GSI,Vector(中断向量)。这些术语有些是硬件概念,有些是软件概念,他们时常混在一起,让人十分迷惑。本系列...
    235a59d624fe90aec026bc690b2f25e0.png点击上方“公众号” 可以订阅哦!

    中断系统是现代PC的基础架构之一,我们常常能听到很多相关概念:IRQ,PIRQ,PCI Interrupt PIN,MSI,GSI,Vector(中断向量)。这些术语有些是硬件概念,有些是软件概念,他们时常混在一起,让人十分迷惑。本系列希望能通过三篇文章来帮助大家厘清其中的关联和区别,它们分别是历史和原理篇(偏硬件)、软件篇(关于OS和BIOS如何设置和使用中断)和固件篇(BIOS如何根据硬件配置中断和向OS报告中断表)。

    历史

    49235b721bf224e1b8223b63142084c9.png

    当我们在操作电脑时,很多事情在同时发生,磁盘在飞速读写,网络在收发消息,而你也往往开了不少个任务在同时运行。这些能够发生,中断系统扮演了关键角色。在中断系统出现之前,人们(那时都是计算机专家)往往要等上一个任务结束才能进行下一个任务,这在今天是不能想象的。事实上中断系统出现的很早,Intel的传奇中断控制芯片8259在1976年就被用在8085系列产品中。PC在1981年出生时借鉴了这种思想,8259的升级版8259A被用于中断控制,而其统治PC长达近10年,直到486电脑的诞生!

    1

    PIC时代

    PIC(Programmable Interrupt Controller)就是我们的8259A,让我们来瞻仰一下它的样子:

    53f59a5fd11d1b32116225c032ea5f28.png

    其中最重要的管脚是IR0~IR7,也就是能相应8个中断。后期由于中断不足,被扩展为级联的形式,如图:

    cb2da332ed5bed4b793b372958636e0d.png

    分为主和从两块8259,这样我们就有了16 -1 = 15个中断源。8259一直工作的很好,中断如果还不够我们还可以通过中断共享或者再多级联几个8259,就可解决问题,直到多CPU的出现。这时候问题出现了,我们的主8259到底连接哪个CPU好呢?这是个大问题。

    2

    APIC来了

    80486DX在1990年上市,其引入了SMP的概念,即多CPU(注意不是多核)。Intel为了适应SMP提出APIC(Advanced Programmable Interrupt Controller,高级中断控制器)的新技术。APIC 由两部分组成,一个称为LAPIC(Local APIC,本地高级中断控制器),一个称为IOAPIC(I/O APCI,I/O 高级中断控制器)。前者位于CPU中,在SMP 平台,每个CPU 都有一个自己的LAPIC(后期多核后,每个逻辑核都有个LAPIC)。后者通常位于外部设备芯片上,例如南桥上。像PIC 一样,连接各个产生中断的设备。而IOAPIC和LAPIC通过APIC Bus连接在一起。如图:

    dd4386a3e480e6c9305c10728c7a5f6a.png

    3

    XAPIC,小小的改进

    单独的3根线的APIC bus给系统设计带来了不少困扰,在奔腾4上其被取消而由系统总线代替,其他则区别不大,新的示意图如下:

    688295b018287a867de66fbd63722343.png

    系统中的IOAPIC可以有很多,在北桥被并入CPU中后,甚至CPU中也有IOAPIC(同时有LAPIC,感觉好方便)。这种架构极具伸缩性,被使用了很多年,直到核战争的爆发。

    3

    X2APIC

    核战争,什么鬼?!其实是内核数目的战争。Intel和AMD不断的增加内核的数目,加上SMT(HT)技术,内核数目不断上升。在服务器上,至强CPU往往提供高达40到60个内核,如果是8路服务器,内核总数目可以高达60 × 8 = 480个!即使实际没有这么多内核,虚拟机技术的出现也往往成倍的需要虚拟内核。而唯一标识CPU内核身份的APIC ID在APIC寄存器中却只有8位(其细分为多个域,这里略过),也就是最多可以有255个内核(1个保留做广播用)。APIC不够用了!Intel大手一挥,推出了X2APIC,把APIC ID从8位扩展为32个bit,这下可以支持4G -1 (1个保留做广播用)个逻辑核,你们该满足了吧!顺便将原来略显怪异的MMIO访问方式变成MSR方式(后文详细介绍)。

    我们现在的计算机几乎都是用APIC方式处理中断的,我们接下来看看他们是怎么工作的。

    原理

    49235b721bf224e1b8223b63142084c9.png

    CPU在运行目前任务时,当有特别事件发生时,CPU应当暂停正在执行的程序,转向执行处理该事件的子程序;事件处理完毕后,恢复原来的状态,再继续执行原来的程序。这种对这些事件的处理模式,称为程序中断(Interrupt)控制模式,简称中断控制或中断。这种处理紧急事件的服务子程序称为中断子程序。这种引起中断的事件称为中断源。这些事件包括磁盘、键盘等等输入输出设备,异常错误的发生甚至另一个CPU的调用。

    1

    PIC模式

    在PIC时代,外部中断源都要连接到8259的IRQ引脚上,8259会通过INTR告诉CPU发生了中断。这时OS或者BIOS的中断控制程序会检查谁发生了中断,从而调用相应的中断相应历程。 其中的细节我们这里就不细述了,其过程大概分为以下几步:

    1、一个或多个IR 引脚被触发中断(脉冲或者边缘),若对应的中断没有被屏蔽,8259 拉高INTR 管脚通知CPU 或上一级8259中断发生。

    2、CPU 通过INTA 引脚响应8259,表示中断请求收到。8259则将IRR 中具有最高优先级位 清零,并设置ISR 中对应的位。在CPU发出中断查询脉冲后,8259将中断号提交到数据线上。

    3、中断号对应的中断向量处理程序被调用,OS或者BIOS中断处理程序开始处理中断,完毕后写EOI并扫尾。

    在这样一个周期完毕后,CPU继续处理之前的任务,像什么事也没有发生一样,一般用户甚至感受不到(实际上OS的中断处理例程有严格的时间要求,处理过长会触发watch dog 导致蓝屏)。

    古老的PC留下了很多兼容性的问题,很多古老的设备占据了大量中断源,如图:

    e1bfdf24cec85de50d842dec3c575bcd.png

    现在谁还有这么多串口并口呢,还有键盘和FDD?可是为了向前兼容,这些IRQ都被保留而不能做它用,甚至在APIC模式也是这样。向前兼容真是个沉重的包袱!

    注意这里中断是有优先级的,IRQ数字越小优先级就越高。

    2

    APIC模式

    如前所述,APIC 由两部分组成,一个称为LAPIC(Local APIC,本地高级中断控制器),一个称为IOAPIC(I/O APCI,I/O 高级中断控制器)。前者位于CPU中,在SMP 平台,每个内核都有一个自己的LAPIC。后者通常位于外部设备芯片上,例如南桥上。典型的连接关系如下图:

    688295b018287a867de66fbd63722343.png

    每个LAPIC都有自己唯一的APIC ID,每个IOAPIC也有自己唯一的ID。和PIC模式显著的区别是连接关系不再是硬件连线而是通过message。IOAPIC内部有个PRT(Programmable Redirection Table)表,里面的Destination Field标识了中断的目的地。在Physical模式下,含有目标APIC ID(Logical模式略)。在中断发生时,IOAPIC收到中断,会将中断转化为message放入系统总线,而CPU中只有APIC ID和Destination Field域中一致的LAPIC才会处理这条中断。用于处理来自IOAPIC 的中断消息的LAPIC内容就更多了,但最重要的寄存器还是IRR、ISR 以及EOI。其流程和PIC类似,这里就不在详述了。OS如何处理我们会在下一篇中介绍。

    值得一提的是,为了保证向前兼容性,Intel在1997年发布的MultiProcessor Specification(MP spec)中要求APIC提供PIC兼容模式或Virtual Wire Mode(虚拟连线模式)。PIC模式如下图:

    2a63102c6f7ccc6cf53c06e2a260733b.png

    虚线代表了中断传递的过程,注意其中的IOAPIC被旁路了,而一个8259A的模拟硬件(通常是南桥芯片内置)则起到作用,它连接了CPU的INTR引脚。这样会对主板电路设计造成很多麻烦,而虚拟连线模式则更加常见,其如下图:

    54e5f309156b3b43f64b505649ce0fd3.png

    IOAPIC会将8259A模拟硬件的信号放入ICC Bus(后是系统总线),由LAPIC处理交给BSP,处理效果和原来一样而不要增加连线。

    3

    MSI

    普通的PCI设备支持四个INTx,MSI(Message Signaled Interrupts)在1999年随着PCI 2.2规范被引入,在PCI 3.0中提出了MSI-X。MSI支持32个中断,而MSI-X将其扩展到了2048个。当一个PCI设备想发送中断时,它会向其PCI配置空间Capability结构中的Message Address的地址(通常是0xFEExxxxx)写Message Data数据,消息会被该设备连接的root complex转给LAPIC(多CPU时,有可能要通过QPI),而不需要通过IOAPIC中转。Message Address中和IOAPIC类似,也有目标APIC ID,而message Data中同样有Vector的数目。这样从电气机械的角度,MSI减少了对interrupt pin个数的需求。从而使得连接变得更简单,而且据研究,其相比INTx,有时能提高1/3的效能。

    微软在Vista后全面支持MSI和MSI-x,而Linux也早已经支持MSI。

    其他

    49235b721bf224e1b8223b63142084c9.png

    还有些杂项这里要特别说明一下

    1

    APIC ID

    APIC ID并一定从0开始,数字也不一定连续,在任何地方的代码里都不能有这种假设。APIC ID可以被BIOS重置,但几乎没有BIOS这样做。

    2

    IOAPIC ID

    随着北桥被移入了CPU ,一些北桥的除了内存控制器外其他的功能也被引入CPU。其中最重要的是PCIe的root complex和一个至少x16的root port用于连接显卡。如果CPU内置的显卡,也会连接到这个root port上,所以Intel平台除了在南桥外,在CPU内也有IOAPIC。在一个4路的志强服务器中就会有4 + 1 = 5个IOAPIC, 每个IOAPIC有24个入口,就可以支持24 * 5 = 120个中断入口。

    3

    LAPIC

    除了IOAPIC能发送中断消息外,内核的LAPIC也可以通过发送IPI(Inter-Processor Interrupts)的方式发送中断给其他的内核。这种方式是OS和BIOS调度CPU内核的基本方式。

    尾声

    49235b721bf224e1b8223b63142084c9.png

    在下一篇中将介绍IRQ,PIRQ,PCI Interrupt PIN,MSI,GSI,Vector(中断向量)的关系和谁负责设置它们,敬请期待。这里有几个思考问题,大家可以查查资料:

    1.      那么对于多CPU的情况下,初始的APIC ID是谁来决定的呢?注意CPU可以互换。

    2.      IOAPIC都要有不同的ID,这些ID是谁给设置上去的呢?

    ee03084d46e00d3e5c8b9a0462e00792.pngb5a53b494cba13740b1282b322551b6a.gif
    展开全文
  • 2019年计算机体系结构

    2019-06-22 17:31:20
    概念题 描述计算机系统层次结构 空间局部性与时间局部性 什么是流水线瓶颈和如何克服流水线瓶颈 通道处理机的工作流程 计算题 Adamhl定律的题目 ...计算使用向量链接和不使用向量链接时的向量处理机时间 ...

    概念题

    • 描述计算机系统层次结构
    • 空间局部性与时间局部性
    • 什么是流水线瓶颈和如何克服流水线瓶颈
    • 通道处理机的工作流程

    计算题

    • Adamhl定律的题目
    • 设计中断屏蔽码、基于中断屏蔽码和优先级画图的题目
    • 非线性流水线调度
    • 计算使用向量链接和不使用向量链接时的向量处理机时间
    展开全文
  • 1.运算器采用单组内总线、分立寄存器结构和单组内总线、集成寄存器结构时,其...18.什么是中断向量?中断向量表?向量地址?向量中断? 19.简述中断响应过程。 20.简述中断处理过程。 21.某主机连接两个输入设备,两
  • 8.中断处理需要有中断A.___优先级仲裁___,中断B.___向量___产生,中断C.___控制逻辑___等硬件支持。 三.应用题 1. (11分)设有两个浮点数 N1 = 2j1 × S1 , N2 = 2j2 × S2 ,其中阶码2位,阶符1位,尾数四位,数...
  • 80386在保护方式下要通过中断描述符表中的描述符访问虚拟空间的中断向量,中断描述符表的位置不是固定的,要由IDTR寄存器实现在虚拟空间的定位。 33.简述80386在保护方式下的中断处理过程。 答:80386响应中断后,...
  • 微型计算机原理及应用基本学习要求 注:以下基本要求按内容排列,而不是按章节排列 一、 微型计算机基础与概念 1、计算机中信息的表示方式?...7、8086的中断系统,向量中断的概念,中断向量表和结构,中断向量表和中断
  • 5.19 如何访问位于机器地址0处的中断向量?如果我将指针值设为0,编译器可能会自动将它转换为非零的空指针内部表示。 5.20运行时的“nullpointerassignment”错误是什么意思?应该怎样捕捉它? 第6章 数组和指针 ...
  • 5.19 如何访问位于机器地址0处的中断向量?如果我将指针值设为0,编译器可能会自动将它转换为非零的空指针内部表示。 62  5.20 运行时的“null pointer assignment”错误是什么意思?应该怎样捕捉它? 62 第6章...
  • STM32F10xxx参考手册

    2012-10-17 11:38:40
    9.1 嵌套向量中断控制器 130 9.1.1 系统嘀嗒(SysTick)校准值寄存器 130 9.1.2 中断和异常向量 130 9.2 外部中断/事件控制器(EXTI) 134 9.2.1 主要特性 134 9.2.2 框图 135 9.2.3 唤醒事件管理 135 9.2.4 功能...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 6 1.11 extern在函数声明中是什么...
  • 中文名: 你必须知道的495个C语言问题 高清PDF中文版 原名: C Programming FAQs 作者: (美)萨米特译者: 孙云 ...5.19 如何访问位于机器地址0处的中断向量?如果我将指针值设为0,编译器可能会自动将...
  • 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 存储类型 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 1.11 extern在函数声明中是什么意思? 1.12 ...
  • 1.1 我该如何决定使用哪种整数类型? 30 1.2 为什么不精确定义标准类型的大小? 31 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、...
  • 5.19 如何访问位于机器地址0处的中断向量?如果我将指针值设为0,编译器可能会自动将它转换为非零的空指针内部表示。  5.20运行时的“nullpointerassignment”错误是什么意思?应该怎样捕捉它?  第6章 数组和...
  • 5.19 如何访问位于机器地址0处的中断向量?如果我将指针值设为0,编译器可能会自动将它转换为非零的空指针内部表示。 5.20运行时的“nullpointerassignment”错误是什么意思?应该怎样捕捉它? 第6章 数组和...
  • (1)修改中断禁止部分 # if defined(CONFIG_S3C2410) ldr r1, =0x7ff /*根据 2410 芯片手册,INTSUBMSK 有 11位可用 */ ldr r0, =INTSUBMSK Create PDF files without this message by purchasing novaPDF ...
  • 复旦nois教材01.rar

    2009-08-05 20:08:37
    1 第一章 绪论....................................................................................................................................1 1.1 概述................................................
  • Java代码实例

    2016-06-21 22:44:51
    4.6 break中断语句 56 4.7 continue继续语句 57 4.8 小结 58 第5章 数组——以不变应万变的哲学 59 5.1 数组的声明及创建 59 5.1.1 声明数组引用 59 5.1.2 创建数组对象 60 5.2 Java中数组的实现...
  • LINGO软件的学习

    2009-08-08 22:36:50
    例1.2 使用LINGO软件计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。 单 位 销地 运 价 产地 B1 B2 B3 B4 B5 B6 B7 B8 产量 A1 6 2 6 7 4 2 5 9 60 A2 4 9 5 3 8 5 8 2 55 A3 5 2 1 9 7 4 3 3 51 A4 7...
  • Java SE 6.0编程指南 源码

    热门讨论 2012-05-18 13:40:45
    4.6 break中断语句 56 4.7 continue继续语句 57 4.8 小结 58 第5章 数组——以不变应万变的哲学 59 5.1 数组的声明及创建 59 5.1.1 声明数组引用 59 5.1.2 创建数组对象 60 5.2 Java中数组的实现...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

中断向量如何计算