IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    MSI under Linux

    Adam Lee发表于 2014-04-07 17:00:00
    love 0

    什么是MSI

    MSI(Message Signaled Interrupts)是一种中断形式, 依靠设备将约定数据写入指定地址来通知CPU中断的产生.

    MSI从PCI 2.2开始支持, 在PCI 3.0中得到扩展. 支持更多中断以及拥有独立配置各个中断能力的MSI-X则从PCI 3.0开始被支持.

    MSI的优点

    相对基于引脚的中断响应方式, 首先MSI支持更多的中断且不需要复用, 其次启用MSI的设备的数据写入和中断触发是串行的, 驱动接收到中断信号的时候就可以确定数据已经准备就绪, 而不需要检查相应设备的寄存器, 这提升了性能.

    如何在Linux下使用MSI

    PCI设备默认以基于引脚的中断响应方式初始化, 然后由驱动来检测是否支持MSI并决定是否启用, 如果启用MSI失败则会回退到基于引脚的中断响应方式. 下面是关于MSI的几个重要的内核函数:

    启用MSI并给设备分配一个中断:

    int pci_enable_msi(struct pci_dev *dev)
    

    允许驱动申请minvec至maxvec个中断:

    int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)
    

    获取设备申请的中断向量个数:

    int pci_msi_vec_count(struct pci_dev *dev)
    

    禁用MSI, 回退到基于引脚的中断响应方式:

    void pci_disable_msi(struct pci_dev *dev)
    

    ref:

    1, https://en.wikipedia.org/wiki/Message_Signaled_Interrupts
    2, https://www.kernel.org/doc/Documentation/PCI/MSI-HOWTO.txt



沪ICP备19023445号-2号
友情链接