Operating system 关于x86 LAPIC系统上消息信号中断(MSI)的问题

Operating system 关于x86 LAPIC系统上消息信号中断(MSI)的问题,operating-system,interrupt,pci-e,apic,Operating System,Interrupt,Pci E,Apic,嗨,我正在写一个内核,并计划为PCI设备使用MSI中断 然而,我也被这些文件弄糊涂了 我对MSI的理解如下: 从PCI设备的角度来看: 文件表明我 需要找到capability ID=0x05来定位3个寄存器:消息控制(MCR)、消息地址(MAR)和消息数据(MDR)寄存器 MCR为MSI中断提供控制功能 MAR提供PCI设备的物理地址 将在中断发生时写入 MDR形成它将写入物理地址的实际数据 从CPU的角度来看: 文档显示,消息地址寄存器包含0xFEE的固定顶部,然后是目标ID(LAPIC I

嗨,我正在写一个内核,并计划为PCI设备使用MSI中断

然而,我也被这些文件弄糊涂了

我对MSI的理解如下:

从PCI设备的角度来看:

  • 文件表明我 需要找到capability ID=0x05来定位3个寄存器:消息控制(MCR)、消息地址(MAR)和消息数据(MDR)寄存器
  • MCR为MSI中断提供控制功能
  • MAR提供PCI设备的物理地址 将在中断发生时写入
  • MDR形成它将写入物理地址的实际数据
  • 从CPU的角度来看:

  • 文档显示,消息地址寄存器包含0xFEE的固定顶部,然后是目标ID(LAPIC ID)和其他控制位,如下所示:

  • 消息数据寄存器将包含以下信息,包括中断向量:


  • 读了所有这些之后,我想如果APIC_ID是0x0h,消息地址会与本地APIC内存映射冲突吗?虽然保留了FEE00000~FEE00010的地址

    此外,MDR中的矢量号是否与IDT矢量号对应。换句话说,如果我将MAR=0xFEE0000C(目标ID=0,使用逻辑APIC ID)和MDR=0x0032(边缘触发器,向量=50),并启用MSI中断,那么一旦设备发出中断,CPU将相应地运行IDT[50]所指的功能?之后,我将0h写入EOI寄存器以结束它

    最后,根据文档,MAR的上32位没有使用?有人能帮忙吗


    非常感谢

    您对如何在PCI(或PCIe)设备中检测和编程MSI的理解是正确的* 消息地址控制目标(中断发送到哪个CPU),而消息数据包含矢量号。对于正常中断,消息数据的所有位都应为0,但包含向量的低8位除外。 该向量是IDT的索引,因此,如果消息数据为0x0032,则通过IDT的条目50传递中断**

    如果中断消息中的目标ID为0,则MSI的消息地址与本地APIC的默认地址匹配,但不会发生冲突,因为APIC只能由CPU写入,而MSI只能由设备写入

    在x86平台上,消息地址的高32位必须为0。这可以通过将消息地址的上部设置为0或通过编程设备使用32位消息地址(在这种情况下,不使用上层消息地址寄存器)来实现。PCI规范设计用于使用64位MSI地址的系统,但x86系统从不使用消息地址的高32位

    通过写入APIC_基MSR重新编程APIC基地址不会影响MSI使用的地址范围;它总是0xFEExxxxx


    *您还应该了解MSI-X功能,因为有些设备支持MSI-X,但不支持MSI。MSI-X更灵活一些,这不可避免地使它更复杂一些


    **当使用MSI功能时,消息数据并不完全是消息数据寄存器(MDR)中的值。MSI功能允许设备使用多个连续向量。当设备发送中断消息时,它会根据设备内的中断原因用不同的值替换MDR的低位。

    @prl消息控制寄存器提供使用32位或64位寻址的能力,这是否意味着我不需要将其设置为64位寻址模式???@prl进一步,如果我重新映射LAPIC地址并手动使地址冲突怎么办??会发生什么?@prl所以如果我设置MAR=0xFEE0000C和MDR=0x0032,设备将调用IDT[50]对吗??你愿意把你的答案贴出来吗?我会接受的。