当前位置: 首页 > web >正文

PCIe— Legacy PCI

Legacy Model

        该器件通过将其引脚置位到控制器来生成中断。 在较旧的系统中,这个控制 器通常是Intel 8259 PIC,有15个IRQ输入和一个INTR输出。 然后,PIC将断 言INTR以通知CPU一个或多个中断正在挂起。         
        一旦CPU检测到INTR的断言并准备对其采取行动,它必须识别哪个中断实际 上需要服务,这是通过CPU在处理器总线上发出一个特殊的命令来完成的, 称为中断确认。        
        系统将此命令路由到PIC,PIC返回一个称为“中断向量”的8位值,以报告当前 挂起的最高优先级中断。 系统软件会提前为每个IRQ输入编程一个唯一的向量。  
        然后中断处理程序使用该向量作为扩展表(一个由软件设置的区域,包含所有扩展服务扩展行(ISR)的起始地址)的偏移量,并获取它在该位置找到的 ISR起始地址。
        该地址将指向ISR的第一条指令,该指令已被设置为处理此中断。 这个处理 程序将被执行,服务于中断,并告诉它的设备取消断言它的INTx#行,然后 将控制权返回到先前中断的任务 。            

传统中断交付模型(Legacy Interrupt Delivery)核心流程​

​1. 设备触发中断(Device Asserts Interrupt Pin)​
  • ​物理信号​​:PCI设备通过​​电平触发​​方式拉低INTx#引脚(如INTA#)。
  • ​共享线路​​:多个设备共享同一条中断线(Wire-OR连接),如图中PCI Bus上的INTA#信号。
  • ​关键问题​​:
    • 电平保持:设备需维持低电平直至中断被处理,否则中断丢失。
    • 冲突延迟:共享线路需等待所有设备释放信号才能结束中断。
        PIC将断言INTR以通知CPU一个或多个中断正在挂起。
​2. 中断控制器响应(PIC Processes Request)​
       ​信号传递​​:
  • 南桥(South Bridge)接收INTA#信号,转发至中断控制器(PIC)。
  • PIC检测到有效IRQ输入后,拉高​​INTR信号​​通知CPU(步骤②)。
  • ​8259 PIC特性​​:
    • 15级IRQ输入,固定优先级(IRQ0最高,IRQ7最低)。
    • 边沿/电平触发模式可配置(传统PCI强制为​​电平触发​​)。
​3. CPU中断应答(CPU Issues Interrupt Acknowledge)​
  • ​处理器总线操作​​:
    • CPU检测到INTR有效后,通过北桥(North Bridge)发送​​Interrupt Acknowledge命令​​(步骤③)。
    • 该命令本质是特殊总线周期(x86为INTA总线周期)。
  • ​关键约束​​:
    • 中断应答期间CPU暂停执行,直至获取中断向量。
​4. 中断向量获取(PIC Returns Interrupt Vector)​
  • ​向量生成​​:
    • PIC将当前最高优先级IRQ转换为​​8位中断向量号​​(步骤④)。
    • 向量号由BIOS/OS预先编程(如IRQ0=0x08, IRQ1=0x09)。
  • ​硬件交互​​:
    • 向量号通过数据总线返回给CPU(图中Vector路径)。
​5. 中断服务例程执行(ISR Execution)​
  • ​中断表查询​​:
    • CPU以向量号为索引,从​​中断描述符表(IDT)​​ 读取ISR入口地址(步骤④)。
    • x86实模式:中断表为IVT(基址0x0000);保护模式:IDT基址由IDTR寄存器指定。
  • ​ISR处理流程​​:
    1. 保存CPU上下文(寄存器压栈)。
    2. 执行设备服务逻辑(如读取状态寄存器)。
    3. ​清除中断源​​:向设备发送EOI(End of Interrupt)命令。
    4. 恢复上下文并返回(IRET指令)。
        

传统模型的技术缺陷与PCIe改进​

​1. 主要瓶颈​
​问题​​根源​​后果​
​共享冲突​多设备共享INTx#线路延迟不可控,优先级反转
​电平保持依赖​ISR必须手动清除设备中断竞争条件导致中断丢失
​中断风暴风险​故障设备持续拉低INTx#系统死锁
​多核扩展性差​PIC不支持多CPU中断分发SMP系统性能瓶颈
​2. PCIe的兼容性改造​
  • ​虚拟INTx消息​​:
    • Assert_INTx/Deassert_INTx消息包模拟电平变化。
    • 消息路由:设备 → RC(Root Complex) → IO APIC(替代PIC)。
  • ​桥接转换​​:
    • PCIe-to-PCI桥将物理INTx#信号转换为虚拟INTx消息(见图中Bridge角色)。

与传统模型相关的关键硬件​

​组件​​作用​
​8259 PIC​将IRQ转换为向量号,管理15级中断优先级
​南桥(South Bridge)​集成中断控制器,连接低速设备(如PCI总线)
​北桥(North Bridge)​处理CPU与高速组件(内存/显卡)通信,转发中断应答命令
​中断描述符表(IDT)​存储中断向量与ISR入口地址的映射关系(x86架构核心数据结构)

Changes to Support Multiple Processors

        该模型适用于单CPU系统,但有一个限制,使其在多CPU系统中次优。 问题是INTR引脚只能连接到一个CPU。 如果存在多个处理器,那么只有其中一个处理器会看到中断,并且必须为所有中断提供服务,而其他CPU不会看到任何中断。 为了获得最佳性能,这样的系统确实需要在所有处理器上均匀分布系统任务,称为SMP(对称多处理),但引脚模型不支持它。
         为了实现更好的SMP,需要一个新的模型,为此,PIC被修改为IO APIC(高级可编程控制器)。 IO APIC被设计为具有一个单独的小型总线,称为APIC总线,它可以通过该总线传递中断消息,如第799页的图17 - 4所示。 在这个模型中,消息包含中断向量号,所以CPU不需要发送一个中断确认到IO来获取它。APIC 总线连接到处理器内一个新的内部逻辑块,称为本地APIC。 总线在所有代理之间共享,任何代理都可以在总线上发起消息,但就我们的目的而言,是它用于从外围设备发送中断。 这些中断现在可以由软件静态分配,由不同的CPU、多个CPU提供服务,甚至可以由IO APIC动态分配。

Legacy PCI Interrupt Delivery

  PCI设备想使用中断的画,有两种选择。 他们可以使用:

         (1)INTx#可共享的低电平有效信号,在原始规范中定义。

         (2)消息信号中断是作为规范2.2版本加的。MSI无需修改即可在PCIe系统中使用。

Device INTx# Pins

PCI设备最多支持4个INTx#信号(INTA#~INTD#)。因PCI设备可含8个功能(Function),每个功能仅能驱动一个中断引脚。PCI开发时,典型系统采用含15输入的8259 PIC,但许多IRQ已被系统占用(如定时器、键盘),部分预留给ISA卡。故规范仅支持4个中断引脚。然而PCI总线上设备常超4个,单设备内功能也可能超4个需中断,因此PCI中断被设计为​​电平敏感且可共享​​——这些信号可通过线或(wire-ORed)连接。当中断触发时,ISR需遍历共享同引脚的所有功能以确认中断源 

Determining INTx# Pin Support

        PCI function表示支持其配置头中的INTx#信号。 图所示的只读中断引脚寄存器pin-register指示此函数是否支持INTx#,如果支持,则在请求中断时将断言哪个中断引脚.

        图17-5所示的中断线寄存器(Interrupt Line Register)提供驱动所需的下一条信息:该引脚连接至PIC(可编程中断控制器)的输入引脚。系统软件为PIC的每个输入引脚(IRQ)编程分配唯一的中断向量号。当最高优先级中断触发时,PIC向处理器报告该向量号,处理器据此索引中断向量表,获取并执行对应设备的中断服务程序(ISR)。 

        设计人员从器件分配INTx#引脚的路由方式。 它们可以通过多种方式进行路由, 但最终每个INTx#引脚都连接到中断控制器的一个输入端。 第803页的图17 - 6 举例说明了通过可编程路由器将多个PCI设备中断连接到中断控制器的情况。 连接到可编程路由器给定输入端的所有信号将被定向到中断控制器的特定输入端。 其中断被路由到公共中断控制器输入的功能都将具有由平台软件(通常为固件)分配给它们的相同的中断线编号。 在本例中,IRQ 15有三个PCI INTx#输入,来 自连接到它的不同设备。因此,使用这些INTx#线的功能将共享IRQ 15,因此在查询时,所有function都将使控制器发送相同的向量。 该向量将不同功能的三个ISR链接在一起

Associating the INTx# Line to an IRQ Number 

根据系统需求,路由器被编程将其四个输入连接到PIC(可编程中断控制器)的四个可用输入。完成后,每个功能(Function)关联的INTx#引脚路由路径即确定,系统软件将中断线编号(IRQ号)写入每个功能的​​Interrupt Line寄存器​​。该值最终被设备驱动读取,从而知晓其中断在中断向量表中的位置——驱动将ISR(中断服务程序)入口地址写入此位置,此过程称为​​挂接中断​​(hooking the interrupt)。当该功能触发中断时,CPU将接收与Interrupt Line寄存器指定的IRQ对应的向量号,并据此索引中断向量表,获取该功能设备驱动关联的ISR入口地址。

NTx#信号线为​​低电平有效​​的漏极开路(Open-Drain)信号,系统为每条线提供上拉电阻。连接至同一PCI中断请求信号线的多个设备可同时置位(Assert)该信号而不会造成损坏。 

当功能(Function)触发中断时,其配置头状态寄存器(Status Register)中的​​中断状态位(Interrupt Status Bit)​​ 将被置位。系统软件可通过读取该位判断当前是否有中断挂起。 

PCI 2.3规范在配置头命令寄存器(Command Register)中新增​​中断禁用位(Interrupt Disable Bit,Bit 10)​​。复位时该位为0(允许INTx#信号生成),但软件可置1以禁用INTx#。需注意:​​此位对MSI(消息信号中断)无效​​。MSI通过其专属能力结构(MSI Capability Structure)中的命令寄存器启用,且启用MSI会自动禁用INTx引脚或其模拟机制。 

以下是针对PCI规范中​​中断状态位(Interrupt Status Bit)​​ 的技术解析,结合配置空间寄存器机制及中断触发逻辑进行说明:

🔧 ​​一、中断状态位(Interrupt Status Bit)的核心机制​

​1. 功能定义与行为规则​

  • ​位置与属性​​:
    • 位于PCI配置空间​​状态寄存器(Status Register)​​ 的Bit 3(只读)。
    • 当设备有中断挂起(Pending)时,​​硬件自动置位此位​​,软件无法直接写入。
  • ​触发条件​​:
    • 设备内部中断事件(如DMA完成、错误状态)发生时,硬件将Interrupt Status = 1
  • ​与INTx#信号的关联​​:
    • 若​​命令寄存器(Command Register)​​ 的​​中断禁用位(Interrupt Disable, Bit 10)为0​​(即INTx中断启用):
      • Interrupt Status = 1 会​​立即触发INTx#信号​​(拉低电平或发送Assert_INTx消息)。
    • 若中断禁用位为1(INTx中断禁用):
      • Interrupt Status仍会记录中断状态,但​​不会触发INTx#信号​​,中断被静默。这种设计允许驱动在禁用中断时仍能​​通过轮询状态位处理紧急事件​​(如硬件错误)。

​2. 与中断禁用位的独立性​

​寄存器/位​作用范围是否影响状态位
​Status Bit 3​仅记录INTx中断状态❌ 不受任何控制
​Command Bit 10​控制INTx信号触发✅ 决定是否传递中断

🔄 ​​二、与MSI/MSI-X中断的互斥性​

​1. MSI启用时的自动切换​

​行为​INTx模型MSI模型
​中断触发方式​依赖状态位+INTx#信号内存写消息(TLP包)
​状态位影响​✅ 有效❌ 无效(状态位无意义)
​启用MSI的副作用​硬件自动禁用INTx信号独占中断通道

 Virtual INTx Signaling

如果在PCIe拓扑中无法使用MSI,则将使用INTx信令模型。 以下是需要能够使用INTx消息的设备的两个示例:
  • ​PCIe转PCI/PCI-X桥接器​​:多数PCI设备使用INTx#引脚(因MSI对它们为可选功能)。由于PCIe不支持边带中断信号(sideband signaling),需改用​​带内消息(inband messages)​​ 传递中断请求。中断控制器解析该消息并向CPU提交中断请求(含预编程的向量号)。
  • ​引导设备(Boot Devices)​​:PC系统在引导阶段常用传统中断模型,因MSI通常需OS级初始化。引导至少需三个子系统:输出设备(如显卡)、输入设备(如键盘)、操作系统加载设备(如硬盘)。参与系统初始化的PCIe设备称为“引导设备”,它们在OS及驱动加载前使用传统中断支持,之后建议切换至MSI。

Virtual INTx Wire Delivery

         图17 - 9显示了带有PCIe端点和PCI Express到PCI桥的系统。 假设软件没有在端点上启用MSI,它将发送带有INTx消息的中断请求。 在本例中,桥接器通过INTx消息传播来自已连接PCI设备的基于引脚的中断。 可以看出,桥接器发送INTB消息以从PCI总线发出其INTB#输入的断言和解除断言的信号。 PCIe端点使用emulation消息通知INTA。 
 INTx#信令涉及两个消息:
         Assert_INTx消息指示虚拟INTx#信号的高电平到低电平转换(从非活动到活动)。
         Deassert_INTx消息指示低电平到高电平转换。
        当一个function发送Assert_INTx消息时,它也会在配置状态寄存器中设置其初始化状态位,就像它断言物理INTx#引脚时一样.

INTx Message Format

       图17 - 10描述了INTx消息头的格式。 中断控制器是这些消息的最终目的地,但是所采用的路由方法不是“路由到根复合体”,而实际上是“在接收方本地终止”,如图17 - 10所示。 原因有二。 
        第一是因为沿着上游路径的每个桥(包括交换端口和根端口)可以将虚拟中断线路映射到跨桥的不同虚拟中断线路(例如, 交换机端口接收Assert_INTA,但在向上游传播时将其映射到Assert_INTB )。有关INTx映射的更多信息,请参见下面的“INTx映射”。
        第二个原因是由于我们正在模拟基于引脚的信号。如果一个端口接收到一个映射到其主端INTA的断言中断消息,并且由于上一个中断已经向上游发送了一个Assert_INTA消息,那么就没有理由再发送一个。 INTA已经被视为断言。 有关INTx消息折叠的更多信息,请参见第810页的“INTx折 叠”。

Mapping and Collapsing INTx Messages

INTx Mapping

        SWITCH必须遵守PCI规范定义的INTx映射,如表17 - 1所示。 此映射定义了当中断通过PCI到PCI桥路由时存在的虚拟连接。 该映射基于INTx消息类型和device number来自message请求中的Request ID字段 。

         图17 - 11示例。 在两个下游交换机端口上接收到的断言中断消息都是INTA消息。 每个入口端口的虚拟PCI到PCI网桥将两个INTA消息映射到INTA,这意味着没有变化。 这是因为两个始发端点设备的设备号都为零(它包含在中断消息本身中,作为中断器ID ReqID的一部分)。 表17 - 1显示了来自设备0的中断消息映射到网桥另一侧的相同INTx消息(即, 在交换机内部,两个INTA
消息都映射到INTA)。 因此,每个下游端口将向上游传播中断消息,而无需更改其虚拟线路。 但是,传播的中断消息不再具有原始请求者的ReqID,它们现在具有传播中断消息的端口的ReqID。

INTx Collapsing

        PCIe交换机必须确保INTx消息以正确方式向上游传递​​。具体而言,对传统PCI实现的中断路由处理时需满足:软件能判定哪些中断被路由至中断控制器的哪个输入引脚。INTx#信号线可采用​​线或连接(wire-ORed)​​ 方式接入中断控制器的同一IRQ输入引脚。当多个设备在同一中断线上触发中断时,中断控制器仅感知首个断言(assertion)信号;同理,当其中一个设备撤(deassert)其INTx#信号线时,该线将保持断言状态直至最后一个设备撤销中断。​​这些原则同样适用于PCIe的INTx消息机制​​。

​        但在某些场景下,两个重叠的INTx消息可能被出口端口的虚拟PCI桥映射为同一INTx消息,需要折叠这些消息​​。以图17-12为例:当上游交换机端口为中断消息映射传输路径时,两个下游交换机端口的中断消息(基于其设备号)均被映射为INTB。由于这两个重叠消息类型相同,必须进行折叠。

​        折叠机制确保中断控制器永远不会为共享中断接收到连续的Assert_INTx或Deassert_INTx消息​​,这与INTx信号采用线或连接的行为等效。

折叠机制的必要性​

  • ​避免中断控制器状态冲突​​:

    • 若连续发送Assert_INTB → 中断控制器误判为多次独立中断请求

    • 若过早发送Deassert_INTB → 中断提前终止,遗漏未处理设备

  • ​与物理线或一致性​​:
    折叠机制确保虚拟INTx信号行为完全匹配物理共享中断线的电平特性,保持与传统驱动兼容性​

​机制​

​实现目标​

​硬件要求​

​线或模拟​

兼容共享IRQ的物理PCI中断行为

交换机维护虚拟INTx状态寄存器

​动态映射​

支持多级拓扑下的中断信号重组

端口内置设备号-INTx映射表

​消息折叠​

防止冗余中断消息,确保电平语义

丢弃同类型连续Assert/Deassert消息

INTx Delivery Rules

​关键规则​​:

  1. ​Assert_INTx与Deassert_INTx仅向上游方向发送​
  2. ​交换机仅在中断状态变化时才向上游发送INTx消息​
  3. ​链路两端设备必须跟踪INTA-INTD的当前置位状态​
  4. ​交换机需独立跟踪每个下游端口的四个虚拟信号线状态,并在上游端口呈现折叠后的状态集合​
  5. ​根复合体必须为每个下游端口跟踪四个虚拟信号线(A-D)状态​
  6. ​可通过命令寄存器(Command Register)的中断禁用位(Interrupt Disable bit)关闭INTx信令​
  7. ​若存在活跃的INTx虚拟信号线时禁用中断,必须发送对应的Deassert_INTx消息​
  8. ​若下游交换机端口进入DL_Down状态,所有活跃的INTx虚拟信号线必须解除置位,并向上游端口发送Deassert_INTx消息更新状态​

NOTE:

1. ​​单向传输与状态跟踪机制​

  • ​仅上游传输​​:
    INTx消息(Assert/Deassert)​​仅允许从下游设备向上游根复合体传递​​,禁止反向或同级传输。

  • ​链路级状态同步​​:
    每个PCIe链路两端设备(如设备与交换机端口)需维护​​虚拟INTx信号线状态寄存器​​(如INTA_Status),确保电平行为与物理PCI信号一致。

2. ​​交换机的折叠处理(Collapsing)​

  • ​状态变化触发​​:
    交换机仅当检测到下游端口虚拟信号线状态​​从非活跃→活跃(Assert)或活跃→非活跃(Deassert)时​​,才向上游转发消息。

  • ​多设备信号合并​​:
    多个下游设备共享同一INTx类型时(如设备号1和5均触发INTA),交换机将其​​折叠为单次Assert/Deassert消息​​,模拟PCI的线或(Wire-OR)行为。

    示例:下游两个设备同时Assert_INTA → 交换机仅向上游发送一次Assert_INTA,直至所有设备解除后才发Deassert。

3. ​​根复合体的职责​

  • ​端口级状态管理​​:
    根复合体需为每个下游端口维护​​独立的INTx状态表​​,映射到系统中断控制器(如APIC)。

  • ​中断资源映射​​:
    根据BIOS/ACPI表将虚拟INTx信号(如INTA)转换为物理IRQ,供操作系统处理。

4. ​​中断禁用与异常处理​

  • ​强制解除机制​​:
    若启用命令寄存器的​​Interrupt Disable bit​​(偏移04h位10),需立即发送Deassert_INTx消息解除所有活跃中断。

  • ​链路失效响应​​:
    下游端口进入​​DL_Down状态​​(链路训练失败)时,交换机自动解除其关联的INTx状态,并向上游发送Deassert消息。


📊 ​​三、规则总结​

​规则​

​硬件行为​

​设计目的​

​单向传输​

仅允许Assert/Deassert向上游传递

避免环路,确保路径唯一性

​状态折叠​

交换机过滤冗余状态变化消息

模拟电平触发,减少总线负载

​根复合体跟踪​

独立维护每端口INTx状态

精准映射系统中断资源

​中断禁用强制解除​

禁用时立即发送Deassert

防止残留中断请求干扰系统

​DL_Down状态处理​

自动解除关联INTx并更新上游

确保中断状态与物理链路同步

⚠️ ​​四、设计注意事项​

  1. ​与MSI的互斥性​​:
    启用MSI/MSI-X时,​​INTx自动失效​​(配置空间Command Register的Interrupt Disable位强制置1)。

  2. ​虚拟信号线映射​​:
    交换机需按​​设备号(Device Number)​​ 转换INTx类型(如设备号1的INTA→上游INTB)。

  3. ​驱动兼容性​​:
    传统PCI驱动依赖INTx,需确保在引导阶段(MSI未初始化时)正确处理Assert/Deassert消息。

​核心结论​​:INTx消息规则通过​​状态跟踪+折叠转发+强制解除​​三重机制,在无物理信号线的PCIe架构中精准复现PCI中断语义,为传统设备提供无缝兼容,但高性能场景应优先选用MSI/MSI-X。

http://www.xdnf.cn/news/10197.html

相关文章:

  • STL_stack和queue(deque priority_queue)
  • 第8讲、Odoo 18 ORM 深度解析
  • AI数字人系统开发——引领未来智能交互潮流
  • C++面试题:Linux系统信号详解
  • Postgre数据库分区生产实战
  • Obsidian 社区插件下载修复
  • 随笔20250530 C# 整合 IC卡读写技术解析与实现
  • LangChain表达式(LCEL)实操案例1
  • C++智能指针介绍和区别(std::unique_ptr、std::shared_ptr 和 std::weak_ptr)
  • 004时装购物系统技术解析:构建智能时尚消费平台
  • PRECICE 工具介绍与使用示例
  • 7.atlas安装
  • 5.30 打卡
  • 【计算机网络】fork()+exec()创建新进程(僵尸进程及孤儿进程)
  • Day40
  • RFID赋能零件智能夹取新生态
  • 深度学习全面掌握指南
  • CMP401GSZ-REEL混合电压接口中的23ns延迟与±6V输入范围设计实现
  • 【Zephyr 系列 2】用 Zephyr 玩转 Arduino UNO / MEGA,实现串口通信与 CLI 命令交互
  • Vue 项目命名规范指南
  • 操作系统原理第9章 磁盘存储器管理 重点内容
  • JAVA:抽象类和接口
  • AI书签管理工具开发全记录(五):后端服务搭建与API实现
  • OSG编译wasm尝试
  • PostgreSQL部署
  • PyCharm接入DeepSeek,实现高效AI编程
  • Python中函数知识详解和示例
  • 正则化-深度学习
  • 2011肠衣问题
  • 视频压制(Video Encoding/Compression)