x86机器上的不同CPU可以具有不同的本地APIC寄存器MMIO基址吗?

时间:2018-08-22 12:29:30

标签: x86 intel interrupt pci

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寄存器映射到物理内存中的不同位置。

  1. 同一台计算机上的不同CPU可能对于本地APIC具有不同的基址吗?说,CPU 0决定停留在FEE00000H,但是CPU1移到FEF00000H

  2. 如果上述为真,PCI MSI中断如何工作?如果不同的CPU可以具有不同的本地APIC地址,则MSI消息地址对于不同的CPU意味着不同。

2 个答案:

答案 0 :(得分:3)

是的,它们可以不同。

即使MSI地址与默认的APIC地址相同,也不与之绑定。如果更改APIC基本地址,则MSI地址不会更改。

答案 1 :(得分:3)

  1. 是的,正如您所引用的,这是英特尔手册明确允许的。 但是,由于采用P6架构,APIC访问由处理器内部处理,没有可见的外部总线周期。

      

    对于P6家族,奔腾4和Intel Xeon处理器,APIC处理对以下所有内存的访问:   内部具有4 KB APIC寄存器空间内的地址,没有外部总线周期   产生。

    因此,重新映射只是为了避免与旧版设备发生冲突。
    今天,这是一种罕见的情况,因为从4 GiB-18 MiB到4GiB-17 MiB(开放式)区域保留给MSI。

  2. 从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)只是具有必要的信息,以对具有中断目标和类型的完整定义的表建立索引。

新格式为:

Remappable MSI(-X) format

基本上有三个字段:

  • HandleSub handle字段
    将它们一起添加,以将索引添加到IR表(IRT)中。由于Sub handle Data 寄存器中(而Handle在地址寄存器中),它们被分开了,这允许用一个地址和多个地址配置一个设备。数据值(显然这是必要条件)。
  • SHV字段用于判断Sub handle字段是否有效,否则使用零。

请注意,索引是一个16位值。

一旦找到索引,它就会用于检索IRT条目(IRTE),该条目包含传递中断的所有信息-包括一些用于验证中断源的字段。

请注意,旧版(兼容格式)MSI(-X)不会重新映射,无论是直通还是被屏蔽(取决于软件配置翻译器的方式)。