0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教大家如何处理x86处理器中MSI-X中断请求

TLOc_gh_3394704 来源:博客 作者:sailing 2021-08-12 11:23 次阅读

x86处理器如何处理MSI-X中断请求PCIe设备发出MSI-X中断请求的方法与发出MSI中断请求的方法类似,都是向Message Address所在的地址写Message Data字段包含的数据。

只是MSI-X中断机制为了支持更多的中断请求,在MSI-X Capablity结构中存放了一个指向一组Message Address和 Message Data字段的指针,从而一个PCIe设备可以支持的MSI-X中断请求数目大于32个,而且并不要求中断向量号连续。

MSI-X机制使用的这组Message Address和 Message Data字段存放在PCIe设备的BAR空间中,而不是在PCIe设备的配置空间中,从而可以由用户决定使用MSI-X中断请求的数目。

当系统软件初始化PCIe设备时,如果该PCIe设备使用MSI-X机制传递中断请求,需要对MSI-X Capability结构指向的Message Address和Message Data字段进行设置,并使能MSI-X Enable位。x86处理器在此处的实现与PowerPC处理器有较大的不同。

Message Address字段和Message Data字段的格式

在x86处理器系统中,PCIe设备也是通过向Message Address写入Message Data指定的数值实现MSI/MSI-X机制。在x86处理器系统中,PCIe设备使用的Message Adress字段和Message Data字段与PowerPC处理器不同。

1 PCIe设备使用Message Adress字段

在x86处理器系统中,PCIe设备使用的Message Address字段仍然保存PCI总线域的地址。

其中第31~20位,存放FSB Interrupts存储器空间的基地址,其值为0xFEE。当PCIe设备对0xFEEX-XXXX这段“PCI总线域”的地址空间进行写操作时,MCH/ICH将会首先进行“PCI总线域”到“存储器域”的地址转换,之后将这个写操作翻译为FSB总线的Interrupt Message总线事务,从而向CPU内核提交中断请求。

x86处理器使用FSB Interrupt Message总线事务转发MSI/MSI-X中断请求。使用这种方法的优点是向CPU内核提交中断请求的同时,提交PCIe设备使用的中断向量,从而CPU不需要使用中断响应周期从寄存器中获得中断向量。FSB Interrupt Message总线事务的详细说明见下文。

Message Address字段其他位的含义如下所示。

•Destination ID字段保存目标CPU的ID号,目标CPU的ID与该字段相等时,目标CPU将接收这个Interrupt Message。FSB Interrupt Message总线事务可以向不同的CPU提交中断请求。

•RH(Redirection Hint Indication)位为0时,表示Interrupt Message将直接发向与Destination ID字段相同的目标CPU;如果RH为1时,将使能中断转发功能。

•DM(Destination Mode)位表示在传递优先权最低的中断请求时,Destination ID字段是否被翻译为Logical或者Physical APIC ID。在x86处理器中APIC ID有三种模式,分别为Physical、Logical和Cluster ID模式。

•如果RH位为1且DM位为0时,Destination ID字段使用Physical模式;如果RH位为1且DM位为1,Destination ID字段使用Logical模式;如果RH位为0,DM位将被忽略。

以上这些字段的描述与x86处理器使用的APIC中断控制器相关。对APIC的详细说明超出了本书的范围,对此部分感兴趣的读者请参阅Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1。

2 Message Data字段

Trigger Mode字段为0b0x时,PCIe设备使用边沿触发方式申请中断;为0b10时使用低电平触发方式;为0b11时使用高电平触发方式。

MSI/MSI-X中断请求使用边沿触发方式,但是FSB Interrupt Message总线事务还支持Legacy INTx中断请求方式,因此在Message Data字段中仍然支持电平触发方式。但是对于PCIe设备而言,该字段为0b0x。

Vector字段表示这个中断请求使用的中断向量。FSB Interrupt Message总线事务在提交中断请求的同时,将中断向量也通知给处理器。

因此使用FSB Interrupt Message总线事务时,处理器不需要使用中断响应周期通过读取中断控制器获得中断向量号。与PowerPC的传统方式相比,x86处理器的这种中断请求的效率较高[①]。

值得注意的是,在x86处理器中,MSI机制使用的Message Data字段与MSI-X机制相同。但是当一个PCIe设备支持多个MSI中断请求时,其Message Data字段必须是连续的,因而其使用的Vector字段也必须是连续的,这也是在x86处理器系统中,PCIe设备支持多个MSI中断请求的问题所在,而使用MSI-X机制有效避免了该问题。

Delivery Mode字段表示如何处理来自PCIe设备的中断请求。

•该字段为0b000时,表示使用“Fixed Mode”方式。此时这个中断请求将被Destination ID字段指定的CPU处理。

•该字段为0b001时,表示使用“Lowest Priority”方式。此时这个中断请求将被优先权最低的CPU处理。

当使用“Fixed Mode”和“Lowest Priority”方式时,如果Vector字段有效,CPU接收到这个中断请求之后,将使用Vector字段指定的中断向量处理这些中断请求;而当Delivery Mode字段为其他值时,Message Data字段中所包含的Vector字段无效。

•该字段为0b010时,表示使用SMI方式传递中断请求,而且必须使用边沿触发,此时Vector字段必须为0。这个中断请求将被Destination ID字段指定的CPU处理。

•该字段为0b100时,表示使用NMI方式传递中断请求,而且必须使用边沿触发,此时Vector字段和Trigger字段的内容将被忽略。这个中断请求将被Destination ID字段指定的CPU处理。

•该字段为0b101时,表示使用INIT方式传递中断请求,Vector字段和Trigger字段的内容将被忽略。这个中断请求将被Destination ID字段指定的CPU处理。

•该字段为0b111时,表示使用INTR信号传递中断请求且使用边沿触发。此时MSI中断信息首先传递给中断控制器,然后中断控制器在通过INTR信号向CPU传递中断请求,之后CPU在通过中断响应周期获得中断向量。

上文中PowerPC处理器使用的方法与此方法类似。而在x86处理器中多使用Interrupt Message总线事务进行MSI中断信息的传递,因此这种模式很少被使用。

边沿触发和电平触发是中断请求常用的两种方式。其中电平触发指外部设备使用逻辑电平1(高电平触发)或者0(低电平触发),提交中断请求。使用电平或者边沿方式提交中断请求时,外部设备一般通过中断线(IRQ_PIN#)与中断控制器相连,其中多个外部设备可能通过相同的中断线与中断控制器相连(线与或者与门)。

外部设备在使用低电平触发,提交中断请求的过程中,首先需要将IRQ_PIN#信号驱动为低。当中断控制器将该中断请求提交给处理器,而且处理器将这个中断请求处理完毕后,处理器将通过写外部设备的某个寄存器来清除此中断源,此时外部设备将不再驱动IRQ_PIN#信号线,从而结束整个中断请求。

IRQ_PIN#信号线可以被多个外部设备共享,在这种情况之下,只有所有外部设备都不驱动IRQ_PIN#信号线时,IRQ_PIN#信号才为高电平。

采用电平触发方式进行中断请求的优点是不会丢失中断请求,而缺点是一个优先权较高的中断请求有可能会长期占用中断资源,从而使其他优先权较低的中断不能被及时提交。因为优先级别较高的中断源有可能会持续不断地驱动IRQ_PIN#信号。

而边沿触发使用上升沿(0到1)或者下降沿(1到0)作为触发条件,但是中断控制器并不是使用这个“边沿”作为触发条件。

中断控制器使用内部时钟对IRQ_PIN#信号进行采样,如果在前一个时钟周期,IRQ_PIN#信号为0,而后一个时钟周期,IRQ_PIN#信号为1,中断控制器认为外部设备提交了一个有效“上升沿”,中断控制器会锁定这个“上升沿”并向处理器发出中断请求。

这也是外部设备至少需要将IRQ_PIN#信号保持一个时钟采样周期的原因,否则中断控制器可能无法识别本次边沿触发的中断请求,从而产生Spurious中断请求。

外部设备使用“上升沿”进行中断申请时,不需要持续地将IRQ_PIN#信号驱动为1,而只需要保证中断控制器可以进行正确采样这些中断信号即可。在处理边沿触发中断请求时,处理器不需要清除中断源。

使用边沿触发可以有效避免“优先级别”较高的中断源长期占用IRQ_PIN#信号的情况,使用“下降沿”触发进行中断请求与“上升沿”触发类似。

但是外部设备使用边沿触发方式时,有可能会丢失一些中断请求。例如在一个处理器系统中,存在一个定时器,这个定时器使用上升沿触发方式向中断控制器定时提交中断。

如果当处理器正在处理这个定时器的上一个中断请求时,将不会处理这个定时器发出的其他“边沿”中断请求,从而导致中断丢失。而使用电平触发方式不会出现这类问题,因为电平触发方式是一个“持续”过程,处理器只有处理完毕当前中断,并清除相应中断源之后,才会处理下一个中断源。

MSI中断请求实际上和边沿触发方式非常类似,MSI中断请求通过存储器写TLP实现,这个写动作是一个瞬间的动作,并不是一个持续请求,因此在x86处理器中MSI中断请求使用边沿触发进行中断请求。

还有一些外部设备可以通过I/O APIC进行中断请求[②],这些I/O APIC接收的外部中断需要标明是使用边沿或者电平触发,I/O APIC使用FSB Interrupt Message总线事务将中断请求发向Local APIC,并由Local APIC向处理器提交中断请求。

FSB Interrupt Message总线事务

与MPC8572处理器处理MSI中断请求不同,x86处理器使用FSB的Interrupt Message总线事务,处理PCIe设备的MSI/MSI-X中断请求。

由上文所示,MPC8572处理器处理MSI中断请求时,首先由MPIC中断控制器截获这个MSI中断请求,之后由MPIC中断控制器向CPU提交中断请求,而CPU通过中断响应周期从MPIC中断控制器的ACK寄存器中获得中断向量。

采用这种方式的主要问题是,当一个处理器中存在多个CPU时,这些CPU都需要通过中断响应周期从MPIC中断控制器的ACK寄存器中获得中断向量。在一个中断较为密集的应用中,ACK寄存器很可能会成为系统瓶颈。

而采用Interrupt Message总线事务可以有效地避免这种系统瓶颈,因为使用这种方式中断信息和中断向量将同时到达指定的CPU,而不需要使用中断响应周期获得中断向量。

x86处理器也具有通过中断控制器提交MSI/MSI-X中断请求的方法,在I/O APIC具有一个 “The IRQ Pin Assertion Register”寄存器,该寄存器地址为0xFEC00020[③],其第4~0位存放IRQ Number。系统软件可以将PCIe设备的Message Address寄存器设置为0xFEC00020,将Meaasge Data寄存器设置为相应的IRQ Number。

当PCIe设备需要提交MSI中断请求时,将向PCI总线域的0xFEC00020地址写入Message Data寄存器中的数据。此时这个存储器写请求将数据写入I/O APIC的The IRQ Pin Assertion Register中,并由I/O APIC将这个MSI中断请求最终发向Local APIC,之后再由Local APIC通过INTR#信号向CPU提交中断请求。

上述步骤与MPC8572处理器传递MSI中断的方法类似。在x86处理器中,这种方式基本上已被弃用。说明x86处理器如何使用FSB总线的Interrupt Message总线事务,向CPU提交MSI/MSI-X中断请求。

PCIe设备在发送MSI/MSI-X中断请求之前,系统软件需要合理设置PCIe设备MSI/MSI-X Capability寄存器,使Message Address寄存器的值为0xFEExx00y[④],同时合理地设置Message Data寄存器Vector字段。

PCIe设备提交MSI/MSI-X中断请求时,需要向0xFEExx00y地址写Message Data寄存器中包含的数据,并以存储器写TLP的形式发送到RC。如果ICH收到这个存储器写TLP时,将通过DMI接口将这个TLP提交到MCH。

MCH收到这个TLP后,发现这个TLP的目的地址在FSB Interrupts存储器空间中,则将PCIe总线的存储器写请求转换为Interrupt Message总线事务,并在FSB总线上广播。

FSB总线上的CPU,根据APIC ID信息,选择是否接收这个Interrupt Message总线事务,并进入中断状态,之后该CPU将直接从这个总线事务中获得中断向量号,执行相应的中断服务例程,而不需要从APIC中断控制器获得中断向量。与PowerPC处理器的MPIC中断控制器相比,这种方法更具优势。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18275

    浏览量

    222164
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206564
  • APIC
    +关注

    关注

    0

    文章

    4

    浏览量

    7230

原文标题:x86处理器如何处理MSI-X中断请求

文章出处:【微信号:gh_339470469b7d,微信公众号:FPGA与数据通信】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    分享:中国造ARM架构处理器:完胜英特尔x86处理器

    处理器以来,十年时间里除了老牌巨头IBM,未曾有任何企业挑战Intel性能冠军的宝座。如今,第一个向老大哥扔出巨斧的不是AMD,不是Nvidia,也不是一众欧美企业,而是几年前还背着“山寨”恶名的中国
    发表于 11-19 16:24

    xp支持PCIEMSI中断方式么

    各位大家好:        在使用PCIE时,我使用6678向PC机(xp系统)发送MSI中断,但是查找资料发现貌似xp不支持msi中断,以
    发表于 06-21 11:03

    arm还是x86?未来在工业SBC数字谁可以脱颖而出

    `在过去的30年里,工业PC市场一直由x86处理器占据主导地位,考虑到其在台式PC的应用,这应该不足为奇。从无风扇坚固的箱式计算机到PC / 104和Mini-ITX等工业板标准,x86
    发表于 04-23 15:06

    Intel 64处理器的基本运行环境

    Intel 64x86_64IA-32x86处理器基本执行环境 (1) - 32位执行环境概述
    发表于 05-22 15:11

    Intel 64x86_64IA-32x86处理器的64位执行环境

    Intel 64x86_64IA-32x86处理器基本执行环境 (2) - 64位执行环境
    发表于 06-06 06:54

    适用于x86架构的快速启动步骤是什么?

    x86架构通常会唤起人们对家用电脑或企业服务的思索。这并不出人意料,因为x86处理器的功耗通常较大。最近,英特尔公司开始以嵌入式、低功耗和低成本市场为目标,并推出了基于
    发表于 03-20 06:38

    请问14纳米的ARM 处理器和14纳米的X86移动处理器那个更省电?​

    14纳米的ARM 处理器和14纳米的X86移动处理器那个更省电?​
    发表于 07-14 08:03

    中断的五个步骤:中断请求中断判优、中断响应、中断处理中断返回

    破坏主程序寄存的内容,应先将断点各寄存的内容压入堆栈保护起来,再进入的中断处理。现场保护
    发表于 08-28 15:55

    了解ARM和x86处理内核之间的差异

    ARM和x86是地球上最常见的两个处理器系列。它们的优点,缺点和用途是什么?多年来,ARM(最初是Acorn RISC机器,但现在是Advanced RISC机器)一直是现代微处理器和嵌入式
    发表于 09-08 16:14

    相较于x86架构,华为鲲鹏处理器的优势有哪些

    从大型机到 x86 架构,计算的下一个拐点在哪?相较于x86架构,华为鲲鹏处理器的优势有哪些?
    发表于 10-25 06:39

    PCIe设备发出MSI-X中断请求的方法

    x86处理器何处理MSI-X中断请求PCIe设备发出MSI-X
    发表于 02-16 06:36

    中断中断请求撤销

    某个中断请求被响应后,就存在着一个中断请求的撤销问题。下面接中断请求源的类型分别说明中断请求的撤销方法。
    发表于 11-17 15:29 1w次阅读
    <b class='flag-5'>中断</b>源<b class='flag-5'>中断请求</b>撤销

    简述MSIMSI-X中断机制

    中断请求机制,而可以不支持INTx中断消息。 在PCIe总线中,MSIMSI-X中断机制使用存储器写
    的头像 发表于 08-10 17:54 5286次阅读

    x86处理器何处理MSI-X中断请求

    x86处理器何处理MSI-X中断请求PCIe设备发出MSI-X
    发表于 12-17 18:28 9次下载
    <b class='flag-5'>x86</b><b class='flag-5'>处理器</b>如<b class='flag-5'>何处理</b><b class='flag-5'>MSI-X</b><b class='flag-5'>中断请求</b>

    Cortex-M0处理器中断请求形式:电平触发和脉冲输入

    Cortex-M0处理器允许两种形式的中断请求:电平触发和脉冲输入。
    的头像 发表于 05-13 12:05 1341次阅读