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

问题描述 投票:0回答:1

嗨,我正在编写一个内核,并计划将MSI中断用于PCI设备。

但是,我也对文档感到困惑。

我对MSI的理解如下:

从PCI设备的角度来看:

  1. 文件表明我需要找到Capabillty ID = 0x05来查找3个寄存器:消息控制(MCR),消息地址(MAR)和消息数据(MDR)寄存器
  2. MCR为MSI中断提供控制功能,
  3. MAR提供PCI设备的物理地址一旦中断发生就会写
  4. MDR形成它将写入物理地址的实际数据

从CPU的角度来看:

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

    enter image description here

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

    enter image description here


阅读所有这些信息后,我在考虑如果APIC_ID为0x0h,那么消息地址是否会与本地APIC内存映射冲突?尽管保留了FEE00000〜FEE00010的地址。

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

最后,根据文档,不使用MAR的高32位吗?有人可以帮忙吗?

非常感谢!

operating-system interrupt pci-e apic
1个回答
0
投票

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

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

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

通过写入APIC_BASE MSR重新编程APIC基址不会影响用于MSI的地址范围;它始终是0xFEExxxxx。


*您还应该查看MSI-X功能,因为某些设备支持MSI-X,但不支持MSI。 MSI-X更加灵活,这不可避免地使其变得更加复杂。

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

© www.soinside.com 2019 - 2024. All rights reserved.