异常处理方法、计算机可读介质及电子设备与流程

文档序号:32166452发布日期:2022-11-12 04:53阅读:69来源:国知局
异常处理方法、计算机可读介质及电子设备与流程

1.本发明涉及异常处理技术领域,更具体地,涉及一种异常处理方法、计算机可读介质以及电子设备。


背景技术:

2.在发生异常(exception)时,会中止处理器正常的执行流程,使得处理器转去执行对应的异常处理程序,发生异常的情况可能有很多种,可能是内部原因,也可能是外部原因,每种情况都有对应的异常处理方式。
3.有些异常类型需要通过中断的方式进行处理,内部中断作为中断的一种类型,表示处理器在执行指令的过程中遇到了错误的状况。处理器在执行每条指令时都会检测是否发生异常,若检测到发生了某个异常,则中止当前程序的执行转去处理该异常,并且在处理完该异常后,恢复发生该异常之前的被打断的程序。
4.异常可以包括故障(fault)、陷阱(trap)和终止(abort)。处理器在遇到故障(诸如,除以零、缺页、溢出等)时,可以在对应的异常处理程序中进行纠正,并且在执行完异常处理程序后重新执行发生故障的指令,使得不再出错。陷阱主要用于为用户态的程序提供系统调用接口,以由操作系统来执行一些高优先级的操作;此外,陷阱还用于调试程序的目的,诸如用断点中断指令替换原始指令,当处理器执行到断点中断指令时,转去执行对应的调试程序并且用原始指令替换断点中断指令,在执行完调试程序后返回执行原始指令。终止主要用于指示不可恢复的错误,诸如双重故障等,在检测到这类异常时,通常会终止当前程序。
5.随着多核处理器的广泛应用,在遇到故障或陷阱类型的异常时,诸如在检测到用于调试程序的断点中断指令时,如果多核处理器的一个核已将断点中断指令替换回原始指令,则可能导致其他核在执行到该指令时出现一些问题。为解决这些问题,需要额外的操作来实现程序的正常运行,导致程序运行繁琐且低效。


技术实现要素:

6.为克服上述现有技术中存在的问题,本发明的一个方面提供一种异常处理方法,包括:响应于在执行当前程序中的第一指令时检测到异常,中止第一指令的执行,存储第一指令的位置,并且跳转执行与所述异常对应的异常处理程序;在异常处理程序的执行期间获取第二指令,其中第二指令用于代替第一指令来执行;响应于异常处理程序结束执行,执行第二指令;以及响应于第二指令结束执行,执行当前程序中第一指令的下一条指令,以继续当前程序的执行。
7.上述方法中,在异常处理程序的执行期间获取第二指令(后文称为影子指令),该指令用于从异常处理程序返回当前程序时,代替发生异常的第一指令来执行,而无需在当前程序中替换发生异常的第一指令。例如,在设置断点中断指令来调试当前程序的情况下,无需用原始指令在当前程序中替换断点中断指令,从而避免增加额外的操作来实现当前程
序的正常执行。在不影响当前程序继续执行的情况下,能够提高异常处理的效率,特别适用于多核处理器进行异常处理。
8.上述方法还可以包括:设置用于存储标志位信息的第一寄存器,所述标志位信息用于指示是否要用第二指令代替第一指令来执行;以及,设置用于存储第二指令的第二寄存器。寄存器具有非常高的读写速度,使得在寄存器之间的数据传送非常快,通过设置第一和第二寄存器来分别存储标志位信息和第二指令,可以提高异常处理的效率。
9.上述方法中,在异常处理程序的执行期间获取第二指令包括:在异常处理程序的执行期间,获取与所述异常对应的预先设置的指令或者获取用户提供的指令,作为第二指令;以及,将第一寄存器中的标志位信息设置为指示需要用第二指令代替第一指令来执行,并且在第二寄存器中存储第二指令。
10.上述方法还可以包括:预先设置与所述异常对应的多个指令。以及,获取与所述异常对应的预先设置的指令包括:根据预设规则,在与所述异常对应的多个指令中进行选择。为异常预先设置对应的多个指令,可使(代替发生异常的第一指令来执行的)第二指令的选择范围更广,例如可以根据实际需求灵活地对第二指令进行选择。
11.上述方法中,响应于异常处理程序结束执行而执行第二指令包括:响应于异常处理程序结束执行,读取第一寄存器中的标志位信息;响应于所述标志位信息指示需要用第二指令代替第一指令来执行,读取第二寄存器中的第二指令;以及执行第二指令。
12.上述方法还可以包括:响应于第二指令结束执行,将第一寄存器中的标志位信息设置为指示无需用第二指令代替第一指令来执行,并且清除第二寄存器中的第二指令。
13.上述方法还可以包括:响应于异常处理程序结束执行,获取响应于检测到异常所存储的第一指令的位置,在程序计数器寄存器中存储第一指令的位置,并且在指令寄存器中存储第二指令,以便执行指令寄存器中的第二指令。
14.上述方法中,响应于第二指令结束执行而执行当前程序中第一指令的下一条指令包括:响应于第二指令结束执行,使程序计数器寄存器执行加法计算,得到当前程序中第一指令的下一条指令的位置;使指令寄存器根据程序计数器寄存器中的位置读取当前程序中第一指令的下一条指令,并且存储所述下一条指令;以及,执行指令寄存器中的当前程序中第一指令的下一条指令。
15.上述方法通过对第一和第二寄存器、程序计数器寄存器、指令寄存器执行一些简单的操作,就可以顺利地从异常处理程序返回当前程序以继续当前程序的执行,从而提高了异常处理的效率。
16.本发明的另一个方面提供一种计算机可读介质,该计算机可读介质上存储有计算机程序,该计算机程序用于被处理器执行时实现上述异常处理方法。
17.本发明的另一个方面提供一种电子设备,包括处理器和存储器,存储器上存储有计算机程序并且存储器耦合到处理器,该计算机程序用于被处理器执行时,使得所述电子设备实现上述异常处理方法。
18.应当理解的是,以上的一般描述和后文的细节描述仅是示意性和解释性的,并不用于限制本发明。
附图说明
19.此处的附图被并入说明书中并构成说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理,其中:图1示意性地示出了根据本发明一个实施例的异常处理方法的流程图;图2a-2e示意性地示出了基于图1所示的方法实施例进行异常处理的具体示例。
具体实施方式
20.为使本发明的目的、技术方案及优点更加清楚明白,以下结合附图通过具体实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
21.本发明的一个方面提供一种异常处理方法,用于处理故障和陷阱类型的异常。
22.现参考图1,其示意性地示出了根据本发明一个实施例的异常处理方法的流程图,该方法适用于在诸如cpu、gpu之类的单核、多核处理器中执行,包括如下步骤s11-s16:步骤s11. 设置两种专用寄存器,即第一寄存器和第二寄存器。其中,第一寄存器为影子使能(shadow_enable)寄存器,第二寄存器为影子指令(shadow_inst)寄存器,分别用于存储标志位信息和影子指令。
23.其中,shadow_enable寄存器和shadow_inst寄存器可以由多个具有存储功能的触发器组合构成,这种由多个触发器组合构成的寄存器能够存储多位二进制代码。应理解,无论是标志位信息还是影子指令,均可以用多位二进制代码来表示。寄存器通常具有非常高的读写速度,所以在寄存器之间的数据传送非常快。通过设置shadow_enable寄存器和shadow_inst寄存器来分别存储标志位信息和影子指令,可以有效提高异常处理的效率。
24.标志位信息用于指示从异常处理程序返回当前程序(即,跳转到异常处理程序前正在执行的程序)时,是否要用shadow_inst寄存器中存储的影子指令代替当前程序中返回位置处的指令(即,发生异常的指令,或称第一指令)来执行,标志位信息的初始值为false。影子指令(或称第二指令)指的是在异常处理程序的执行期间获取的可由处理器执行的指令,用于代替当前程序中返回位置处的指令(即,发生异常的指令,或称第一指令)来执行。
25.步骤s12. 执行当前程序。
26.在当前程序的执行过程中,处理器中的程序计数器(pc)寄存器计算当前程序中将要执行的指令的位置,其指向将要执行的指令在存储器(例如,内存、外部存储器等)中的地址;处理器中的指令(inst)寄存器用于根据pc寄存器中存储的位置从存储器中读取将要执行的指令并且存储该指令,以便由处理器执行该指令。
27.可选的,pc寄存器的初始值可以为0。pc寄存器在当前程序的执行过程中会随着指令的执行增加计数,其指向将要执行的指令在存储器中的地址。本发明的pc寄存器和inst寄存器可采用现有的任何pc寄存器和inst寄存器。
28.步骤s13. 响应于在执行当前程序中的某一条指令时检测到异常,得到发生异常的指令(第一指令),中止该发生异常的指令的执行,存储该发生异常的指令的位置(如上文所述,该位置即当前程序中的返回位置,其指向发生异常的指令在存储器中的地址),并且跳转执行与检测到的异常所对应的异常处理程序。
29.在当前程序的执行过程中,当处理器在执行某一条指令时检测到异常,会中止当
前程序的执行流程,即中止发生异常的指令的执行;随后,处理器在出错程序计数器(error_pc)寄存器中存储发生异常的指令的位置(即存储第一指令的位置),并且根据中断描述符(idt)表,确定与检测到的异常对应的异常处理程序,从而跳转执行该异常处理程序。其中,error_pc寄存器可以由多个具有存储功能的触发器组合构成,用于存储多位二进制代码,并且发生异常的指令的位置可以由多位二进制代码来表示;idt表可将具体的异常类型与其处理过程联系起来,其通常以中断向量号为索引,根据各种异常的中断向量号来查找相应的异常处理程序。
30.具体而言,确定异常处理程序的过程包括:查找检测到的异常在idt表中的id(中断向量号,通常在0-255的范围内),然后加载idt表的基地址,同时读取该id的相应表项,处理器可通过相应表项的门描述符的段选择子来确定出异常处理程序;此外,跳转执行异常处理程序的过程包括:处理器中的pc寄存器存储异常处理程序中的第一条指令的位置,其指向异常处理程序中的第一条指令在存储器中的地址,处理器中的inst寄存器根据pc寄存器中存储的位置从存储器中读取异常处理程序中的第一条指令,并且存储该指令,随后处理器可以执行该指令,即开始执行异常处理程序。
31.处理器在执行指令时可能会检测到不止一个异常,在检测到多个异常的情况下,可以根据预先设定的优先级跳转执行优先级最高的异常对应的异常处理程序,并且按照优先级从高到低悬挂其他异常,甚至可以废弃一些优先级较低的异常。举例而言,可以将故障类型的异常的优先级设置为高于陷阱类型的异常的优先级,在同时检测到故障类型和陷阱类型的异常时,处理器可以按照优先级高低先跳转执行故障类型的异常对应的异常处理程序,然后再跳转执行陷阱类型的异常对应的异常处理程序。此外,在执行异常处理程序时,如果出现优先级更高的异常需要进行处理,则中断当前正在执行的异常处理程序,转而处理优先级更高的异常,等到优先级更高的异常处理完毕,再返回中断的异常处理程序以继续执行。
32.在一些应用场景下,很多程序通过一个主循环程序,不断查询是否发生异常,然后去处理相应的异常、中断,而在一些嵌入式系统中,由于并没有这样的主循环,系统功能通常是用中断代码来驱动,当发生某个异常或中断时,处理器就去执行对应的函数,复杂的系统有很多中断源,可能具有不同优先级,且可能面临嵌套中断的情况,本技术提供的异常处理方法可支持处理各种复杂情况,例如支持处理多种不同优先级的异常,支持处理中断嵌套的情况。
33.步骤s14. 在异常处理程序的执行期间,获取影子指令(第二指令),在shadow_inst寄存器中存储该影子指令,并且将shadow_enable寄存器中的标志位信息设置为指示需要用影子指令代替发生异常的指令来执行。其中,将shadow_enable寄存器中存储的标志位信息的值设置为true,其指示从异常处理程序返回当前程序时,需要用shadow_inst寄存器中存储的影子指令代替当前程序中返回位置处的指令(即,发生异常的指令)来执行。
34.假设在步骤s13中检测到的异常为故障类型的异常,则可以通过以下两种方式来获取影子指令,用于代替发生异常的指令来执行:1)预先设置并存储与各种故障对应的影子指令,影子指令可以是用户预先设置的、可由处理器执行的、并且能够代替发生异常的指令来执行的指令,一种故障可以对应预先设置的多个指令(或称多个影子指令、多个第二指令),并且多种故障也可以对应一个影
子指令。例如,在由多核处理器执行当前程序时,可以针对处理器的不同核为故障预先设置不同的影子指令,当处理器的一个核检测到该故障时,为该故障获取该核特定的影子指令。为一种故障预先设置对应的多个影子指令,可使最终(用于代替发生异常的指令来执行的)影子指令的选择范围更广、灵活性更高。
35.在检测到故障后,查找预先设置并存储的与该故障对应的影子指令,如果存在多个对应的影子指令则可以根据预设规则(例如,根据处理器的核)从中选择一个影子指令,将查找/选择得到的影子指令存储到shadow_inst寄存器,并且将shadow_enable寄存器中的标志位信息的值设置为true。其中,在检测到故障后,可以立即查找对应的影子指令;也可以在异常处理程序执行期间内的任何时刻查找对应的影子指令,只要在异常处理程序结束执行前将影子指令存储到shadow_inst寄存器并且将shadow_enable寄存器中的标志位信息的值设置为true即可。
36.2)在异常处理程序的执行期间与用户交互,获取用户提供的影子指令。在获取用户提供的影子指令后,将影子指令存储到shadow_inst寄存器,并且将shadow_enable寄存器中的标志位信息的值设置为true。
37.假设在步骤s13中检测到的异常为陷阱类型的异常,更具体地,检测到断点中断指令,则获取该断点中断指令在当前程序中所替换的原始指令,将该原始指令作为影子指令存储到shadow_inst寄存器,并且将shadow_enable寄存器中的标志位信息的值设置为true。与故障类型的异常类似,一种陷阱也可以对应多个影子指令,并且多种陷阱也可以对应一个影子指令。
38.步骤s15. 响应于异常处理程序结束执行,读取shadow_enable寄存器中的标志位信息,并且响应于shadow_enable寄存器中的标志位信息指示需要用shadow_inst寄存器中的影子指令代替发生异常的指令来执行,执行shadow_inst寄存器中的影子指令。
39.与现有的异常处理方法类似,本实施例在从异常处理程序返回当前程序时,处理器中的pc寄存器将读取并存储error_pc寄存器中存储的发生异常的指令的位置(其指向发生异常的指令在存储器中的地址,也就是当前程序中的返回位置);然而与现有的异常处理方法不同的是,本实施例在inst寄存器根据pc寄存器中存储的位置从存储器读取将要执行的指令之前,先读取shadow_enable寄存器中存储的标志位信息,如果标志位信息为true,即指示需要用shadow_inst寄存器中存储的影子指令代替当前程序中返回位置处的指令(即,发生异常的指令)来执行,则读取shadow_inst寄存器中存储的影子指令,并且将该影子指令存储到inst寄存器,从而由处理器执行该影子指令,而不是发生异常的指令。
40.应理解,处理器总是执行inst(指令)寄存器中存储的指令。尽管此时pc寄存器存储的是发生异常的指令的位置(其指向发生异常的指令在存储器中的地址,也就是当前程序中的返回位置),但处理器并不会执行该发生异常的指令,而是执行inst指令寄存器中存储的影子指令。也就是说,由影子指令代替当前程序中发生异常的指令来执行。
41.步骤s16. 响应于影子指令结束执行,清除shadow_inst寄存器中的影子指令,将shadow_enable寄存器中的标志位信息设置为指示无需用影子指令代替发生异常的指令来执行,并且执行当前程序中发生异常的指令(第一指令)的下一条指令,以继续当前程序的执行。
42.作为一种实施方式,在影子指令结束执行后,可将shadow_enable寄存器的值设置
为false,以指示无需用影子指令代替发生异常的指令来执行,并且可以清除shadow_inst寄存器中存储的影子指令;同时,还要清除error_pc寄存器中存储的发生异常的指令的地址,这样,通过设计一次性执行的影子指令(one-time executed shadow instruction),在多核处理器的异常处理场景下可以提高处理效率。如步骤s15所述,在从异常处理程序返回当前程序时,处理器中的pc寄存器将读取并存储发生异常的指令的位置。这样,在影子指令结束执行后,pc寄存器执行加法计算,从而得到当前程序中发生异常的指令的下一条指令的位置(即,当前程序中的返回位置的下一位置),其指向当前程序中发生异常的指令的下一条指令在存储器中的地址。处理器中的inst寄存器根据pc寄存器中存储的位置从存储器中读取当前程序中发生异常的指令的下一条指令并且存储该指令,从而由处理器执行该指令。由此,当前程序可以继续执行。
43.可选的,对于步骤s16,在一些场景下也可以选择此时不清除shadow_inst寄存器中存储的影子指令(但仍然需要设置shadow_enable寄存器,以指示无需再用这里的影子指令代替发生异常的指令来执行),例如可以等到下一次异常处理场景时用获取到的新的指令来替换此处的影子指令,作为下一次使用的新的影子指令。
44.从以上步骤可见,通过设置shadow_enable寄存器、shadow_inst寄存器,并且对shadow_enable寄存器、shadow_inst寄存器、程序计数器寄存器、指令寄存器执行一些简单的操作,就可以顺利地从异常处理程序返回当前程序,以继续当前程序的执行,由此提高了异常处理的效率。
45.在上述实施例中,在异常处理程序的执行期间获取影子指令,该影子指令用于从异常处理程序返回当前程序时,代替发生异常的指令来执行,而无需在当前程序中用影子指令替换发生异常的指令。例如,在设置断点中断指令来调试当前程序的情况下,无需用原始指令在当前程序中替换断点中断指令,从而避免增加额外的操作来实现当前程序的正常执行。在不影响当前程序继续执行的情况下,能够提高异常处理的效率,特别适用于多核处理器进行异常处理,在各种类型的异常处理场景下都可以适用。
46.基于上述实施例提供的异常处理方法,图2a-2e示意性地示出了在处理器检测到异常时,跳转执行异常处理程序并返回当前程序继续执行的一个具体示例:如图2a所示,当前程序已执行到inst2指令。此时,处理器中的pc寄存器指向inst2指令在存储器中的地址102,并且inst寄存器存储地址102处的指令inst2,以便由处理器执行该指令inst2。另外,shadow_enable寄存器中存储的标志位信息的值为初始值false。
47.随后,如图2b所示,在执行inst寄存器中的指令inst2时检测到异常。响应于检测到该异常,发生异常的指令inst2被中止,并且处理器中的error_pc寄存器存储发生异常的指令inst2的地址102(即,当前程序中的返回位置)。在确定与检测到的异常对应的异常处理程序后,pc寄存器指向异常处理程序中的第一条指令inst0在存储器中的地址0,并且inst寄存器根据pc寄存器中存储的地址0从存储器中读取并存储异常处理程序中的第一条指令inst0,从而处理器跳转执行inst寄存器中存储的指令inst0。
48.处理器继续执行异常处理程序,并且在异常处理程序的执行期间获取影子指令,直到如图2c所示,执行到异常处理程序中的最后一条指令return。此时,处理器中的pc寄存器指向异常处理程序中的最后一条指令return的地址5,并且inst寄存器中存储有异常处理程序中的最后一条指令return。由于在异常处理程序的执行期间获取了影子指令instx,
此时,shadow_inst寄存器存储有影子指令instx,并且shadow_enable寄存器中存储的标志位信息的值设置为true,其指示需要用shadow_inst寄存器中存储的影子指令instx代替当前程序中返回位置处的指令(即,发生异常的指令inst2)来执行。
49.响应于异常处理程序结束执行,从异常处理程序返回当前程序。如图2d所示,处理器中的pc寄存器读取并存储error_pc寄存器中存储的发生异常的指令inst2的地址102(即,当前程序中的返回位置)。随后,读取shadow_enable寄存器中存储的标志位信息,由于标志位信息的值为true,则读取shadow_inst寄存器中存储的影子指令instx,并且将该影子指令instx存储到inst寄存器,而不是在inst寄存器中存储pc寄存器指向的地址102处的指令inst2(即,发生异常的指令),从而处理器将执行inst寄存器中存储的影子指令instx。
50.在影子指令结束执行后,如图2e所示,清除shadow_inst寄存器中存储的影子指令instx,并且将shadow_enable寄存器的值设置为false,以指示无需用影子指令代替发生异常的指令来执行;同时,还清除error_pc寄存器中存储的发生异常的指令的地址102。此时,处理器中的pc寄存器执行加法计算,从而指向当前程序中发生异常的指令inst2的下一条指令inst3的地址103,inst寄存器根据pc寄存器中存储的地址103从存储器中读取并存储当前程序中发生异常的指令inst2的下一条指令inst3,从而由处理器执行该指令inst3。由此,当前程序可以继续执行。
51.可以理解的是,本领域技术人员可根据本文揭露的思想以及实际需求来设置相应寄存器中的具体内容,从而指示何时需要执行哪种类型的指令。
52.应注意,一些示例性方法被描绘为流程图。虽然流程图将操作表述为顺序执行,但可以理解的是,其中的许多操作可以并行、同时或者同步地执行,另外,还可以重新排列操作的顺序。处理可以在操作完成时终止,也可以具有未包括在附图中或者实施例中的附加步骤。
53.本发明的另一个方面提供一种计算机可读介质,该计算机可读介质包括但不限于:软盘、硬盘、磁带、其它磁介质、cdrom、cdrw、dvd、其它光介质、穿孔卡片、其它物理介质、rom、prom、eeprom、ram、sram、或计算机可读取的其它介质,以及传输介质(诸如同轴电缆、光纤电缆、载波等)。计算机可读介质可以包括在上述计算机系统中,也可以是未安装的单独的介质。计算机可读介质用于承载计算机指令或程序,包括用于实现上文描述的异常处理方法的计算机指令或程序,当计算机可读介质中的计算机指令或程序被处理器(例如,上述计算机系统中的处理器)读取并执行时,可以实现(例如,使得上述计算机系统实现)上文描述的异常处理方法的实施例,包括图1中所示的步骤。
54.本发明的另一个方面提供一种电子设备,诸如计算机系统,该计算机系统可以包括总线,以及耦合到总线的处理器、存储器、输入装置(诸如键盘、鼠标、传感器等)、输出装置(诸如显示器、打印机、扬声器等)、通信接口(诸如并行端口、串行端口、调制解调器、网卡等)以及其他装置(诸如可拆卸装置、驱动装置等)。
55.其中,存储器(诸如rom、prom、eeprom、ram、sram等)用于存储数据以及计算机指令或程序,包括用于实现上文描述的异常处理方法的计算机指令或程序。处理器用于执行计算机指令或程序所指定的一系列动作,例如执行存储器中存储的计算机指令或程序,当处理器执行存储器中存储的计算机指令或程序时,使得计算机系统能够实现上文描述的异常处理方法的实施例,包括图1中所示的步骤。
56.尽管本发明已经通过优选实施例进行了描述,但应理解的是,本发明并不局限于上文描述的并且在附图中示出的实施例,本领域技术人员可以在不脱离本发明范围的情况下进行各种更改和变型。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1