一种中断处理方法及中断处理装置转让专利

申请号 : CN201711462037.6

文献号 : CN109977061B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 徐阳

申请人 : 中兴通讯股份有限公司

摘要 :

本申请公开了一种中断处理方法及中断处理装置,包括:中央处理器对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容;中央处理器将字节序调整后的值写入MSI机制寄存器以触发中断。其中,预处理地址是PCIE总线地址;预处理地址对应的硬件,用于检查到自身被修改,调用软件方式对字节序进行调整。本申请通过将信息地址寄存器中配置的目标地址更换为特殊的地址,巧妙地产生了一个针对当前中断的预处理过程,而在这个预处理过程中,通过软件处理的方式简单地实现了对中断报文字节序不兼容问题的调整,保证了从设备与中央处理器字节序兼容,从而确保了中断的正确触发。

权利要求 :

1.一种中断处理方法,包括:

中央处理器对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容;

中央处理器将字节序调整后的值写入信息信号中断MSI机制寄存器以触发中断;

其中,预处理地址是快速外围组件互连PCIE总线地址;预处理地址对应的硬件用于检查到自身被修改,调用软件方式对字节序进行调整;

所述预处理地址满足以下情况:

从设备驱动在注册中断时,将从设备上的信息地址寄存器配置为指向预先指定的预处理地址;

从设备有中断产生时,对信息地址寄存器指向的预处理地址对应的硬件进行写操作。

2.根据权利要求1所述的中断处理方法,其中,在所述中央处理器所在系统初始化时,确定出PCIE总线地址作为所述预处理地址;

所述PCIE总线地址为:

在所述中央处理器所在系统上申请的一段内存在PCIE总线上的映射地址;

或者,没有被使用的PCIE总线地址。

3.根据权利要求1或2所述的中断处理方法,其中,所述预处理地址为所述中央处理器所在系统上一段内存在PCIE总线上的映射地址;所述方法还包括:所述内存设置为被硬件断点监控;

所述中央处理器对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容,包括:当所述预处理地址被写入时,触发硬件断点异常处理;

在硬件断点异常处理过程中,对写入所述预处理地址对应的硬件的值进行字节序转换处理,使得小端字节序调整为大端字节序;

退出硬件断点异常处理过程。

4.根据权利要求1或2所述的中断处理方法,其中,所述预处理地址为没有被使用的PCIE总线地址;

所述中央处理器对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容,包括:当所述预处理地址被写入时,触发PCIE错误中断处理;

在PCIE错误中断处理过程中,对写入所述预处理地址对应的硬件的值进行字节序转换处理,使得小端字节序调整为大端字节序;

退出PCIE错误中断处理过程。

5.根据权利要求1或2所述的中断处理方法,其中,所述MSI机制寄存器为:MSIIR寄存器,或者与MSIIR寄存器具有相同功能的寄存器;

所述中断为信息信号中断或扩展信息信号中断。

6.一种计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令用于执行上述权利要求1 权利要求5任一项所述的中断处理方法。

~

7.一种媒体传输装置,包括处理器、存储器以及存储在存储器上可在处理器上运行的计算机程序:对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容,将字节序调整后的值写入MSI机制寄存器以触发中断;其中,预处理地址是快速外围组件互连PCIE总线地址;预处理地址对应的硬件用于检查到自身被修改,调用软件方式对字节序进行调整;所述预处理地址满足以下情况:从设备驱动在注册中断时,将从设备上的信息地址寄存器配置为指向预先指定的预处理地址;

从设备有中断产生时,对信息地址寄存器指向的预处理地址对应的硬件进行写操作。

8.一种中断处理方法,包括:

从设备驱动在注册中断时,将从设备上的信息地址寄存器配置为指向预先指定的预处理地址;

从设备有中断产生时,对信息地址寄存器指向的预处理地址对应的硬件进行写操作,以使中央处理器对写入预处理地址对应的硬件的值进行字节序调整,使得所述从设备与所述中央处理器字节序兼容;

其中,预处理地址是PCIE总线地址;预处理地址对应的硬件用于检查到自身被修改,调用软件方式对字节序进行调整。

9.根据权利要求8所述的中断处理方法,其中,所述预处理地址为PCIE总线地址,包括:在中央处理器所在系统上申请的一段内存在PCIE总线上的映射地址,并且所述内存设置为被硬件断点监控;

或者,没有被使用的PCIE总线地址。

10.根据权利要求8或9所述的中断处理方法,其中,所述从设备为PCIE设备。

11.一种中断处理装置,包括:预处理模块、中断处理模块;其中,预处理模块,用于对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容;

中断处理模块,用于将字节序调整后的值写入MSI机制寄存器以触发中断;

其中,预处理地址是PCIE总线地址;预处理地址对应的硬件用于检查到自身被修改,调用软件方式对字节序进行调整;

所述预处理地址满足以下情况:

从设备驱动在注册中断时,将从设备上的信息地址寄存器配置为指向预先指定的预处理地址;

从设备有中断产生时,对信息地址寄存器指向的预处理地址对应的硬件进行写操作。

12.根据权利要求11所述的中断处理装置,其中,当所述预处理地址为所述中断处理装置所在系统上一段内存在PCIE总线上的映射地址时;

所述预处理模块具体用于:

将所述内存设置为被硬件断点监控;当所述预处理地址被写入时,触发硬件断点异常处理;在硬件断点异常处理过程中,对写入所述预处理地址对应的硬件的值进行字节序转换处理,使得小端字节序调整为大端字节序;退出硬件断点异常处理过程;

或者,

当所述预处理地址为没有被使用的PCIE总线地址时;

所述预处理模块具体用于:

当所述预处理地址被写入时,触发PCIE错误中断处理;在PCIE错误中断处理过程中,对写入所述预处理地址对应的硬件的值进行字节序转换处理,使得小端字节序调整为大端字节序;退出PCIE错误中断处理过程。

说明书 :

一种中断处理方法及中断处理装置

技术领域

[0001] 本申请涉及但不限于计算机技术,尤指一种中断处理方法及中断处理装置。

背景技术

[0002] 快速外围组件互连(PCIE,Peripheral Component Interconnect Express)总线是一种在计算机系统广泛采用的高速串行总线,用于连接中央处理器(CPU,Central Processing Unit)和其他高性能芯片如网卡、显卡、以太网交换芯片等。中央处理器这一侧含有的PCIE控制器是主控制器,中央处理器外部的PCIE设备是从设备。
[0003] PCIE标准定义了用于数据传送的三大类事务,分别是:存储器读写事务、输入/输出(I/O)读写事务、配置空间读写事务。其中,I/O读写事务已经过时,主流PCIE设备不再使用。配置空间读写事务主要在设备初始化阶段使用。在PCIE总线运行时,传送的绝大部分总线事务都是存储器读写事务。PCIE总线的存储器读写事务能向目标存储器地址(也即PCIE总线地址)进行读写。
[0004] PCIE总线支持全双工,因此,中央处理器(即PCIE主控制器)和下挂的PCIE设备(即从设备)都可以主动发起存储器读写事务。PCIE设备可以主动向中央处理器下挂的双倍速率(DDR,Double Date Rate)内存进行读写,或者,PCIE设备可以主动读写中央处理器的寄存器。只要知道了目标DDR内存的PCIE总线地址,或者中央处理器内部寄存器的PCIE总线地址,就能发起PCIE存储器读写事务对目标进行读写操作。
[0005] 系统软件可以将中央处理器下挂的DDR内存、中央处理器的寄存器、以及PCIE设备上的寄存器均转化成唯一的PCIE总线地址。当中央处理器或者PCIE设备发起存储器读写事务时,被读写的PCIE总线地址对应的设备会自动响应。比如:将中央处理器下挂的DDR内存上的一片空间映射到PCIE总线上,假设配置这片内存的地址为PCIE总线地址A,那么,PCIE设备上的直接内存访问(DMA,Direct Memory Access)控制器就能主动发起存储器读写事务,请求对PCIE总线地址A进行读写操作;而中央处理器会自动响应外部设备对PCIE总线地址A的读写操作,无需软件参与DDR内存的读写,这样,外部PCIE设备就能直接把数据写入地址为PCIE总线地址A的DDR,或者直接从地址为PCIE总线地址A的DDR上读取数据。
[0006] 将PCIE设备上的寄存器转换成PCIE总线地址,按照PICE标准,是通过配置PICE设备上配置空间的6个基本寄存器(BAR,Base Address Register)来实现。而将中央处理器下挂的DDR、中央处理器的寄存器转化成PCIE总线地址,则是中央处理器厂家各自实现的,并不通用。比如:NXP公司(原飞思卡尔半导体)生产的PowerPC系列中央处理器,使用PCI Express Inbound地址传输和映射单元(ATMU,Address Translation and Mapping Unit)Registers将中央处理器内部的寄存器和中央处理器下挂的DDR内存映射到PCIE总线上。系统软件开发人员会在制作板级支持包(BSP,Board Support Package)时,规划整个单板的PCIE总线地址的分配,以确保PCIE总线地址的分配不会冲突。这种配置方法对于特定的中央处理器也是固定的。比如:对于PowerPC处理器就是通过设备树源码(DTS,Device Tree Source)文件和PCI Express Inbound ATMU Registers的配置来实现的。
[0007] 在PCIE总线上,PCIE设备向中央处理器上报中断的主流方式是采用信息信号中断(MSI,Message Signaled Interrupt)或扩展信息信号中断(MSI‑X,Message signaled interrupt extended)机制。这种中断上报原理就是:外部PCIE设备发起存储器写事务,主动去写中央处理器内部的一个寄存器;通过写这个中央处理器内部的寄存器,能让中央处理器知道PCIE设备上报了中断。写入不同的值,代表不同的MSI中断号或MSI‑X中断号。这样,中央处理器就能触发中断处理流程。MSI‑X是MSI的增强版,两者的原理是相同的,主要区别在于:MSI只配置一组信息地址(Message Address)寄存器和信息数据(Message Data)寄存器,上报一个中断号;MSI‑X可以配置多组Message Address寄存器和Message Data寄存器,可以支持多个中断号。MSI‑X和MSI的区别并不影响本申请的应用。Message Address寄存器和Message Data寄存器是一组一组关联的。一组Message Address寄存器和Message Data寄存器,对应一个MSI中断/MSI‑X中断。
[0008] PCIE总线是因特尔公司主导发展的,主流的PCIE设备都首先支持X86架构(The X86architecture),X86架构采用小端(Little‑Endian)字节序。所以PCIE设备对小端字节序CPU的支持都是必须实现的。但是,由于目前大端处理器总的市场占有率较低,部分制造PCIE设备的芯片厂商会疏于考虑对大端(Big‑Endian)字节序CPU的支持。其中,Little‑Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端;Big‑Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
[0009] 在数据通讯领域,大端字节序CPU却有较广泛的市场应用。,比如:PowerPC(Performance Optimization With Enhanced RISC,也简称PPC)是一种精简指令集(RISC)架构的CPU,以及基于高级精简指令集机器(ARM,Advanced RISC Machine)架构的QorIQ Layerscape处理器等。这类大端字节序CPU在搭配一些厂商的PCIE设备时,就可能遇到字节序不兼容的问题,从而无法支持MSI/MSI‑X报文。

发明内容

[0010] 为了解决上述技术问题,本申请提供一种中断处理方法及中断处理装置,能够解决中断报文字节序不兼容的问题。
[0011] 为了达到本发明目的,本申请提供了一种中断处理方法,包括:
[0012] 中央处理器对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容;
[0013] 中央处理器将字节序调整后的值写入信息信号中断MSI机制寄存器以触发中断;
[0014] 其中,预处理地址是快速外围组件互连PCIE总线地址;预处理地址对应的硬件用于检查到自身被修改,调用软件方式对字节序进行调整。
[0015] 本申请还提供了一种计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令用于执行上述任一项所述的中断处理方法。
[0016] 本申请又提供了一种媒体传输装置,包括处理器、存储器以及存储在存储器上可在处理器上运行的计算机程序:对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容,将字节序调整后的值写入MSI机制寄存器以触发中断;其中,预处理地址是快速外围组件互连PCIE总线地址;预处理地址对应的硬件用于检查到自身被修改,调用软件方式对字节序进行调整。
[0017] 本申请再提供了一种中断处理方法,包括:
[0018] 从设备驱动在注册中断时,将从设备上的信息地址寄存器配置为指向预先指定的预处理地址;
[0019] 从设备有中断产生时,对信息地址寄存器指向的预处理地址对应的硬件进行写操作;
[0020] 其中,预处理地址是PCIE总线地址;预处理地址对应的硬件用于检查到自身被修改,调用软件方式对字节序进行调整。
[0021] 本申请还提供了一种中断处理装置,包括:预处理模块、中断处理模块;其中,[0022] 预处理模块,用于对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容;
[0023] 中断处理模块,用于将字节序调整后的值写入MSI机制寄存器以触发中断;
[0024] 其中,预处理地址是PCIE总线地址;预处理地址对应的硬件用于检查到自身被修改,调用软件方式对字节序进行调整。
[0025] 本申请技术方案至少包括:中央处理器对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容;中央处理器将字节序调整后的值写入MSI机制寄存器以触发中断。其中,预处理地址是PCIE总线地址,预处理地址对应的硬件,用于检查到自身被修改,调用软件方式对字节序进行调整。本申请通过将信息地址寄存器中配置的目标地址更换为特殊的地址,巧妙地产生了一个针对当前中断的预处理过程,而在这个预处理过程中,通过软件处理的方式简单地实现了对字节序不兼容问题的调整,保证了从设备与中央处理器字节序兼容,从而确保了中断的正确触发。
[0026] 本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

附图说明

[0027] 附图用来提供对本申请技术方案的进一步理解,并且构成说明书的一部分,与本申请的实施例一起用于解释本申请的技术方案,并不构成对本申请技术方案的限制。
[0028] 图1为相关技术中中断上报和处理的示意图;
[0029] 图2为本申请中断处理方法的实施例流程示意图;
[0030] 图3为本申请中断处理装置的实施例的组成示意图;
[0031] 图4为本申请中断处理方法第一实施例的处理示意图;
[0032] 图5为本申请中断处理方法第二实施例的处理示意图;
[0033] 图6为本申请中断处理方法第三实施例的处理示意图。

具体实施方式

[0034] 为使本申请的目的、技术方案和优点更加清楚明白,下文中将结合附图对本申请的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
[0035] 图1为相关技术中中断上报和处理的示意图,以Linux操作系统为例,如图1所示,对MSI/MSI‑X中断的支持大致可以包括:
[0036] 首先,PCIE设备驱动初始化时,调用pci_enable_msi接口或pci_enable_msix接口,申请MSI/MSI‑X中断号。驱动程序会配置PCIE设备上的配置空间中MSI/MSI‑X能力(Capability)结构中的Message Address寄存器和Message Data寄存器。其中,向Message Address寄存器写入的值,对于PowerPC处理器是处理器内部的MSI机制寄存器(MSIIR,Shared message signaled interrupt index register)映射在PCIE总线上的地址;向Message Data寄存器写入的值,是根据当前PCIE设备驱动申请到的MSI中断号计算出来的值。
[0037] 之后,在PCIE设备需要上报MSI/MSI‑X中断时,会向中央处理器发送一个MSI/MSI‑X中断报文,也就是一个存储器写操作,操作的结果是:向Message Address寄存器中配置的目标地址,写入Message Data寄存器中的值。
[0038] 最后,中央处理器收到这个MSI/MSI‑X中断报文,等效于向中央处理器的特定寄存器如对于PowerPC是MSIIR寄存器,写入了Message Data寄存器中的值。而向MSIIR寄存器的写入操作,就会触发中央处理器的中断控制器进入中断处理流程,即根据MSIIR寄存器被写入的值,执行对应的中断服务程序。这样就完成了一次中断事务上报和处理。
[0039] 关于MSI/MSI‑X Capability结构的定义可以参见相关协议标准,这里不再赘述,其中的Message Data寄存器宽度都是16比特(Bits)的。
[0040] 从图1所示的中断处理过程中可见,PCIE设备上的Message Data寄存器中的值会写入到中央处理器的MSIIR寄存器中,因此,对Message Data寄存器进行初始化配置,要结合中央处理器的MSIIR寄存器的定义,再根据PCIE设备申请到的中断号才能计算出来。只有向中央处理器的MSIIR寄存器写入正确的值,才能让中央处理器触发正确的中断号。比如:PowerPC处理器能处理256个不同的MSI中断,会将这些中断分成8组,每组32个,并在MSIIR寄存器中,采用SRS字段指示是0‑7组中的哪一组,采用IBS字段指示是组内0‑31个中断中的哪一个中断。需要说明的是,MSIIR寄存器按照标准情况是提供给外部PCIE设备来写的,不过中央处理器上的软件也可以主动写这个寄存器。效果同外部PCIE设备使用MSI/MSI‑X报文写这个寄存器是一样的。
[0041] 标准的PCIE MSI/MSI‑X中断处理,从PCIE设备发出中断报文,到中央处理器产生中断,都是硬件自动完成的,软件不用参与也不能参与。因此,如果MSI/MSI‑X报文中要写的数据本身字节序不兼容,那么,只能向中央处理器的MSIIR寄存器的保留(Reserved)部分写入数据,换句话说,此时MSIIR寄存器是不能被写入有意义的信息的,而中央处理器也是不能产生正确的中断的。
[0042] 面对这样的问题,相关技术中的处理是:既然软件不能参与MSI/MSI‑X终端报文的识别,也就不能用软件的方法来解决字节序不兼容的问题。在硬件本身不能调整MSI/MSI‑X中断报文中要写的数据的字节序时,只能修改芯片方案来规避,即要么更换中央处理器芯片,要么更换PCIE设备芯片,以求兼容。但是,更换芯片方案会带来不能兼容原有产品的代码的问题,也增加了采购成本和开发周期。要是在开发过程中才发现存在字节不兼容的问题,再想更换芯片的话,会造成更严重的损失。
[0043] 本申请发明人通过将信息地址寄存器中配置的目标地址更换为特殊的地址,巧妙地产生一个针对当前中断的预处理过程,而在这个预处理过程中,能够通过软件处理的方式简单地实现对中断报文字节序不兼容问题的调整,从而向信息地址寄存器的目标地址指向的寄存器(如MSIIR寄存器或者与MSIIR寄存器具有相同功能的寄存器)写入正确的信息,最终正确触发中断如MSI/MSI‑X中断。
[0044] 图2为本申请中断处理方法的实施例流程示意图,对于中央处理器与从设备存在字节序不兼容问题的情况,如图2所示,
[0045] 对于从设备侧,包括:
[0046] 步骤2001:从设备驱动在注册中断时,将从设备上的信息地址寄存器配置为指向预先指定的预处理地址。
[0047] 其中,预处理地址是PCIE总线地址,预处理地址对应的硬件,用于检查到自身被修改,调用软件方式对字节序进行调整。
[0048] 可选地,从设备可以是PCIE设备。
[0049] 可选地,中断可以是如MSI中断,或MSI‑X中断。
[0050] 步骤2011:从设备有中断产生时,对信息地址寄存器指向的预处理地址对应的硬件进行写操作。
[0051] 本申请提供的中断处理方法,将Message Address寄存器指向PCIE总线地址,使得上报的中断报文不再直接写入中央处理器的MSIIR寄存器,而是写到PCIE总线地址上,从而触发中央处理器的预处理过程,而不是直接进入MSIIR中断处理。
[0052] 对于中央处理器侧,包括:
[0053] 步骤2002:中央处理器对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容。
[0054] 可选地,本步骤之前还包括:申请所述预处理地址。
[0055] 可选地,可以在中央处理器所在系统初始化时,确定出PCIE总线地址作为预处理地址。
[0056] 可选地,预处理地址是一个PCIE总线地址,比如:在中央处理器所在系统上申请一段专用的内存,计算出这些内存在PCIE总线上的映射地址作为预处理地址,并且这段内存设置为被硬件断点监控;再如:预处理地址为没有被使用的PCIE总线地址。预处理地址属于PCIE总线地址。又如:在中央处理器上申请1024字节内存并映射到PCIE总线得到PCIE总线地址PA(也称第一PCIE总线地址),将申请到的中断号如MSI/MSI‑X中断号乘以4,再加上得到的PCIE总线地址PA得到的PCIE总线地址Pan(也称第二PCIE总线地址)作为预处理地址,而对应预处理地址的内存的每一个字节采用初始值0xff填充。
[0057] 当预处理地址为一个没有被使用的PCIE总线地址时,由于相关技术中系统软件开发人员在制作BSP时,会对整个硬件单板的PCIE总线地址做一个整体的分配。因此,是很清楚哪些硬件资源会被映射到PCIE总线上,以及这些硬件资源对应的PCIE总线地址范围是多少。也就是说,对于本领域人员来讲,要想获知哪些PCIE总线地址范围是没有被使用的是容易实现的。
[0058] 可选地,步骤2002的具体实现包括:
[0059] 首先,触发进入预处理过程:
[0060] 如果预处理地址是中央处理器所在系统上一段内存在PCIE总线上的映射地址,那么,当该预处理地址被写入时,会触发硬件断点异常处理以进入预处理过程;
[0061] 如果预处理地址为没有被使用的PCIE总线地址,那么,当该预处理地址被写入时,会触发PCIE错误中断处理以进入预处理过程;
[0062] 如果预处理地址为PCIE总线地址PAn,中央处理器会对该预处理地址对应的1024字节内存,以4字节为单位,依次递增进行轮询(一共需要检查256次,每次检查的4个字节),当检测出这段内存中的值不是初始值0xffffffff,则意味着该段内存被修改了,进入预处理过程。
[0063] 然后,在硬件断点异常处理或PCIE错误中断处理或循环处理过程中,对写入预处理地址对应的硬件的值进行字节序转换处理,使得小端字节序调整为大端字节序;其中,字节序转换的具体如何实现并不用于限定本申请的保护范围。
[0064] 最后,退出硬件断点异常处理或PCIE错误中断处理或轮询处理过程。
[0065] 步骤2012:中央处理器将字节序调整后的值写入MSI机制寄存器以触发中断。
[0066] 本申请提供的中断处理方法,通过将信息地址寄存器中配置的目标地址更换为特殊的地址,巧妙地产生了一个针对当前中断的预处理过程,而在这个预处理过程中,通过软件处理的方式简单地实现了对中断报文字节序不兼容问题的调整,保证了从设备与中央处理器字节序兼容,从而确保了向寄存器如MSIIR寄存器或者与MSIIR寄存器具有相同功能的寄存器写入正确的信息,最终正确触发了中断如MSI/MSI‑X中断。
[0067] 需要强调的是,本申请上述MSIIR寄存器存在于如PowerPC处理器、基于ARM架构的QorIQ Layerscape处理器等中。本申请提供的中断处理方法适用于但不限于PowerPC处理器、QorIQ Layerscape处理器等,只要含有MSIIR寄存器或者与MSIIR寄存器具有相同功能的寄存器均可使用,而这个寄存器也就是Message Address寄存器的默认目标地址指向的寄存器。
[0068] 本发明实施例还提供一种计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令用于执行上述任一项所述的中断处理方法。
[0069] 本发明实施例还提供一种实现中断处理的装置,包括处理器、存储器以及存储在存储器上可在处理器上运行的计算机程序:对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容,将字节序调整后的值写入MSI机制寄存器以触发中断。
[0070] 本申请还提供一种中断处理装置,至少包括:预处理模块、中断处理模块;其中,[0071] 预处理模块,用于对写入预处理地址对应的硬件的值进行字节序调整,使得从设备与中央处理器字节序兼容;
[0072] 中断处理模块,用于将字节序调整后的值写入MSI机制寄存器以触发中断。
[0073] 可选地,预处理模块具体用于:
[0074] 预处理地址是所述中断处理装置所在系统上一段内存在PCIE总线上的映射地址;当该预处理地址被写入时,触发硬件断点异常处理以进入预处理过程;或者,预处理地址为没有被使用的PCIE总线地址;当该预处理地址被写入时,触发PCIE错误中断处理以进入预处理过程;或者,预处理地址为PCIE总线地址PAn,会对该预处理地址对应的1024字节内存,以4字节为单位,依次递增进行轮询(一共需要检查256次,每次检查的4个字节),当检测出这段内存中的值不是初始值0xffffffff时,意味着该段内存被修改了,进入预处理过程;
[0075] 在预处理过程中,对写入预处理地址对应的硬件的值进行字节序转换处理,使得小端字节序调整为大端字节序;
[0076] 退出硬件断点异常处理或PCIE错误中断处理或轮询处理过程。
[0077] 下面结合具体实施例对本发明方法进行详细描述。
[0078] 以下实施例中以中断为MSI/MSI‑X中断、Message Address寄存器的目的地址对应的寄存器为MSIIR寄存器为例进行描述。
[0079] 第一实施例,利用硬件断点实现对MSI/MSI‑X中断报文的调整。硬件断点是中央处理器提供的调试机制,可以在特定的内存地址发生修改时产生异常。第一实施例中使用硬件断点来监控MSI/MSI‑X中断报文。
[0080] 第一实施例中,在PCIE设备驱动初始化时,修改Message Address寄存器的配置,使其指向被硬件断点监控的内存地址即预处理地址。这样,PCIE设备上报的MSI/MSI‑X中断报文会触发硬件断点异常;而在硬件断点异常处理过程中,通过如预先设置的异常处理函数,则能够对写入预处理地址对应的内存的值调整字节序后再写入MSIIR寄存器。图4为本申请中断处理方法第一实施例的处理示意图,如图4所示,具体包括:
[0081] 系统初始化时,假设申请一页内存并映射到PCIE总线上。以Linux操作系统为例,在Linux操作系统上有固定的一致性直接存储器访问(DMA,Direct Memory Access)和流式DMA接口,可以使用pci_alloc_consistent接口、pci_map_single接口来申请上述内存,而且,通过这些接口就能得到对应申请到的内存的PCIE总线地址。
[0082] 通过linux系统提供的hw_breakpoint_add接口,注册对申请到的上述内存的写操作监控。具体实现只需要注册一个硬件断点即可。一个硬件断点只能监控32位的数据,也就是监控PCIE总线地址对应的最开始4字节内存。
[0083] 当有与中央处理器不兼容的PCIE设备驱动在注册MSI/MSI‑X中断时,将该PCIE设备的所有Message Address寄存器重新配置为指向申请到的PCIE总线地址。
[0084] 通过linux的hw_breakpoint_exceptions_notify接口的开始位置判断出是被监控断点如图4中的断点A,检查被硬件断点监控的地址被写入的值V1,即触发硬件断点异常处理过程,将值V1重新调整为字节序正确的值V2,然后再写入MSIIR寄存器,并退出断点异常状态。
[0085] 通过第一实施例的处理,与中央处理器不兼容的PCIE设备上报的MSI/MSI‑X中断报文会触发硬件断点的异常处理接口,而在硬件断点的异常处理接口中,会对不兼容的字节序进行纠正以使其与中央处理器的字节序一致,保证了将正确字节序的值填入MSIIR寄存器,最终正确实现了中断号上报。
[0086] 第二实施例,利用中央处理器的PCIE错误检测中断来快速响应对MSI/MSI‑X中断报文的调整。
[0087] 以NXP公司(原飞思卡尔半导体)生产的处理器中的PCIE控制器为例,无论是PowerPC处理器,还是基于ARM架构的QorIQ Layerscape处理器,都会提供PCIE标准之外的PCIE错误检测机制,即当PCIE总线上发生错误时,能产生中断通知中央处理器,并记录引起错误的报文的信息。比如:对于PCIE总线上的存储器读写事务,如果访问的目标PCIE总线地址是没有被使用的,即没有任何设备响应这个读写请求的情况,那么,就会产生PCI互连无映射(PCI Express no map)错误,则向中央处理器上报PCIE错误中断;同时,PCIE错误抓取寄存器(PCI Express error capture register)会记录下错误报文的详细信息。从这些寄存器捕获的错误信息中能够分析出引起PCI Express no map错误对应的目标PCIE总线地址。
[0088] 第二实施例中,在PCIE设备驱动初始化时,修改Message Address寄存器的配置,使其指向没有被使用的PCIE总线地址即无效的PCIE总线地址,且地址的低16位是Message Data寄存器中的有效值。这样,由于目标地址是错误的,PCIE设备上报MSI/MSI‑X中断报文时,中央处理器会捕获这个PCI Express no map错误,从而产生PCIE错误中断;而在PCIE错误中断处理过程中,如通过预先设置的PCIE错误中断处理函数,会分析导致错误的PCIE总线地址,对从地址的低16位得到的值进行字节序调整后得到正确的值后再写入MSIIR寄存器。图5为本申请中断处理方法第二实施例的处理示意图,如图5所示,具体包括:
[0089] 选择没有被任何设备映射的,没有被使用的PCIE总线地址段。如果要求这个PCIE总线地址段的起始PCIE总线地址的最低16位全部是0,且从该起始PCIE总线地址开始,长度128KB的这一片PCIE总线空间都是没有被使用的。起始PCIE总线地址可以是32位宽,也可以是64位宽,与当前PCIE设备使用的PCIE总线标准相符即可。
[0090] 当有与中央处理器不兼容的PCIE设备驱动在注册MSI/MSI‑X中断时,将PCIE设备上的每一个Message Address寄存器(低32位的Message Address寄存器)重新配置为指向申请到的PCIE总线地址。
[0091] PCIE总线地址的计算规则可以是:将关联的Message Data的有效的2字节数据作为一个16位宽的无符号数(即数据类型u16)加上初始PCIE总线地址得到。还需要配置PCIE总线控制器,使能PCI Express no map错误检测中断,并注册PCIE错误中断处理函数。
[0092] 通过PCIE错误中断处理函数,首先检查是不是发生PCI Express no map中断,如果发生PCI Express no map中断,则进一步检查PCI Express error capture register组中的寄存器R2和寄存器R3,从获取申请的完整的PCIE总线地址,PCIE总线地址的最低16位就是Message Data的有效的2字节数据。对PCIE总线地址的低16位中的数据进行字节序调整后写入MSIIR寄存器。最后,通过PCIE错误中断处理函数清除PCI Express error detect寄存器的(PNM,PCI Express no map)中断标志位和PCI Express error capture status寄存器的(ECV,Error capture valid)位。
[0093] 第三实施,利用轮询方式实现对MSI/MSI‑X中断报文的调整。
[0094] 实际应用中,有一些中央处理器,没有硬件断点或者linux操作系统不支持其上的硬件断点,则还可以采用轮询方式实现对MSI/MSI‑X中断报文的调整。实现原理包括:修改Message Address寄存器的配置,使其指向被硬件断点监控的内存地址即预处理地址,让MSI/MSI‑X报文将Message Data的值写到预处理地址对应的这段DDR内存中;而Linux操作系统在一些热点函数中,会检查这段内存,当发现有修改时,会对写入该端内存的信息字节序进行调整后再写入MSIIR寄存器。图6为本申请中断处理方法第三实施例的处理示意图,如图6所示,具体包括:
[0095] 系统初始化时,假设申请1024字节内存并映射到PCIE总线上,以Linux操作系统为例,在Linux操作系统上有固定的一致性DMA和流式DMA接口,可以使用pci_alloc_consistent接口、pci_map_single接口来申请上述内存,而且,通过这些接口就能得到申请的1024字节内存对应的PCIE总线地址PA,并将这段内存的每一个字节都填充初始值0xff。
[0096] 在与中央处理器存在字节许不兼容的PCIE设备驱动初始化后,会重新配置PCIE设备上的每一个Message Address寄存器以使其指向预处理地址。其中,预处理地址即PCIE总线地址PAn为:将申请到的MSI/MSI‑X中断号乘以4,再加上申请的1024字节内存对应的PCIE总线地址PA后得到PCIE总线地址Pan,作为预处理地址。
[0097] 设置一个处理函数f,用于对该预处理地址对应的1024字节内存,以4字节为单位,依次递增进行轮询(一共需要检查256次,每次检查的4个字节),当检测出这段内存中的值不是初始值0xffffffff,则意味着该段内存被修改了,进入预处理过程,将写入的信息进行字节序调整后再写入MSIIR寄存器。最后将预处理地址对应的1024字节内存的内存值恢复成0xffffffff。
[0098] 其中,可以在linux内核的一些热点函数,包含但不限于:arch_cpu_idle函数、irq_exit函数、ret_fast_syscall函数、retint_user函数等中,加入对本申请设置的处理函数f的调用来实现轮询处理。
[0099] 通过第三实施例的实现,与中央处理器不兼容的PCIE设备上报的MSI/MSI‑X中断报文被写入对应预处理地址的内存,等到linux内核执行到这些热点函数,就会检查到这些中断报文对内存的修改,会对不兼容的字节序进行纠正以使其与中央处理器的字节序一致,保证了将正确字节序的值填入MSIIR寄存器,最终正确实现了中断号上报。
[0100] 以上所述,仅为本发明的较佳实例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。