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

    文章

    19079

    浏览量

    228727
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10796

    浏览量

    210701
  • APIC
    +关注

    关注

    0

    文章

    4

    浏览量

    7239

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

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

收藏 人收藏

    评论

    相关推荐

    海光国产x86处理器未来可能会在芯国际生产

    海光方面对国产X86处理器一直比较低调,没有透露是哪家晶圆厂生产的,不过这个问题也不算复杂,AMD的第一代Zen处理器使用的是格芯的工艺。因此不难猜测。
    的头像 发表于 06-27 16:13 1.3w次阅读

    国产X86处理器与国际CPU有多大差距?有人做了个测试

    国产处理器何时能够达到世界领先水平?这个问题几乎是每一个关心国产半导体的人都在期待的,尤其是国产的X86处理器
    的头像 发表于 02-04 11:35 7871次阅读

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

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

    政务办公标准配置:兆芯国产X86处理器

    目前,联想开天M6100台式机和昭阳CF03商用笔记本电脑成功入围上海市政采购目录并迈向大规模推广应用,这两款电脑的共同之处在于都采用了具有自主国产芯的兆芯X86通用处理器。那么让人不禁发问,兆芯X86
    发表于 07-27 10:56 2125次阅读

    获Zen架构授权,国产X86处理器即将问世

    国内的处理器厂商在MIPS、ARM及Alpha等架构上搞的还可以,但在桌面市场上,因为Wintel联盟的门槛限制,没有X86处理器是玩不转的。
    发表于 06-12 14:27 1604次阅读

    国产x86处理器已开启生产,或将摆脱对海外的依赖?

    由芯片制造商海光(Hygon)负责制造的中国国产Dhyana(禅定)x86处理器开始启动生产。值得注意的是,这款芯片是根据AMD Zen微架构开发的。AMD将x86的IP授权给中国合作伙伴,Dhyana正是合作的结果。
    发表于 07-09 15:48 1330次阅读

    国产x86处理器发布,该芯片依据AMD Zen微架构开发

    北京时间7月9日上午消息,由芯片制造商海光(Hygon)负责制造的中国国产Dhyana(禅定)x86处理器开始启动生产。
    的头像 发表于 07-13 13:34 4671次阅读

    全球首款集成AI协处理器x86处理器实照公布 采用LGA触点式封装方式

    2019年11月,在通用x86处理器领域沉寂多年的威盛(VIA)高调归来,旗下已有24年历史的处理器研发部门CenTaur开发出了世界上第一个集成AI协处理器
    的头像 发表于 02-19 15:15 2719次阅读

    苹果M1严重威胁x86处理器,关键因素在于钱

    最近一段时间,随着配备M1处理器的Mac电脑上市,大部分人都被M1的性能给震撼了,此前几乎没有人能想到ARM架构性能也可以正面威胁高端x86处理器了。
    的头像 发表于 11-23 10:46 1830次阅读

    简述MSIMSI-X中断机制

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

    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 1615次阅读

    AMD Q4季度移动处理器x86处理器份额已超三成

    AMD 2022年第四季度在包括桌面处理器,移动处理器和服务处理器x86处理器整体市场当中的
    发表于 02-13 10:56 351次阅读

    英特尔x86处理器市占率为68.7%,AMD则上升至31.3%

    虽然英特尔依然稳居x86处理器市场龙头宝座,近年来却被AMD抢走部分市占率。Mercury Research数据显示,去年Q4,英特尔在x86处理器市场的市占率为68.7%,AMD则上
    发表于 02-14 10:28 1208次阅读

    INT8量子化PyTorch x86处理器

    INT8量子化PyTorch x86处理器
    的头像 发表于 08-31 14:27 815次阅读
    INT8量子化PyTorch <b class='flag-5'>x86</b><b class='flag-5'>处理器</b>