PCI-Express总线的中断机制在PCI-X总线的基础上又进行了发展,PCI-X总线提出了传统PCI总线中断机制存在的低效问题,并且引入了MSI机制,通过“主动通知”的方法告诉处理器发生中断事件的中断向量号。PCI-Express是串行总线,该总线完全丢弃了传统PCI总线的INTA~INTD中断信号线,继承了PCI-X总线的MSI机制,并且兼容了传统设备的中断方法,提出了“虚拟中断线”的概念。因此,在以PCI-Express为核心的计算机体系结构中,传统的PCI设备还可以向处理器发送INTA的中断事件,但是这种中断事件会在PCI Bridge处被转换成“虚拟中断线”,即Bridge会向处理器发送一个中断消息。中断消息是一种TLP层的事务,这种中断消息(interrupt message)模拟了中断信号线的assert和deassert行为。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
MSI机制在前面的文章中有所阐述。MSI(Message Signal Interrupt)最早是在PCI-X中线中提出的,MSI机制的实现需要设备、桥以及PCI总线驱动的支持,在PCI设备中必须实现MSI的配置表单链,其本质是PCI配置空间的扩展,因为规范根本不知道一个设备可以支持多少中断,所以无法在配置空间中为其预留数据存储空间,因此采用了链表的数据存储方法。在配置空间中有MSI配置空间链表头,一个PCI设备需要申请多少中断向量,就需要在配置空间链表上挂接多少个MSI配置表单。简单示意图如下所示:
PCI配置扫描软件在获取设备配置空间信息之后会扫描得到MSI配置链表,并且为每个MSI配置分配中断向量号以及设备向处理器提交中断向量号的地址信息。MSI配置空间很简单,其关键信息只有两项:一项为提交中断向量号的地址,该地址信息会兼容32位和64位系统;另一项就是具体的中断向量号。有了这两项信息之后,当一个设备需要向处理器发送中断请求时,只需向MSI配置空间中指定的地址空间写入CPU分配的中断向量号,然后根复合体会触发处理器的PCI中断。处理器进入PCI中断上下文,从触发事件的地址空间中获取中断向量号,然后直接调用发起中断请求设备的中断服务程序,无需中断事件的I/O查询,节约了中断处理的时间。
从PCI-Express的事务层来看,MSI中断机制采用存储器写的方式提交中断请求,没有采用TLP的消息机制(虚拟中断线的方法采用了消息机制)。采用MSI中断机制需要注意PCI-Express的请求乱序执行的机制。PCI-X对PCI总线进行优化的过程中提出了请求乱序执行的方法,PCI-Express也继承了PCI-X的这一机制。交换节点在处理请求事务时会缓冲请求,并且引入QOS的机制,这样总线上的多个请求可能会被乱序执行。乱序执行会对MSI中断产生影响,因为MSI中断请求和普通的数据IO都可能是存储器写事务,如果MSI中断较引发中断的读写IO先抵达处理器,那么处理中断服务程序会处理老数据,因为新的数据可能还在总线上,这会导致错误的数据处理。这对该问题可以有两种解决方法,本质上都应用了TLP报文头中的TC标记。在PCI-Express规范中,交换节点对于具有相同TC标记的事务不会乱序处理,应用该特点可以解决上述问题。
在如今的PCI-Express体系结构中还存在很多非PCI-Express的设备,为了兼容该类设备,PCI-Express协议规范提出了“虚拟中断线”的机制。该机制与传统的PCI中断机制类似,只不过将物理的中断线通过TLP消息来模拟。例如一个传统的PCI设备触发INTA向处理器提交中断请求,那么INTA信号会在PCI-Bridge处被转换成一个含有assert INTA的消息,最后由根复合体触发处理器。中断清除时设备再向处理器发送一个含有deassert INTA的消息。这种机制从软件的层面上来看没有变化,从硬件层面上来看,原来通过物理信号传播的INTA转变成了一个事件报文。对于交换节点而言,需要注意一个问题,传统INTA信号是共享的,也就是多个设备的INTA信号是开漏输出的电路形式,最后线与产生请求信号。所以,交换开关同样需要模拟这种行为,其向处理器提交的消息也需要经过“线与”处理,这对于交换开关来说也不是什么难题。
PCI-Express的中断机制较传统PCI的中断机制复杂了不少,其主要采用如上两种机制。大家还有什么补充的?
(本文为《谈谈PCI-Express总线技术》的续文,未完待续。。。)
用户377235 2013-3-14 16:59
写的非常的好,不知道还有没有其他的一些关于pcie的东西