码迷,mamicode.com
首页 > 其他好文 > 详细

【翻译】x86机器上的PCI中断

时间:2014-08-27 20:09:08      阅读:1315      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   os   使用   io   strong   ar   数据   

来源 http://people.freebsd.org/~jhb/papers/bsdcan/2007/article/article.html

摘要

   在拥有多个独立设备的计算机里一个重要的元素是一个设备通知cpu它需要通过中断引起注意的能力。操作系统可见的对于pci设备的中断技术是坟场复杂的,特别是在x86 pc系统上。这篇文章会涉及PCI INTx中断在x86上实现的多种方式以及系统BIOS与操作系统之间交流实现的方法。他同样会涉及较新的用来解决一些INTx中断的局限的Message Signaled Interrupts。最后,这篇文章会提供在x86平台上FreeBSD对INTx和MSI中断的实现的概述。

介绍

  中断是现代机器上的设备支持的一个重要部分。他允许系统采用事件驱动的算法来取代轮询算法。这继而允许了诸如cpu时间等系统资源的更搞笑的利用,特别是在同时拥有多个设备操作的系统上。

  操作系统在处理设备中断时的一个必须执行的任务是决定当一个中断触发后哪一个设备需要关注。这个映射可以通过多种方法完成。一些系统会将这个映射信息包含在一个被硬编码进操作系统或者固件的静态表中。其他系统可能会利用可编程硬件来完成动态映射,还有一些系统结合了这两种方法。

  PCI允许设备使用两种不同的方式确认中断。第一种方式包含了一个专有的边带信号,它被称为INTx中断。第二种方式包含了如同DMA操作一样通过数据总线发送的特殊的内存写操作,它被称为消息信号中断(MSI)。MSI中断只在较新的设备上有效,因为它是最近才进入到PCI标准中的。

  首先,先规定一个命名法。在PCI中,设备这个单词实际上指的是一个拥有一至八个功能的硬件的一部分。例如一个典型的x86芯片可能会包含多个USB控制器,而这些控制器是一个单独的PCI设备的多个功能。一个PCI扩张插槽是一个PCI设备,而且一个单独的扩张卡可能会包含多个功能。但是,从操作系统的视角来看,每个PCI设备的功能都是一个逻辑的操作系统设备。例如,在Darwin和FreeBSD,每个多功能PCI设备的功能都会收到它自己的设备对象并且能够被不同的驱动服务。为了避免混淆,文章的剩余部分将会使用“slot”来表示一个PCI设备,使用“设备”来表示一个逻辑操作系统设备。

旧的PCI INTx中断

  如同上面提到的,PCI INTx中断通过使用边带信号实现。每个PCI slot都有四个中断信号: INTA#, INTB#, INTC#, INTD#。每个PCI功能可能会使用其中的一个。功能通过标准的配置空间的一个寄存器指示它使用哪一个信号。

  PCI中断线是电平触发的并且在信号被拉低的时候被确认,这允许了多个中断信号共享同一个物理信号线。

x86 cpu上的中断

  异常,不可屏蔽中断(NMIs),处理器键中断,以及设备中断在x86 cpus上都是用相同的中断机制。操作系统向cpu提供中断描述符表。当一个中断被确认,cpu决定关联的IDT索引或者向量。它能够通过向外部的中断控制器查询来获得IDT向量。如果中断被一个消息触发,那么消息里就会包含IDT向量。异常和NMI被分配了静态的IDT向量。一旦cpu得到了IDT向量,它使用这个向量作为进入IDT的一个索引。然后它就会触发IDT slot里存放的处理器。因此,为了一个操作系统在x86 cpu上处理设备中断,它必须知道哪一个设备驱动处理句柄和给定的IDT 向量关联。

  因此,在一端我们有了一个PCI中断线会被需要关注的PCI功能发送信号。在另一端,我们有了一个CPU接收中断向量。在中间的就被总称为中断控制器。

中断控制器

在x86平台上的中断控制器负责接收设备发来的中断信号,将信号映射为一个IDT向量,然后用这个向量向系统中的一个或多个cpu发起中断。但是,在x86平台上有一些奇怪的事情。首先,由于在PC-AT上的原始的中断控制器和总线的限制,独立的可编程中断路由被加到平台中来适应PCI中断信号和PC-AT中断控制器。第二,随着x86平台不断发展,一组全新的中断控制器,被称作高级可编程中断控制器(APICs),被引入进来。为了保持后向兼容性,拥有APICs的系统仍然包含了PC-AT中断控制器并且任一系统都可以在现代系统中处理中断。甚至两者可以在同一时间被使用,尽管不鼓励这样的行为。

8259A 主从PICs(PC-AT)

原始的PC-AT包括两个8259A可编程中断控制键链接在一起。如同PC-AT上的其他部分,这样的设置称为了实际上的x86平台的标准。每个8259A有8个中断输入信号被分配给8个连续的IDT向量。两个PIC因此一共有16个中断输入。在PC-AT上这些信号被称为ISA IRQs 从0到15。但是,第二个8259A(称为从PIC)被连接到第一个8259A(称为主PIC)的第三个输入引脚。因此,ISA IRQ 2

实际上对设备中断是不可用的,实际上对于设备中断拉里说一共只有15个中断输入是可以使用的。

bubuko.com,布布扣

  原始的PC-AT会为它的设备使用一个ISA总线。ISA中断是边沿触发的,当设备将信号从低升到高时中断被确认。这限制了ISA中断被多个设备共享,所以每个ISA设备都要求在8259A上有一个专有的中断。所有的PC-AT兼容系统都包括一个使用了IRQ 0的ISA定时器,一个使用了IRQ1的键盘控制器,以及一个使用了IRQ8的实时时钟。如果存在一个可选的浮点协处理器,那么它会使用IRQ13。当PCI被引进进来的时候,大部分的PC-AT系统包括了两个使用IRQ3和IRQ4的串口,一个使用IRQ8的软盘控制器,一个使用IRQ7的打印机端口,一个使用IRQ12的PS/2鼠标,以及两个使用IRQ14和IRQ15的IDE控制器。这给PCI中断只留下了IRQ5,9,10,11可以使用。

  让事情变得更复杂的是,系统系统包含了另外的ISA设备比如额外的串口或者打印机端口或者声卡。每一个这样的额外ISA设备同样要求一个专有的IRQ。比如声卡一般会使用IRQ5,。因此,PCI中断可以使用的IRQ集合并不是固定的。实际上,添加或者移除一个ISA外部设备会在重启的时候改变这个集合。为了处理这个复杂性,可编程中断路由被加入进来。

可编程中断路由(PCI链接设备)

  一个可编程中断路由被用来路由PCI中断到另一个中断控制器的中断输入。一个路由包含了多个输入信号和输出信号。每一个输出信号被挂接到一个中断控制器的输入上。每一个输入信号可以被路由到其中的一个输出信号。多个输入信号可以被路由到同一个输出信号,多个PCI中断信号可以被路由到一个输入信号上。

  系统软件,比如BIOS或者操作系统,会负责编程中断路由。编程路由包括路由每一个在使用中的输入信号到一个输出信号。比如,一个PC-AT兼容系统可能会将可编程中断路由上的输出引脚路由到在8259A上的IRQ3,4,5,7,9,10,11。如果IRQs3,4,7正在被ISA设备使用,那么每一个中断路由上的输入引脚必须被路由到IRQs5,9,10,11中的一个。注意路由一个单独的输入引脚(也被称作一个PCI连接设备)到一个IRQ会路由连接到这个输入引脚的所有PCI中断到这个IRQ。也就是说, 你不能地任意地路由独立的PCI中断。相反地,你只能路由连接到一个输入引脚的PCI中断组。这个组是被硬件设定的并且不能被系统软件更改。而且,如果一个系统的输入引脚超过了可用的IRQ,那么至少有一些输入引脚会被路由到相同的IRQ,导致这些输入引脚上的PCI中断集合会共享同一个IRQ。

  在图1中有一个使用可编程中断路由和8259A连接的例子。在左边有6个PCI slot。每个slot的INTA#被连接到中断路由器的输入引脚。注意到一些PCI中断被连接到中断路由器上的同一个输入引脚。比如前两个中断都被连接到了LINKA输入引脚。中断路由器也有4个输出引脚被连接到对应于两个8259A控制器上的IRQ5,9,10,11的输入引脚。假设LNKA被路由到O0,LNKB被路由到O1,LNKC被路由到O2,LNKD被路由到O0。那么PCI slot0,1,5的中断会被路由到IRQ5,。PCI slot2 的中断会被路由到IRQ11,PCI slot3,4的中断会被路由到IRQ10。

I/O APICs

  bubuko.com,布布扣

  许多x86系统,包括最近的系统,包报了中断控制器的第二种集合,称为APIC。在这些系统中,每个CPU包括了一个本地APIC用来接受中断消息并且使用它们来向CPU确认中断。包含一个或多个I/O APIC的芯片负责将设备的中断信号转换为发送给一个或多个本地APIC的消息。

  8259A和I/O APIC之间的最大一个区别是I/O APIC上的所有引脚都是独立的。对8259A来说,8个输入引脚被映射到8个连续的IDT向量,并且所有的中断被发送给同一个CPU。I/O APIC,在另一方面,并没有控制器范围的设定。相反地,每个引脚被独立编程。每个引脚被操作系统分配自己的IDT向量并且能被映射到一个或者多个CPU。I/O APIC还可以包含可变数量的引脚。典型地,一个I/O APIC包含16,24,32个输入引脚。

  PCI中断信号有多种方式路由到I/O APIC中断引脚。最早的APIC系统包括了一个有16个输入引脚的单独的I/O APIC,它只是简单地重复了两个8259A的功能。在这些系统中,16个输入引脚被用作16个ISA IRQ,而PCI中断使用一个PIR路由到一个ISA IRQ。然而,大部分APIC系统对PCI中断信号采用专有的I/O APIC输入引脚。在这些系统中,第一个I/O APIC的前16个引脚留作16个ISA IRQ。PCI中断信号连接到第一个I/O APIC的其他引脚(如果它包含超过16个引脚)和其他额外I/O APIC(如果有的话)的输入引脚上。一些最新的系统开始利用PIR路由一些PCI中断到一个专门留给PCI中断的I/O APIC 输入引脚集合上。

  图2包含了一个PCI中断直接连接到有24个引脚的I/O APIC的例子。如同之前的图片,左边有6个PCI slot,并且每个slot的INTA#引脚被连接到I/O APIC的输入引脚上。如果多个中断线被连接到同一个I/O APIC输入引脚哈桑,系统在使用APIC的时候还可以共享PCI中断。

 

待续

【翻译】x86机器上的PCI中断

标签:style   blog   http   os   使用   io   strong   ar   数据   

原文地址:http://www.cnblogs.com/huchh/p/3939654.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!