【问题标题】:Can different CPUs on an x86 machine can have different local APIC register MMIO base addresses?x86机器上的不同CPU可以有不同的本地APIC寄存器MMIO基地址吗?
【发布时间】:2019-01-28 17:17:18
【问题描述】:

英特尔手册说本地 APIC 寄存器是内存映射到 4KB 区域,默认地址为 FEE00000H。可以使用 IA32_APIC_BASE MSR 修改此地址。

引用 SDM Vol 3,第 10.4.5 节

Pentium 4、Intel Xeon 和 P6 系列处理器允许 通过修改 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 意味着不同。

【问题讨论】:

    标签: x86 intel interrupt pci


    【解决方案1】:

    是的,它们可以不同。

    MSI 地址,即使它与默认 APIC 地址相同,也不会与之绑定。如果 APIC 基地址改变,MSI 地址不会改变。

    【讨论】:

      【解决方案2】:
      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。
        该区域用于通过 Host-to-PCI 路由 MSI,即 Root Complex(在 CPU 芯片上或 PCH 中)或 MCH(对于旧平台)。
        该地址决定了哪组处理器将处理 MSI(确切的规则可以在 Intel 的手册中找到)。

        即使所有本地 APIC 都映射到同一个地址,选择一组处理器的也是目的地址的格式,x86 的 MSI 的设计是让 OS 直接中断特定处理器。
        所以,不,MSI 地址对每个 CPU 都意味着同样的事情,因为处理 PCI 写入的不是 CPU,而是主机到 PCI 桥,而且这个芯片是系统范围的。


      Host-to-PCI 如何知道将 MSI 发送到哪里?

      地址有一个目标 ID(英特尔术语中的 MDA - 消息目标地址),连同一些元信息,足以在“APIC 总线”中路由消息 - 一个逻辑结构,实现定义(可能是环带有一些 QPI/UPI/DMI 段的总线),用于连接 APIC 和 APIC 集群。
      与网络数据包的路由方式非常相似。

      MSI 范围和默认的本地 APIC 范围是否重叠?

      是的,但是这些范围存在于两个不同的“地址空间”中:本地 APIC 范围存在于每个核心中,或者最多存在于非核心中(但不在系统代理中) MSI 范围存在于 Host-to-PCI芯片。
      从针对 MSI 范围的 PCI 总线的写入永远不会离开主机到 PCI 桥,而对本地 APIC 范围的访问永远不会离开内核。
      这两个域之间的通信是通过 APIC 总线进行的。


      附录

      cmets 中出现了一个问题:在启用了VT-d 的系统中(本质上是 IOMMU),为什么需要中断重映射 (IR) 机制?为什么 DMA 重新映射不能满足要求?

      由于 MSI(-X) 是从设备启动的内存写入,因此 DMA 重新映射应该足以重新映射中断。

      DMA 重新映射转换地址,而 MSI(-X) 由目标地址(传达中断的目的地)和数据(指定要传递的中断类型)组成.
      为了让软件完全控制要传递的中断,VT-d 规范为 MSI(-X) 引入了一种新格式:可重映射格式
      这个想法类似于 CPU 使用的标准内存转换:MSI(-X) 只具有必要的信息来索引具有中断目标和类型的完整定义的表。

      新的格式是:

      基本上有三个字段:

      • HandleSub handle 字段
        它们被添加在一起以将索引放入 IR 表 (IRT)。它们被分开了,因为Sub handleData 寄存器中(而Handle 在地址寄存器中),这允许配置具有单个地址和多个数据值的设备(显然事实证明这是必要的要求)。
      • SHV 字段用于判断Sub handle 字段是否有效,否则使用零代替。

      请注意,索引是 16 位值。

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

      请注意,旧版(兼容格式)MSI(-X)从不重新映射,它们要么通过,要么被阻止(取决于软件如何配置翻译器)。

      【讨论】:

      • 感谢您的详细回答。几个后续问题 1. 这是否意味着每个 CPU 都有自己的 IA32_APIC_BASE MSR ?换句话说,该寄存器是否已存储(如 APIC 寄存器本身)? 2.参考上面prl的回答,APIC地址和MSI目标地址之间真的没有关系吗?即使 CPU 更改 APIC 基地址,MSI 目标是否仍然保持 FEExxxx ?
      • 3.在另一个 MMIO 设备映射到 FEExxx 区域的假设场景中,这是否会阻止 PCI 设备写入该设备 - 因为设备对该区域的所有 PCI 写入都将变成中断消息?我的意思是 CPU 可以通过重新映射 APIC 基础访问该区域,但 PCI 设备可能不能?
      • @joz 1. 是的,IA32_APIC_BASE_MSR 是每个硬件线程。 2. 是的,也许措辞不好,但在我的回答中,我明确表示 MSI 地址与本地 APIC 地址无关。 3. 据我了解,是的。尽管写入在 PCI 总线上是可见的,因此映射到那里的设备仍可能对其做出响应并进行干扰。我想说没有 PCI 设备应该访问该区域。
      • 谢谢。 这是一种罕见的情况,因为从 4 GiB - 18 MiB 到 4GiB(开放式)的区域是为 MSI 保留的。 由于地址必须从 0FEE 开始,所以保留空间不应该是只有 1 MB,而不是整个 18 MB?
      • @joz,绝对!你是对的,我认为整个范围都是保留的,但是一个固定的前缀将大小固定为 1 MiB。
      猜你喜欢
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多