Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1504671
  • 博文数量: 228
  • 博客积分: 1698
  • 博客等级: 上尉
  • 技术积分: 3241
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-24 21:49
个人简介

Linux

文章分类

全部博文(228)

文章存档

2017年(1)

2016年(43)

2015年(102)

2014年(44)

2013年(5)

2012年(30)

2011年(3)

MSI

分类: LINUX

2014-11-27 10:22:01

1. 什么是MSI中断

    MSI(Message Signaled Interrupt)是PCI2.2提出的新的中断处理形式,即,有中断产生时在系统特定内存地址写入中断数据已通知CPU一个中断。该种方式脱离了中断引脚(PIN)带来的数目限制,并且延迟小、效率高。MSI的扩展MSI-X在3.0里定义,相较MSI,MSI-X支持更多的消息数量(2048)以及独立的消息地址。MSI支持32个消息,一个MSI地址。

2. PCI规范中的MSI设计

    msi以及msi-x的相关数据作为pci配置空间的一个capability structure来实现的。

    msi的capability structure比较简单。

    这是一个最简单的32为message 地址以及16位message 数据的msi capability structure。根据message control中的标记,地址可以是64位,还可能存在masking/pending域,用于对msi中断的屏蔽进行管理。msi-x为了扩展支持更多的中断向量,其capability structure包含的是中断向量表的地址(由设备bar确定)

    (address和data的格式根据不同的体系结构有不同的实现方式。最简单的实现就可以是address就是一个固定的地址,data就是为其分配的中断向量号,这样root complex在发现对这个address写了数据,就会通知CPU对应的msi中断到了。当然,我们也可以细分这些数据结构,达到中断检查等目的)

3. Linux 2.6.26中的msi中断处理

    以X86为例。一般的流程是,设备驱动里面检查自己是否具有msi或者msi能力,如果有的话,调用driver/pci/msi.c中的pci_enable_msi或者pci_enable_msix。这里以msi为例,msix稍微复杂一些,但原理类似。在msi-HOWTO.txt里提到了,要使用msi机制,需要先调用pci_enable_msi接口。

4. PCI支持的两种中断,INTx和MSI

    1)基于引脚的PCI中断往往被多个设备所共享,内核需要判断并调用相应的中断处理函数,这样效率就比较低。MSI不存在共享问题。中断共享的时候,中断触发以后,由于Linux并不知道是哪个设备产生的,所以要一一调用对应的ISR(interrupt service routines)来确定。

    2)当设备向内存写入数据,然后发起引脚中断时,有可能在CPU收到中断时,数据还未到达内存(在PCI-PCI桥后的设备更有可能如此)。为了保证数据已达 内存,中断处理程序必须轮询产生该中断的设备的一个寄存器,PCI事务保序规则会确保所有数据到达内存后,寄存器才会返回值。使用MSI时,产生中断的写不能越过数据写,因而避免了这个问题。当中断产生时,驱动可以确信所有数据已经到达内存。

    3)对于多功能PCI设备而言,每一个功能最多只有一个中断引脚。设备驱动程序必须查询设备产生的具体事件,势必降低中断处理速度。而一个设备可以支持最多32个MSI中断,每个中断有其特定功能,譬如,一些一场情况和错误处理有其单独的中断能让驱动程序处理如数据收发中断更有效。


阅读(1598) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~