我正在实现PCIe驱动程序,我想了解可以在或应该启用/禁用中断的级别。我故意不指定操作系统,因为我认为它应该与任何平台相关。按级别,我的意思是:
- 操作系统特定的中断处理框架
- 可以在PCI / PCIe配置空间寄存器(例如COMMAND寄存器)中禁用或启用中断
- 中断也可以在设备级别屏蔽,例如,我们可以配置设备不触发对主机的某些中断
我知道,无论PCIe使用哪种中断类型(INTx仿真,MSI或MSI-X),都必须将其传递给主机OS。
所以我的问题是-我们实际上是否必须在每个层上启用或禁用中断,还是仅在最接近硬件的位置(例如在相关的PCI寄存器中)才足够?
1
在Windows KMDF驱动程序中,您可以在驱动程序.inf文件中指定要使用的中断类型(MSI,INTx和MSI-x),并且驱动程序框架将在加载时自行正确配置PCIe配置空间。我不了解其他操作系统,但是由于.inf特定于Windows,因此我认为它可能取决于操作系统。
—
汤姆·卡彭特
通常,您必须通过提供有关中断应执行的配置来完全启用它们。完成此操作后,仅在短暂的不间断计算期间在CPU上禁用,直到取消配置设备为止(例如,用于省电)
—
pjc50
如果您使用的是Linux,则可以为您的应用程序使用DMA框架吗?很好,您创建了事务,事务完成后它会返回一个可选的超时-您不必傻于实际的中断
—
johnnymopo 2015年
@ pjc50,如果驱动程序选择使用某种类型的中断(例如INTx),是否必须禁用通过MSI_CAP pci寄存器传递的MSI / MSI-X中断?(反之亦然-使用MSI时禁用INTx)
—
2015年