编写适用于 Oracle® Solaris 11.2 的设备驱动程序

退出打印视图

更新时间: 2014 年 9 月
 
 

标准消息告知中断和扩展消息告知中断

标准 (MSI) 和扩展 (MSI-X) 消息告知中断均作为带内消息实现。消息告知中断可作为使用软件指定的地址和值的写操作进行发送。

MSI 中断

常规 PCI 规范包括可选的消息告知中断 (Message Signaled Interrupt, MSI) 支持。MSI 是作为发送的写操作实现的带内消息。MSI 的地址和数据由软件指定,并特定于主桥 (host bridge)。由于消息是带内消息,因此消息的接收可用于“推送”与中断关联的数据。根据定义,MSI 中断是独享的。指定给设备的每条 MSI 消息保证在系统中均为唯一消息。PCI 函数可以请求 1、2、4、8、16 或 32 条 MSI 消息。请注意,系统软件为函数分配的 MSI 消息数可以少于函数所请求的数量。可限制主桥 (host bridge) 中为设备分配的唯一 MSI 消息的数量。

MSI-X 中断

MSI-X 中断是 MSI 中断的增强版本,与 MSI 中断有相同功能,具有以下关键区别:

  • 每个设备最多支持 2048 个 MSI-X 中断向量。

  • 每个中断向量的地址和数据项都是唯一的。

  • MSI-X 支持按函数屏蔽和按向量屏蔽。

利用 MSI-X 中断,未分配的设备中断向量可以使用先前添加或初始化的 MSI-X 中断向量共享相同的向量地址、向量数据、中断处理程序和处理程序参数。使用 ddi_intr_dup_handler(9F) 函数可相对于关联设备上未分配的中断向量为 Oracle Solaris OS 提供的资源设置别名。例如,如果为驱动程序分配了 2 个 MSI-X 中断,并且设备支持 32 个中断,则驱动程序可以使用 ddi_intr_dup_handler() 相对于设备上其他 30 个中断为其收到的 2 个中断设置别名。

ddi_intr_dup_handler() 函数可以复制使用 ddi_intr_add_handler(9F) 添加或使用 ddi_intr_enable(9F) 初始化的中断。

复制的中断最初处于禁用状态。可使用 ddi_intr_enable() 启用复制的中断。您不能删除原始 MSI-X 中断处理程序,除非删除了与此原始中断处理程序相关联的所有复制的中断处理程序。要删除复制的中断处理程序,请首先调用 ddi_intr_disable(9F),然后调用 ddi_intr_free(9F)。当删除与该原始中断处理程序相关联的所有复制的中断处理程序后,就可以使用 ddi_intr_remove_handler(9F) 删除该原始 MSI-X 中断处理程序。有关示例,请参见 ddi_intr_dup_handler(9F) 手册页。