Intel手册说本地APIC寄存器被内存映射到4KB区域,默认地址为 FEE00000H 。可以使用 IA32_APIC_BASE MSR修改此地址。
引用SDM第3卷,第10.4.5节
奔腾4,英特尔至强和P6系列处理器允许 通过修改APIC寄存器的24位基址字段中的值,将APIC寄存器的起始地址从FEE00000H重定位到另一个物理地址。 IA32_APIC_BASE MSR。提供APIC体系结构的此扩展以帮助解决与内存的冲突 映射现有系统,并允许MP系统中的各个处理器将其APIC寄存器映射到物理内存中的不同位置。
同一台计算机上的不同CPU可能对于本地APIC具有不同的基址吗?说,CPU 0决定停留在FEE00000H,但是CPU1移到FEF00000H
如果上述为真,PCI MSI中断如何工作?如果不同的CPU可以具有不同的本地APIC地址,则MSI消息地址对于不同的CPU意味着不同。
答案 0 :(得分:3)
是的,它们可以不同。
即使MSI地址与默认的APIC地址相同,也不与之绑定。如果更改APIC基本地址,则MSI地址不会更改。
答案 1 :(得分:3)
是的,正如您所引用的,这是英特尔手册明确允许的。 但是,由于采用P6架构,APIC访问由处理器内部处理,没有可见的外部总线周期。
对于P6家族,奔腾4和Intel Xeon处理器,APIC处理对以下所有内存的访问: 内部具有4 KB APIC寄存器空间内的地址,没有外部总线周期 产生。
因此,重新映射只是为了避免与旧版设备发生冲突。
今天,这是一种罕见的情况,因为从4 GiB-18 MiB到4GiB-17 MiB(开放式)区域保留给MSI。
从PCI的角度来看,MSI非常简单:将一个值写入地址。
地址和值都通过MSI or MSI-x capability structures在设备的PCI地址空间中配置(分别为值05h和11h)。
仅 MSI-x 允许32位数据。
PCI规范是有意通用的,地址和数据对形成唯一的“中断向量”,即标识中断的值。
实际上,第一个设备对MESSAGE_DATA
字段的扩展非常有限,只有几个低位可写。
但是,在x86体系结构中,地址和数据采用特定的形式。
英特尔手册3A的10.11节对此进行了描述。
Address format
31 20 19 12 11 4 3 2 0
0FEEH Destination ID Reserved RH DM XX
Data format
63 16 15 14 13 11 10 8 7 0
Reserved TM LM Reserved Delivery mode Vector
我们可以看到这些格式与MSI和MSI-x都兼容,但更重要的是该地址的前缀为0feeh,使其至少为0fee00000h,即
4 GiB-18 MiB。
此区域用于通过主机到PCI的路由MSI,即根联合体(在CPU芯片上或在PCH中)或MCH(对于较旧的平台)。
地址确定将处理MSI的处理器集(确切的规则可以在Intel手册中找到)。
即使所有本地APIC都映射到相同的地址,也要由目标地址的格式来选择一组处理器,x86的MSI的设计是允许OS定向中断特定处理器。
因此,不,MSI地址对于每个CPU都具有相同的含义,因为不是由CPU处理PCI写操作,而是由主机到PCI的桥接器,并且该芯片是系统级的。
主机到PCI如何知道将MSI发送到哪里?
该地址具有目标ID(以Intel术语表示的MDA-消息目标地址),连同一些元信息,足以在“ APIC总线”中路由消息-逻辑结构,定义了实现(可能是环网)带有一些QPI / UPI / DMI网段的总线),用于连接APIC和APIC集群。
与网络数据包的路由非常相似。
MSI范围和默认本地APIC范围不重叠吗?
是的,但是这些范围位于两个不同的“地址空间”中:本地APIC范围位于每个内核内,或者最多位于非内核(但不在系统代理中),MSI范围位于主机到PCI中芯片。
针对MSI范围的PCI总线写操作永远不会离开主机到PCI的桥,而访问本地APIC范围的写操作永远不会离开内核。
这两个域之间的通信是通过APIC总线进行的。
注释中出现一个问题:在启用了VT-d的系统(本质上是IOMMU)中,为什么需要使用中断重新映射(IR)机制?为什么DMA重新映射不能满足要求?
由于MSI(-X)是从设备启动的存储器写操作,因此DMA重映射应足以重映射中断。
DMA重映射转换地址,而MSI(-X)由目标地址(传达中断的目的地)和数据(指定要传递的中断的类型)组成。
为了使软件能够完全控制要传递的中断,VT-d规范为MSI(-X)引入了一种新格式:可重映射格式。
这个想法类似于CPU使用的标准内存转换:MSI(-X)只是具有必要的信息,以对具有中断目标和类型的完整定义的表建立索引。
新格式为:
基本上有三个字段:
Handle
和Sub handle
字段Sub handle
在 Data 寄存器中(而Handle
在地址寄存器中),它们被分开了,这允许用一个地址和多个地址配置一个设备。数据值(显然这是必要条件)。 SHV
字段用于判断Sub handle
字段是否有效,否则使用零。 请注意,索引是一个16位值。
一旦找到索引,它就会用于检索IRT条目(IRTE),该条目包含传递中断的所有信息-包括一些用于验证中断源的字段。
请注意,旧版(兼容格式)MSI(-X)不会重新映射,无论是直通还是被屏蔽(取决于软件配置翻译器的方式)。