异常处理方法及装置的制造方法

文档序号:10624680阅读:488来源:国知局
异常处理方法及装置的制造方法
【专利摘要】本发明提供了一种异常处理方法及装置,其中,所述方法包括:检测访问PCI-E存储memory空间过程中是否发生异常;如果是,则将引起异常的异常指令所对应的返回值设置为非法值;将所述异常指令的下一个地址作为所述当前异常的返回地址。采用本发明提供的上述技术方案,解决了相关技术中,访问pcie memory地址过程中出现异常而引起的进程停止以及系统因死循环挂掉的问题,进而提升了系统的健壮性和残存性。
【专利说明】
异常处理方法及装置
技术领域
[0001]本发明涉及通信领域,具体而言,涉及一种异常处理方法及装置。
【背景技术】
[0002]快捷外设互联标准(PeripheralComponent Interconnect Express,简称为PC1-E)是一种新型的总线标准和接口,是由英特尔在2001年公布的被称为“3G10”的第三代PCI总线。PC1-E属于高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽,主要支持主动电源管理,错误报告,端对端的可靠性传输,热插拔以及服务质量(Quality of Service,简称为QoS)等功能。
[0003]PC1-E中规定了四种地址空间,它们分别是memory、1/0、configurat1n和message空间。在PC1-E体系架构中,访问没有存储体对应的memory地址时会产生异常。对于不同处理器平台,在对此类异常的处理方法上略会有些差异。
[0004]在精简指令集架构的中央处理器(PerPerformance Optimizat1n WithEnhanced-Performance Computing,简称 POWERPC)处理器平台下,中央处理器(CentralProcessing Unit,简称为CPU发出一条读访问PC1-E memory空间的指令后,处理器首先通过 local access windows 将指令中的 local address 地址映射到 PC1-E controller 上。然后使用outbound ATMU windows将处理器地址映射为PC1-E域的地址。PC1-E控制器的事物层将根据处理器的访问类型和映射后的PC1-E地址构成一个或多个TLP。最终,这些TLP会通过PC1-E的链路层、物理层送达总线的对端,并等待对端的complet1n报文结束本次事物。
[0005]当处理器发送一个读访问,而读访问的地址没有存储体与之对应的情况下,PC1-E控制器会因等待complet1n报文超时而产生一个异常。在异常处理中过程中,处理函数会判断触发该异常的指令是户态,还是内核态的。如果是用户态,异常处理将发送SIGBUS信号给用户态的进程。用进程在收到SIGBUS信号后,默认的处理方式是结束该进程。如果是内核态,用户将打印出当前的处理器环境信息,并退出异常。PC1-E访存指令没有成功执行,在异常返回后内核将会重新执行该条指令。该访存指令会访问没有存储体对应的PC1-E地址,因此也会再次引发异常,最终将会导致内核进入死循环状态。
[0006]在支持PC1-E热插拔的系统中,PC1-E设备可能随时会掉电或拔出。假设在某一个时刻处理器连续读访问PC1-E设备的memory空间。在访问期间PC1-E设备突然掉电。若此次访问是用户态进程发起的,进程将被杀死。若访问是内核态发起的,系统将会因为这次访问失败而陷入死循环中,以致整机down掉。
[0007]针对相关技术中,访问pcie memory地址过程中出现异常而引起的进程停止以及系统因死循环挂掉的问题,尚未提出有效的解决方案。

【发明内容】

[0008]为了解决上述技术问题,本发明提供了一种异常处理方法及装置。
[0009]根据本发明的一个方面,提供了一种异常处理方法,包括:检测访问快捷外设互联标准PC1-E存储memory空间过程中是否发生异常;如果是,则将引起异常的异常指令所对应的返回值设置为非法值;将所述异常指令的下一个地址作为所述当前异常的返回地址。
[0010]优选地,检测访问PC1-E存储memory空间过程中是否发生异常,包括:检测是否发生以下情况:访问所述PC1-E存储memory空间时,由于所述PC1-E存储memory空间没有对应的存储实体而导致的异常,以及所述异常指令的所要访问的操作地址是否位于所述PC1-E存储memory空间的地址范围内;其中,在检测结果为是的情况下,确定访问所述PC1-E存储memory空间过程中发生异常。
[0011]优选地,通过以下方式之一获取所述操作地址:在判断所述当前异常为加载load类指令引起的异常时,从所述load类指令获取所述操作地址;或从机器检查中断状态寄存器MCSR中读取所述操作地址。
[0012]优选地,从所述load类指令获取所述操作地址,包括:根据所述load类指令的格式类型,从所述load类指令中与所述格式类型对应的指定位置获取所述操作地址。
[0013]优选地,将引起所述当前异常的异常指令所对应的返回值设置为非法值,包括:在与所述异常指令对应的数据寄存器中写入所述非法值。
[0014]优选地,所述异常至少包括以下之一:加载load类指令引起的异常、总线上读取数据总线异常。
[0015]根据本发明的另一个方面,还提供了一种异常处理装置,包括:检测模块,用于检测访问快捷外设互联标准PC1-E存储memory空间过程中是否发生异常;设置模块,用于在发生异常时,将引起异常的异常指令所对应的返回值设置为非法值;确定模块,用于将所述异常指令的下一个地址作为所述当前异常的返回地址。
[0016]优选地,所述检测模块,用于检测是否发生以下情况:访问所述PC1-E存储memory空间时,由于所述PC1-E存储memory空间没有对应的存储实体而导致的异常,以及所述异常指令的所要访问的操作地址是否位于所述PC1-E存储memory空间的地址范围内;其中,在检测结果为是的情况下,确定访问所述PC1-E存储memory空间过程中发生异常。
[0017]优选地,所述装置还包括,获取模块,用于获取所述操作地址,其中,所述获取模块还用于在判断所述当前异常为加载load类指令引起的异常时,从所述load类指令获取所述操作地址;或从机器检查中断状态寄存器MCSR中读取所述操作地址。
[0018]优选地,所述获取模块,还用于根据所述load类指令的格式类型,从所述load类指令中与所述格式类型对应的指定位置获取所述操作地址。
[0019]通过本发明,采用在发生异常时,将异常指令的下一个地址作为所述当前异常的返回地址,并将异常指令的返回值设置为非法值的技术手段,解决了相关技术中,访问pciememory地址过程中出现异常而引起的进程停止以及系统因死循环挂掉的问题,进而提升了系统的健壮性和残存性。
【附图说明】
[0020]此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
[0021]图1是根据本发明实施例的异常处理方法的流程图;
[0022]图2为根据本发明实施例的异常处理装置的结构框图;
[0023]图3为根据本发明实施例的异常处理装置的另一结构框图;
[0024]图4为根据本发明优选实施例的使用分析指令的方法处理读pcie memory异常的处理方法的流程图;
[0025]图5为根据本发明优选实施例的使用powerpc平台架构提供的寄存器实现pciememory的异常处理。
【具体实施方式】
[0026]下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
[0027]本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
[0028]为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
[0029]在本实施例中提供了一种异常处理方法,图1是根据本发明实施例的异常处理方法的流程图,如图1所示,该流程包括如下步骤:
[0030]步骤S102,检测访问快捷外设互联标准PC1-E存储memory空间过程中是否发生异常;
[0031]步骤S104,如果是,则将引起异常的异常指令所对应的返回值设置为非法值;
[0032]步骤S106,将上述异常指令的下一个地址作为上述当前异常的返回地址。
[0033]通过上述各个步骤,采用在发生异常时,将异常指令的下一个地址作为所述当前异常的返回地址,,并将异常指令的返回值设置为非法值的的技术手段,解决了相关技术中,访问pcie memory地址过程中出现异常而引起的进程停止以及系统因死循环挂掉的问题,进而提升了系统的健壮性和残存性。
[0034]可选地,非法值可以是预先设定的,在本发明实施例中优选为十六进制的F。
[0035]对于检测访问PC1-E存储memory空间过程中是否发生异常可以通过检测是否发生以下情况:访问上述PC1-E存储memory空间时,由于上述PC1-E存储memory空间没有对应的存储实体而导致的异常,以及上述异常指令的所要访问的操作地址是否位于上述PC1-E存储memory空间的地址范围内;其中,在检测结果为是的情况下,确定访问上述PC1-E存储memory空间过程中发生异常。
[0036]其中,可以通过以下方式之一获取上述操作地址:在判断上述当前异常为加载load类指令引起的异常时,从上述load类指令获取上述操作地址;或从机器检查中断状态寄存器MCSR中读取上述操作地址,由于load类指令的格式类型存在多种情况,因此,本发明实施中,根据上述load类指令的格式类型,从上述load类指令中与上述格式类型对应的指定位置获取上述操作地址。
[0037]在本发明实施例中,上述异常至少包括以下之一:加载load类指令引起的异常、总线上读取数据总线异常。
[0038]综上所述,本发明实施例的技术方案,解决了 powerpc架构处理器读访问无存储体对应的pcie memory地址而引起的异常问题,进而达到不杀死用户态进程,也不会导致系统因死循环挂掉的方法,从而提升了系统的健壮性和残存性。
[0039]以下结合一示例说明上述实施例中所提供的异常处理方法,但不用于限定本发明实施例:
[0040]步骤I)确定导致异常的原因
[0041]首先要在异常处理流程中判定导致异常的原因:即处理器访问了没有存储体对应的pcie memory地址导致的异常。如果不是这种情况,异常按原有的流程继续进行。否则,将针对这种异常做进一步处理
[0042]步骤2)判断异常地址是否在pcie memory地址范围内
[0043]在确定异常原因后,需要进一步获取引起异常指令的操作地址,并将这个地址记录下来。并获取系统中所有pcie控制器所管辖的memory地址范围。最后,判断所记录的异常指令操作地址是否属于pcie memory空间。如果是,说明这种情况满足本发明实施例要处理的条件。否则,按原有的异常处理流程执行。
[0044]步骤3)将返回值填充为全F
[0045]当以上两种情况和条件都满足后,将load memory指令的返回值填充为全F。并将异常返回的地址改为引发异常的指令下地址,并跳过后续记录内核异常的打印或发送SIGBUS信号给用户进程的操作,直接返回。
[0046]采用本发明实施例所提供的上述技术方案,可以简单有效的防止读访问PCIe产生异常后导致的进程被杀死或是系统挂掉的问题。
[0047]需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必需的。
[0048]在本实施例中还提供了一种异常处理装置,用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述,下面对该装置中涉及到的模块进行说明。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。图2为根据本发明实施例的异常处理装置的结构框图。如图2所示,该装置包括:
[0049]检测模块20,用于检测访问快捷外设互联标准PC1-E存储memory空间过程中是否发生异常;
[0050]设置模块22,与检测模块20连接,用于在发生异常时,将引起异常的异常指令所对应的返回值设置为非法值;
[0051]确定模块24,与设置模块22连接,用于将上述异常指令的下一个地址作为上述当前异常的返回地址。
[0052]通过上述各个模块的综合应用,采用在发生异常时,将异常指令的下一个地址作为所述当前异常的返回地址,并将将引起上述异常指令所对应的返回值设置为非法值的技术手段,解决了相关技术中,访问pcie memory地址过程中出现异常而引起的进程停止以及系统因死循环挂掉的问题,进而提升了系统的健壮性和残存性。
[0053]图3为根据本发明实施例的异常处理装置的另一结构框图,其中,检测模块20,用于检测是否发生以下情况:访问上述PC1-E存储memory空间时,由于上述PC1-E存储memory空间没有对应的存储单元而导致的异常,以及上述异常指令的所要访问的操作地址是否位于上述PC1-E存储memory空间的地址范围内;其中,在检测结果为是的情况下,确定访问上述PC1-E存储memory空间过程中发生异常。
[0054]可选地,上述装置还包括,获取模块26,用于获取上述操作地址,其中,获取模块26还用于在判断上述当前异常为加载load类指令引起的异常时,从上述load类指令获取上述操作地址;或从机器检查中断状态寄存器MCSR中读取上述操作地址。
[0055]进一步地,获取模块26,还用于根据上述load类指令的格式类型,从上述load类指令中与上述格式类型对应的指定位置获取上述操作地址。
[0056]为了更好的理解上述异常处理过程,以下结合优选实施例进行说明,但不用于限定本发明实施例的保护范围。
[0057]下面结合图4进一步详细描述使用分析指令的方法解决读pcie memory异常的处理方法:
[0058]步骤S402,异常入口,powerpc架构的指令属于精简指令集,采用统一指令编码方式,指令的长度相等,而且所有指令中的op-code永远位于同样的位置。根据这一指令特征,对异常原因的判断可以采取分析指令op-code的方式来实现。
[0059]步骤S404,通过进入异常时保留下结构体struct pt_regs,提取引起异常的指令regs->nip0将指令的[0:5]bits取出,判断该指令是否属于load类指令。如果是,则执行步骤S406中的处理,否则步骤S410。
[0060]为了获取引起异常的指令的操作地址,要对Load指令做进行进一步分析。可根据具体的Load指令提取出指令要访问的地址。每种load指令放存的格式不同,因此要根据不同的指令来提取地址。
[0061]步骤S406,通过 Iinux 内核结构变量 struct pci_controller hose_head 获取pcie所覆盖的地址范围。并检验步骤S404中提取的地址是否属于这个范围。如果是,执行步骤S410中的操作,否则执行步骤S410。
[0062]步骤S408,获取异常时保留下来的信息struct pt_regs,将引起异常的load指令的数据寄存器regS->gpr[0]填充为全F。并将异常返回的地址指向引起异常指令的下地址regs->nip = (regs_>nip)+4 ;。这样再重新返回到程序运行时,程序将不会感知到异常的发生过,就好像load指令在pcie memory空间内获取了值为全F的非法值一样。
[0063]步骤S410,执行原有的异常处理流程。
[0064]另一种实现方法是根据powerpc核心存器来获取并分析异常信息。下面结合图5对使用核心寄存器实现的读访问pcie memory异常的处理作进一步的描述。
[0065]步骤S502,在异常入口处,通过获取MCSR寄存器来判断异常的类型。如果MCSR[60] = I,则表示产生了 “Bus read data bus error”异常。这种类型异常;
[0066]步骤S504,在powerpc架构中,在发生异常时,MCAR寄存器包含了引起异常的指令所操作的地址。
[0067]步骤S506,通过读取 MCAR (Machine Check Address Register)寄存器,可以获取引起异常的指令要访问的操作地址,判断上述操作地址是否位于pcie所覆盖的地址范围,如果是,执行步骤S506中的操作,否则执行步骤S508。
[0068]步骤S508,获取异常时保留下来的信息struct pt_regs,将引起异常的load指令的数据寄存器regS->gpr[0]填充为全F。并将异常返回的地址指向引起异常指令的下地址regs->nip = (regs_>nip)+4 ;。这样再重新返回到程序运行时,程序将不会感知到异常的发生过,就好像load指令在pcie memory空间内获取了值为全F的非法值一样。
[0069]步骤S508,执行原有的异常处理流程。
[0070]综上所述,本发明实施例达到了以下技术效果:解决了相关技术中,访问pciememory地址过程中出现异常而引起的进程停止以及系统因死循环挂掉的问题,进而提升了系统的健壮性和残存性。
[0071]在另外一个实施例中,还提供了一种软件,该软件用于执行上述实施例及优选实施方式中描述的技术方案。
[0072]在另外一个实施例中,还提供了一种存储介质,该存储介质中存储有上述软件,该存储介质包括但不限于:光盘、软盘、硬盘、可擦写存储器等。
[0073]需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的对象在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
[0074]显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
[0075]以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【主权项】
1.一种异常处理方法,其特征在于,包括: 检测访问快捷外设互联标准PC1-E存储memory空间过程中是否发生异常; 如果是,则将引起异常的异常指令所对应的返回值设置为非法值; 将所述异常指令的下一个地址作为当前异常的返回地址。2.根据权利要求1所述的方法,其特征在于,检测访问PC1-E存储memory空间过程中是否发生异常,包括: 检测是否发生以下情况:访问所述PC1-E存储memory空间时,由于所述PC1-E存储memory空间没有对应的存储实体而导致的异常,以及所述异常指令的所要访问的操作地址是否位于所述PC1-E存储memory空间的地址范围内;其中,在检测结果为是的情况下,确定访问所述PC1-E存储memory空间过程中发生异常。3.根据权利要求2所述的方法,其特征在于,通过以下方式之一获取所述操作地址: 在判断所述当前异常为加载load类指令引起的异常时,从所述load类指令获取所述操作地址;或 从机器检查中断状态寄存器MCSR中读取所述操作地址。4.根据权利要求3所述的方法,其特征在于,从所述load类指令获取所述操作地址,包括: 根据所述load类指令的格式类型,从所述load类指令中与所述格式类型对应的指定位置获取所述操作地址。5.根据权利要求1所述的方法,其特征在于,将引起所述当前异常的异常指令所对应的返回值设置为非法值,包括: 在与所述异常指令对应的数据寄存器中写入所述非法值。6.根据权利要求1至5任一项所述的方法,其特征在于,所述异常至少包括以下之一: 加载load类指令引起的异常、总线上读取数据总线的异常。7.一种异常处理装置,其特征在于,包括: 检测模块,用于检测访问快捷外设互联标准PC1-E存储memory空间过程中是否发生异常; 设置模块,用于在发生异常时,将引起异常的异常指令所对应的返回值设置为非法值; 确定模块,用于将所述异常指令的下一个地址作为当前异常的返回地址。8.根据权利要求7所述的装置,其特征在于,所述检测模块,用于检测是否发生以下情况:访问所述PC1-E存储memory空间时,由于所述PC1-E存储memory空间没有对应的存储实体而导致的异常,以及所述异常指令的所要访问的操作地址是否位于所述PC1-E存储memory空间的地址范围内;其中,在检测结果为是的情况下,确定访问所述PC1-E存储memory空间过程中发生异常。9.根据权利要求8所述的装置,其特征在于,所述装置还包括,获取模块,用于获取所述操作地址,其中,所述获取模块还用于在判断所述当前异常为加载load类指令引起的异常时,从所述load类指令获取所述操作地址;或从机器检查中断状态寄存器MCSR中读取所述操作地址。10.根据权利要求9所述的装置,其特征在于,所述获取模块,还用于根据所述load类指令的格式类型,从所述load类指令中与所述格式类型对应的指定位置获取所述操作地址。
【文档编号】G06F11/22GK105988905SQ201510076615
【公开日】2016年10月5日
【申请日】2015年2月12日
【发明人】蒋习旺
【申请人】中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1