消息信号中断

消息信号中断（MSI）作为一种中断触发机制，主要通过带内发送特殊消息来代替传统通过专用中断线发送带外信号的方法。虽然该方法在设备端实现较为复杂，但相较于基于物理引脚的带外中断信号传输机制，该技术具有诸多显著优势，例如能够显著提升中断处理性能。这与传统中断请求（IRQ）机制形成了鲜明对比，展现出更高效的中断处理能力。

自PCI总线2.2版本起，以及后续推出的PCI Express总线中，均支持消息信号中断技术。此外，某些非PCI架构的系统也采用了消息信号中断机制。

 概述 
传统设备通过专用中断线向主机发送信号，这种带外控制方式依赖独立于数据通道的物理引脚。消息信号中断（MSI）则将这一机制移至数据通道内部（带内），通过在主数据路径上传输特殊消息触发中断，省去了额外的硬件线路。例如，设备通过向特定内存映射地址写入少量数据来通知中断请求，随后芯片组解析该数据并传递至处理器，完成中断响应。需注意的是，MSI过程中传递的数据仅用于确定中断类型及目标处理器，并不能作为设备向处理程序发送额外信息的渠道——这一误解常源于对内存写入功能的混淆。

采用MSI技术的系统往往通过软件模拟传统硬件机制。以PCI Express总线为例，其完全摒弃物理中断引脚，借助预定义消息格式实现中断触发与释放的带内模拟。类似地，惠普GSC设备也通过直接写入内存空间中的中断寄存器生成信号，而无需物理线路参与。HyperTransport协议同样集成MSI技术，进一步验证了该方案在不同架构中的适用性。这类实现不仅减少了硬件复杂度，也增强了中断系统灵活性，体现出软硬件协同设计的优势。

 优点 
尽管在设备中实现起来更为复杂，但消息信号中断相较于基于引脚的传统带外中断信号机制，展现出了若干显著优势。从机械结构的角度来看，减少引脚数量使得连接器更为简洁、成本更低且可靠性更高。虽然这对标准PCI连接器并无明显益处，但PCI Express接口却充分利用了这一节省，体现了其设计的先进性。

MSI显著增加了可用的中断数量。在传统PCI架构中，每张卡最多只能支持四个中断（且由于这些中断在所有卡之间共享，大多数情况下每张卡仅使用一个），而MSI技术则使得每张卡能够支持数十个中断，这在需要大量中断处理的应用场景中尤为有利。

此外，MSI还带来了一小部分性能上的优势。在软件层面，基于引脚的中断可能会与内存的延迟写入发生竞态问题。具体来说，PCI设备在将数据写入内存后，会随即发送一个中断信号以表明DMA（直接内存访问）写操作已完成。然而，PCI桥接器或内存控制器可能会为了不干扰其他内存操作而缓存该写请求，导致中断信号在DMA写操作实际完成之前到达，处理器因而可能读取到内存中的陈旧数据。为避免这种竞态，中断处理程序不得不从设备中读取数据以确认DMA写操作确实已完成，这一读取操作会带来一定的性能损耗。而MSI写入操作无法超越DMA写入，因此从根本上消除了这一竞态问题。

 中断类型 
PCI规范中定义了两项可选的扩展功能以支持消息信号中断，分别是MSI和MSI-X。而PCI Express则自行设计了一套基于消息的机制，用以模拟传统的PCI中断方式。

 MSI 

MSI（首次定义于PCI 2.2版本）允许设备分配1、2、4、8、16或32个中断。设备被配置为向一个特定地址写入数据（此地址通常是中断控制器中的一个控制寄存器），并使用一个16位的数据字来标识自身。中断号被添加到此数据字中，用以具体指明是哪一个中断。部分平台，如Windows，并未充分利用全部32个中断，而是仅使用最多16个中断。

 MSI-X 

MSI-X（首次定义于PCI 3.0版本）允许设备分配多达2048个中断。人们发现，最初MSI采用的单一地址方案在某些架构上存在限制，尤其是在将不同中断精准定位到不同处理器方面显得力不从心，而这一点在某些高速网络应用中尤为重要。MSI-X不仅支持更多的中断数量，还为每个中断配备了独立的目标地址和数据字。不过，并非所有支持MSI-X的设备都能实际提供2048个中断。

MSI中的可选功能（如64位地址支持和中断屏蔽）在MSI-X中也成为了必须支持的特性。

 PCI Express传统中断模拟 

PCI Express本身并不具备物理中断引脚，但它通过专门的PCI Express消息（例如Assert_INTA和Deassert_INTC）来模拟PCI的4个物理中断引脚。由于这一机制基于消息（在PCI Express层），它在一定程度上提供了PCI层MSI机制的优点，但并非全部：每个设备的4个虚拟中断引脚不再在总线上共享（尽管PCI Express控制器内部可能仍会合并传统中断），并且中断状态的改变不再天生地受到竞争条件的影响。

PCI Express允许设备使用这些传统中断消息，以保持与PCI驱动程序的软件兼容性，但同时要求这些设备在PCI层也必须支持MSI（消息信号中断）或MSI-X（扩展消息信号中断）。

 x86系统 
在英特尔系统中，即使是在单核系统上，也必须启用LAPIC（本地高级可编程中断控制器），才能使PCI（以及PCI Express）的MSI/MSI-X正常工作。在这些系统中，MSI的处理方式是将中断向量直接写入需要处理中断的处理器/核心的LAPIC。2009年的英特尔LAPIC支持最多224个基于MSI的中断。根据2009年英特尔使用Linux进行的基准测试，与I/O APIC（输入输出高级可编程中断控制器）传递相比，使用MSI将中断延迟减少了近三倍。

 操作系统支持 
在微软操作系统家族中，Windows Vista及后续版本均支持MSI和MSI-X。这一支持功能是在2004年左右的Longhorn开发周期中引入的。然而，在更早期的版本如Windows XP或Windows Server 2003中，并不支持MSI功能。

2005年发布的Solaris Express 6/05增加了对MSI和MSI-X的支持，这是其新设备驱动程序接口（DDI）中断框架的一部分。

2008年发布的FreeBSD 6.3和7.0版本增加了对MSI和MSI-X的支持。

2011年发布的OpenBSD 5.0版本增加了对MSI的支持，而在随后的6.0版本中，又进一步添加了对MSI-X的支持。

Linux系统大约在2003年获得了对MSI和MSI-X的支持。然而，在2.6.20版本之前的内核中，MSI/MSI-X的实现存在严重的缺陷和限制。

Haiku系统大约在2010年实现了对MSI的支持，随后在2013年又增加了对MSI-X的支持。

NetBSD 8.0版本于2018年发布，新增了对MSI和MSI-X的支持。

VxWorks 7系统支持MSI和MSI-X。

 参考资料 

Category:中断
Category:数字电子