控制调试异常的产生的制作方法与工艺

文档序号:11802965阅读:257来源:国知局
控制调试异常的产生的制作方法与工艺
本发明的领域涉及数据处理装置,且具体地涉及在数据处理装置上执行诊断操作。

背景技术:
已知可向数据处理系统提供诊断机制,诊断机制可以用来在数据处理系统上执行诊断操作(如软件和硬件故障识别和分析(调试)),以协助硬件、操作系统、应用程序、整体系统设计等的开发。当分析数据处理系统时,可使用外部调试器,外部调试器包括在主机系统上运行的调试程序,主机系统连接到将被分析的系统,以使得控制信号从主机传到该系统,所述控制信号指定将在该系统上执行的诊断操作。外部调试器包括经由外部端口连接到目标的调试器,然后调试器会用来对调试硬件编程。处理器被配置为使得调试事件导致进入特别的调试状态,在该状态中数据处理装置被外部调试器询问(interrogate)和控制。将调试事件转换为调试状态进入是由硬件授权接口所控制的,但是这并不选通(gate)调试器对调试硬件编程的能力。替代地,可有一种自我托管的调试系统,其中调试监视器软件在正被调试的目标上执行。处理器上的调试硬件被编程为产生调试事件,并且处理器被配置为使调试事件转换成由软件处理的调试异常。通常,调试软件以无权限的或低阶层的任务来运行(通常是当调试其它无权限应用时),无权限或低阶层任务使用有权限或较高阶层软件执行者或内核的服务来编程调试硬件并保持被通知调试事件。在其它情况下,内核是自己被调试的。一般而言,这两个方案共享大部分的调试硬件,如断点和监视点寄存器。至少有三个路线用于调试硬件的编程:1)通过用于内核模式调试的内核中的调试监视器;2)通过用于应用程序的调试的、代表无权限调试器任务的内核;3)通过经由专用调试端口的外部调试器。调试的一个问题是,调试代理(可能是外部代理)对断点寄存器的编程可在可能包括操作系统代码的代码中产生异常。如此有与该状况相关的风险,并可能导致软件故障。在降低可能会导致系统故障的代码中异常产生的风险的同时,希望能够允许包括操作系统的系统的调试。

技术实现要素:
本发明的第一方面提供一种数据处理装置,包括:数据处理电路,用于响应于程序指令的执行而执行数据处理操作;调试电路,用于执行由在该数据处理电路上运行的调试软件控制的调试操作;该数据处理装置包括数据储存装置,该数据储存装置用于储存当前调试异常掩码值;该数据处理电路被配置为响应于执行关键代码而在该数据储存装置中将该当前调试异常掩码值设为第一值,并且在该关键代码的执行终止时重置该当前调试异常掩码值以不储存该第一值;其中该数据处理电路被配置为执行与多个不同软件阶层式层级相对应的程序指令,较高软件阶层式层级是具有比较低阶层式软件层级高的权限的层级,以使得有至少一些数据储存位置能从该较高阶层式层级被存取而不能从该较低阶层式层级被存取;以及该数据处理电路被配置为,当该调试软件将在与软件正操作于的层级相同的阶层式层级处被执行时,如果该当前调试异常掩码值不被设为该第一值时,则允许调试异常被执行,并且如果该当前调试异常掩码值被设为该第一值,则不允许该调试异常被执行,并且当该调试软件将在较高的预 定软件阶层式层级处被执行时允许调试异常被执行。本发明认识到一些代码的执行对于系统的性能和正确行为是关键的,因此中断代码几乎肯定会导致系统故障。也认识到虽然异步中断可能发生在处理期间的任何点处,但是这些一般是独立于当前执行指令流中的指令而发生的且可被允许保持待决一段时间,该系统被配置为在到达处理中的合适点时执行这些异常。同步异常响应于指令流中的指令而发生,因此,同步异常在传统上立即被执行。若同步异常在关键代码的执行过程中发生,可能会导致问题。一般而言,数据处理系统将通过确保在关键代码期间可能会产生诸如数据中止之类的同步异常的内存区域不被存取,来防止该可能性。然而,本发明认识到,还有其它可通过调试电路产生的同步异常,这些其它同步异常超出正常处理操作的控制且是非预期的异常。重要的是,这些异常不被执行,因此,本发明提供一系统,其中响应于执行关键代码,处理器设定掩码值,然后掩码值被用来禁止在执行关键代码期间收到的任何调试异常的执行。在执行关键代码结束时,掩码值被重置以使得该掩码值不再持有禁止了异常的执行的值。因此,在该简单而不失优雅的作法中,可保护关键代码免受在调试过程中同步地产生的异常的影响。此外,许多处理装置处理不同的软件阶层式层级处的数据,存取较低阶层式层级被禁止而较高阶层式层级被允许存取的某些内存区域和系统寄存器。调试异常掩码值可以用来禁止在与软件正运行于的层级相同的阶层式层级执行调试异常,这些异常通常称为再进入(re-entrant)异常。因此,当在某阶层式层级处理指令时,若控制信号表示调试软件将在同一阶层式层级被执行,则调试异常掩码值可以用来避免异常的执行,且当关键代码正在该层级执行时,其可以用来禁止异常的执行。若正在执行关键代码,则重要的是,异常没有在该层级执行,因为储存对于处理器的正确行为而言很重要的值的寄存器可能会被覆写。然而,若控制信号表示将在与当前正执行的代码不同的阶层式层级执行异常(在许多实施例中只允许在更高的阶层式层级执行异常),则由于该其它阶层式层级将有自己的中断寄存器,因此可允许在较低阶层式层级中断关键代码,因为储存重要信息 的寄存器不会被覆写。以这种方式,本发明实施例提供粒度给该系统并且仅禁止在异常的执行可能导致软件故障的阶层式层级执行异常。在一些实施例中,调试电路发出信号至数据处理电路,指示调试异常将要执行,且处理电路依赖于当前调试掩码值而禁止或允许异常的执行。在其它的实施例,若调试掩码值被设定,则调试电路本身通过不使控制信号作用以发送到处理电路,来响应于该当前掩码值。虽然被执行的调试操作可由在外部主机上运行的调试软件来控制,但是在一些实施例中,该调试电路执行由在该数据处理电路上运行的软件控制的调试操作。关键代码可为数个事物,但在一些实施例中,关键代码包括其中断可能会产生软件故障的多个指令。数据处理装置可配置为在执行各种不同的代码时禁止从调试电路收到的异常的执行,但若在代码执行期间禁止该异常的执行是有利的,在该代码中异常的执行可能会产生软件故障。显然地,当执行该代码时禁止异常的执行是非常重要的。该代码可包括数个事物,例如该代码可能是用来储存或恢复用于配置该系统的寄存器值的代码,该代码可包括用于确认、禁用或重新使能中断系统寄存器的代码,或该代码可包括用于储存处理器状态于数据储存装置中的代码或用于从数据储存装置恢复状态的代码。显然地,正确储存和正确恢复处理器的状态是很重要的,因此,最好避免中断该代码。在一些实施例中,该数据处理装置包括数据储存装置,该数据处理装置包括数据储存装置,该数据储存装置被配置为储存与所述多个不同软件阶层式层级相对应的多个调试异常掩码值;该数据处理电路被配置为当切换至所述多个阶层式软件层级中的一者时将该当前调试异常掩码值设定为针对所述阶层式软件层级中的所述一者而存储的该调试异常掩码值的值。在一些实施例中,处理装置可具有储存装置,该储存装置用于储存用于不同软件阶层式层级的调试异常掩码值,当切换为执行该层级处的程序指令时,这些值被用来设定该调试异常掩码值的当前值。储存不同的掩码值用于不同的阶层式层级提供了高程度的粒度和控制。在一些实施例中,该数据处理装置包括状态储存区域,该状态储存区域系用于储存该当前调试异常掩码值,该数据处理电路响应于从一个阶层式软件层级切换至不同的软件阶层式层级而储存该调试异常掩码值的值在该状态储存区域中以用于该一个阶层式层级,并且当切换回该一个阶层式层级时恢复该调试异常掩码值。替代地,取代储存不同阶层式层级的不同掩码值,在离开阶层式层级时,调试异常掩码的值可以被储存在状态储存区域中,然后在返回该层级时,该值可被恢复到该调试异常掩码储存位置,以使得若调试异常在一层级被掩蔽,则当返回到该层级时,该调试异常会再次被掩蔽。在一些实施例中,该数据处理装置包括状态储存区域,该状态储存区域用于储存状态指示符,所述状态指示符的至少一个包括与所述软件阶层式层级的至少一者相对应的调试可允许状态指示符;该数据处理电路被配置为,在执行预定软件阶层式层级处的指令并且该调试软件将在该处理电路上在该预定阶层式层级被执行时,如果针对该预定软件阶层式层级的该调试可允许状态指示符被设为预定可允许值且该当前调试异常掩码值未被设为该第一值,则允许该异常被执行,并且如果该状态指示符未被设为该预定可允许值或者该当前调试异常掩码值被设为该第一值,则不允许该异常被执行。本技术还认知到,在不同阶层式层级对系统的调试可导致在更高阶层式层级中触发异常,在该更高阶层式层级中,也许诸如操作系统代码之类的重要代码可能正被执行且中断该代码可能是不希望的。例如,若系统已经被设立为使得在处理器上运行的操作系统可被调试,则可能希望在某时点处能够禁止该情况发生,从而使得在正常操作期间,异常产生到操作系统中是不允许的。这些异常的产生可导致操作系统的故障并可引起安全问题。因此,本发明实施例提供状态指示符,状态指示符可以设定为允许或不允许在某些阶层式层级进行调试。如此一来,当测试该系统时,例如,所有阶层式层级的调试可被允许,但是当装运该系统时,更高阶层式层级的调试可以通过设定此状态指示符而被禁止。这意味着系统上运行的任何应用可被调试,但装运前已彻底执行测试的操作系统不被允许在内部产生 调试异常。如此是有利的,特别是例如当有用于设定断点寄存器的外部构件时。在该情况下,外部代理可在操作系统内产生异常,且这些异常不会在处理系统的控制下并且可能会导致严重的错误,因此最好避免这些异常。在一些实施例中,该数据处理电路被配置为,在执行预定软件阶层式层级的指令并且该调试软件将在较高预定软件阶层式层级被执行时,响应于从该调试电路接收到指示该调试异常将被执行的该控制信号,允许该异常被执行。在调试异常被执行时,指示调试软件将要在比现在正执行的指令高的预定软件阶层式层级被执行,则该异常总是会被允许执行,因为该较高层级有其自己的寄存器用于储存中断值,因此,即使其要在较低的层级中断关键代码,其也不会造成处理器状态的损坏。在一些实施例中,该数据处理电路被配置为,在响应于一异常从较低软件阶层式层级切换至较高软件阶层式层级时,将该调试异常掩码值设定为该第一值。在执行异常时关键代码被执行,因此,希望处理装置设定掩码值以使得关键代码不能被在此层级执行的另一调试异常中断。调试异常可以采取许多形式,但有可能是监视点,监视点是储存在寄存器中的地址,其中存取或试图存取该地址会触发调试控制信号起作用(assertion),或者其可能是断点,断点也是储存在调试寄存器中的地址,其中执行或试图执行具有此地址的指令会导致调试控制信号起作用。在一些实施例中,该数据处理电路被配置为,响应于从该调试电路接收到指示调试异常将要执行的控制信号及该调试异常掩码值被设定为该第一值,使待决调试异常信号作用,且响应于该掩码被清除而不储存该第一值以执行该待决调试异常。如前面提到的,调试异常是同步异常,因为这些调试异常响应于指令的执行而发生。在掩码值设定为指示该异常不能被触发的第一值的情况中,则在一些实施例中,会产生待决的调试异常信号,并且假如调试可允许状态指示符表示其是可允许的,则当已清除该掩码且不再储存第一值 时,可执行该待决调试异常。此举是所希望的,因为该调试异常指示调试程序的人想要知道处理器的状态。因此,虽然立即的响应受到禁止,因为立即的反应可能会导致软件故障,但是之后的响应是允许的并可能产生有用的信息。在一些实施例中,该数据处理电路被配置为响应于步骤模式控制信号而在步骤模式中执行,在该步骤模式中,程序中的指令以顺序步骤被执行,其中,在该步骤模式中该数据处理电路被配置为在所述顺序指令的每个执行之后使调试异常起作用。一种本发明实施例支持的可能调试模式是步骤模式,其中每个指令被执行,然后调试异常被执行。以此方式,程序被步进通过(stepthrough),并且在执行每个指令后,控制被给予调试软件以使得可以查询寄存器中的值或处理器的其它状态。在一些实施例中,响应于该数据处理电路在所述顺序指令中的一者的执行期间接收到异常,该数据处理装置被配置为将该当前调试异常掩码值设为该第一值并且使待决调试异常作用,并且响应于该当前调试异常掩码值未被设为该第一值,该数据处理电路被配置为执行该待决调试异常。若在逐步(step-wise)模式中在顺序指令的执行期间发生异常,则待决调试异常和调试异常掩码的使用可以帮助确保调试异常在异常中的关键代码执行期间不被执行,但是当掩码已被清除时调试异常会被执行,此举是在关键代码完成时发生的。在一些实施例中,数据处理电路被配置为,当响应于一异常而从较低的软件阶层式层级切换到较高的软件阶层式层级时,设定用于掩蔽不同类型的异常的多个掩码,并且响应于单个指令的执行,重置所有这些掩蔽。除了掩蔽调试异常的掩码以外,还可设定其它掩码以在关键代码的执行期间掩蔽其它异步异常的执行。若是这样的情况,那么若关键代码的结束由单个指令来指示,则执行此指令可触发所有掩码的清除。如此一来,调试掩码的清除并不需要任何额外的代码,因为该调试掩码可与其它掩码一起被清除。在一些实施例中,该单个指令包括指示关键代码的执行已经完成的指 令。应当注意到,掩码的任何子集可在一个指令中被清除或实质上被设定。虽然处理装置的不同阶层式层级可为数种事物,但在一些实施例中,存在第一低层级、第二较高层级和第三最高层级,该第一低层级是应用软件被执行的层级,在第二较高层级中操作系统软件被执行,在第三最高层级中超管理器软件被执行。在一些实施例中,该数据处理装置包括状态储存区域,该状态储存区域用于储存指示符,所述指示符包括状态指示符及进一步捕获指示符,该捕获指示符具有捕获值,该捕获值指示该调试软件将在该超管理器层级被执行;该数据处理电路被配置为,响应于具有该捕获值的该捕获指示符,若该处理电路当前正操作于该超管理器层级并且该状态指示符未被设为该预定可允许值或者该当前调试异常掩码值被设为该第一值,则不允许调试异常的执行,并且若该状态指示符被设为该预定可允许值且该当前调试异常掩码值未被设为该第一值,或者该数据处理电路当前正操作于在阶层上比该超管理器层级低的层级,则允许调试异常在该超管理器层级执行。一种提供粒度的方法是具有单个状态指示符和进一步捕获指示符,单个状态指示符允许或不允许再进入调试异常发生在当前的阶层式层级,以及若当前层级在阶层上低于超管理器层级,则进一步捕获指示符将异常捕获到超管理器层级。在许多情况下,例如图1所示的实施例中,没有高于超管理器层级的层级,然而,若有这样的层级且处理电路在该层级操作,则捕获值不会将异常捕获到超管理器层级,因为异常不能在较低阶层式层级执行。如前提到的,异常总是可在较高的层级执行,因此若异常发生在低于超管理器层级的层级,则其可被执行。若处理电路在超管理器层级操作,则假如状态指示符允许异常的执行且该异常并没有被掩蔽,则其将被执行。本发明的第二方面提供一种用于控制数据处理装置内的调试操作的发起的方法,该数据处理装置被配置为执行与多个不同软件阶层式层级相对应的程序指令,较高软件阶层式层级是具有比较低阶层式软件层级高的权限的层级,以使得有至少一些数据储存位置能从该较高阶层式层级被存取 而不能从该较低阶层式层级被存取,该方法包括下列步骤:响应于该数据处理装置执行关键代码在该数据处理装置内的数据储存装置中将当前调试异常掩码值设为第一值,并且在该关键代码的执行终止时重置该当前调试异常掩码值以不储存该第一值;当该调试软件将在与软件正操作于的层级相同的阶层式层级处被执行时,如果该当前调试异常掩码值不被设为该第一值时,则允许调试异常被执行,并且如果该当前调试异常掩码值被设为该第一值时,则不允许该调试异常被执行;以及当该调试软件将在较高的预定软件阶层式层级处被执行时允许调试异常被执行。本发明的第三方面提供一种计算机程序产品,该计算机程序产品储存计算机程序,当该计算机程序在数据处理器上执行时,该计算机程序可操作以控制该数据处理器执行根据本发明第二方面的方法的步骤。本发明的第四方面提供一种虚拟机,该虚拟机由在数据处理装置上执行的计算机程序所提供,该虚拟机根据本发明第一方面的数据处理装置而提供指令执行环境。本发明的上述和其它对象、特点和优势在下述说明性实施例的详细描述下将是明显的,阅读说明实施例时请参照附图。附图说明图1图示出根据本发明实施例的数据处理装置的阶层式软件层级;图2图示出连接到主机调试器的数据处理装置;图3a图示出KDE设定为0时在EL1层级执行来自EL0层级的异常;图3b图示出KDE设定为1时在EL1层级执行来自EL0层级的异常及响应于调试事件而执行再进入异常;图4图示出KDE设定为1时在EL1层级执行来自EL0层级的异常及响应于发生在调试掩码被设定期间的调试事件而执行再进入异常;图5图示出表示软件步骤调试操作期间所遇到的状态的状态图;图6图示出当执行中的关键代码中断时所发生的步骤的流程图;图7图示出类似图6的流程图,但其中可能会出现多个异常;及图8图示出本发明实施例的虚拟机实施方式。具体实施方式图1示意地图示出根据本发明实施例的数据处理装置的不同阶层式软件层级。在此实施例中,有最高的阶层式层级EL2,该层级包括超管理器。该层级可能有一些调试服务在内部,其中调试器可作为超管理器应用运行,并且超管理器负责对调试硬件编程。下一层级是访客操作系统被执行的EL1层级。这些层级可能也有调试服务在它们内部。再次地,这些调试服务负责对调试硬件编程。第三层级是最低的EL0层级,该层级是应用(App)被执行的层级。这些应用之一可能是调试应用。图2图示出根据本发明实施例的数据处理装置。在此实施例的数据处理装置10连接到主机调试器20。主机调试器经由输入12与数据处理装置10通讯,且传送调试指令至数据处理装置10并接收来自该数据处理装置10的诊断数据。数据处理装置10包括用于执行指令流的处理器30。数据处理装置10还包括调试硬件40、47、48,包括用于储存指示调试异常是否可以被执行的掩码值和状态指示符的数据储存装置40,以及寄存器组42内的用于储存指示调试异常应当被执行的地点的断点和监视点值的寄存器47、48。关于掩码值,可能储存有若干掩码值,每个与特定阶层式层级相关并且用来掩蔽将在该层级执行的调试异常。这些掩码值之一将是当前调试掩码值或掩蔽旗标,当被设定时其禁止调试异常,所述调试异常是将在当前软件阶层式层级被执行的再进入异常。此掩蔽旗标是处理器的状态的一部分,因此,在响应于中断而储存状态时,该值也被储存。掩码值的操作将在后面介绍。在执行中断或其它异常时,也有用于储存处理器的该状态的至少一个储存装置46。如前所述,若处理器正在改变软件阶层式层级,则储存在数据储存装置46中的处理器的状态可包括当前调试掩码值或掩蔽旗标。可能有若干个储存装置46,每个软件阶层式层级都有一个该储存装置46。在例如EL1处执行中断时,处理器的当前状态被储存到用于EL1层级的储存装置46,当切换回EL1处被中断的处理时,从用于EL1的储存装置46恢复该状态。若设定用于EL1的调试掩码,则该值将被储存在储存装置中并且将在状态被恢复时被再次设定。储存装置46在异常被执行时可仅专用于储存处理器的状态的目的,或者储存装置46可为诸如数据存储器之类的较为通用的储存装置的一部分。主机调试器20可自行对调试硬件40、47、48编程并且在主机调试器20内的单独处理器上执行调试软件。替代地,处理器30可能在其软件阶层式层级之一内具有调试服务,且响应于来自主机调试器的信号,这些调试服务可被用来对调试硬件编程。此外,主机调试器20本身可能是在处理器30上执行的程序。断点和监视点值被设置在寄存器47和48中。响应于断点寄存器中的地址出现为正被执行的指令的地址,或响应于监视点寄存器中的地址出现为正被存取的数据位置的地址,产生调试异常。该异常会导致调试软件取得对处理器的控制并与用户沟通,以便将关于此点处的处理器的状态的信息转给调试器。如前所述,在一些情形下,不希望在代码正被执行时执行异常,因此,本发明实施例提供用于在不适合执行这些调试异常时禁止这些调试异常的执行的机制。此种粒度的控制可以不同的方式执行。例如,当操作系统正在执行时执行异常可能是不希望的,但是可能希望能够在装运前调试该操作系统。因此,在EL1层级在操作系统内提供内核调试器但是能够使用禁止旗标(KDE位)来禁止该调试器产生的任何异常的执行可能是有利的。因此,若储存在数据储存装置40中的KDE位清除,则任何断点或监视点会被禁用,使得除非TDE位被设定,否则若这些地址从EL1层级被存取,则不会有异常产生,此举将在后面介绍。如此一来,调试操作系统的能力与禁用此调试的能力一起被提供,使得适当地异常不能被产生于内 核内。因此,该系统在装运前可被完整调试,但在装运后KDE位可被永久清除以使得内核的调试不被允许。还有TDE位储存在数据储存装置40中,此位将由断点或监视点匹配产生的任何异常捕获到EL2层级处的超管理器中,以使得所产生的任何异常在超管理器内被执行和服务。虽然在该实例中数据储存装置40被图示为与寄存器42不同的储存装置,但是这些旗标可被储存在寄存器组42的寄存器内。应注意到,虽然针对EL1层级来描述KDE位,可能也有用于EL2层级的单独KDE位,该单独KDE位禁止在此层级执行调试异常。替代地,在一些实施例中,有单个KDE位,若该TDE位未被设定,则该KDE位涉及EL1层级。若该TDE位被设定,则调试异常被捕获到超管理器层级,并且在一些实施例中TDE位在被设定时用来指示KED位涉及EL2层级。由于被设定的TDE位将任何调试异常捕获到超管理器层级中,因此,若异常发生在EL1层级,则该异常总是可以如在更高的阶层式层级处被执行那样被执行,因此,将单个KDE位用于EL1层级(在TDE未被设定时)和在TDE被设定时用于EL2层级是方便的。以此方式,TDE与KDE位一起能禁止或允许在EL1和EL2层级执行的再进入异常。除了在是否允许内核调试方面提供粒度的能力,也可有在执行特定代码时禁止调试异常的执行的能力。此能力是由当前调试掩码值或掩蔽旗标43提供。在执行特定代码时,掩蔽旗标由处理器30设定。因此,若处理器正在执行EL1层级的代码且该代码是其中断可能会导致软件故障的关键代码,则处理器30设定调试掩蔽旗标。然后,若产生调试异常,则该调试异常不能在此层级执行,因为该掩蔽旗标禁止该调试异常的执行。在一些实施例中,此举可意味着异常从不被执行,而在其它实施例中待决旗标44可被设定。若是如此,当在处理器已经完成执行关键代码后掩蔽旗标被重置时,或许通过软件指令,待决异常可被执行。参照图3a、图3b和图4有对此的更详细描述。在这些图中,一应用正在应用EL0层级上运行并且异常被接收到(此异常可是任何类型的异 常,不只是调试异常)。然后处理器移至EL1层级以处理该异常。最初当在该层级开始执行时,关键代码被执行,其储存处理器的状态,以使得当返回到该应用时可以恢复此状态。重要的是,在该关键代码执行期间,在该层级没有其它的异常被执行,因为这将覆写该正被储存的状态。因此,在此点时,调试掩蔽旗标CPSR.D被设定为1。然后系统异常处理程序被执行,且这会处理该异常。在此处理过程中的某点,系统异常处理程序可能已经完成处理器状态的储存,意味着软件可以离开该关键代码区域且CPSR.D旗标被设定为0。当系统异常处理程序已经完成了其对异常的处理时,其确定必须返回去处理被中断的应用,并且因此会进入另一关键代码区域,并且在原始异常点处的处理器的状态被恢复时,调试掩蔽旗标CPSR.D再次被设定为1。图3a中的KDE位被设定为0,因此在EL1层级不允许调试异常的执行,且禁用所有断点和监视点。因此,不管在关键区域还是在系统异常处理程序的其它区域,在EL1的处理期间没有调试异常被收到。图3b中的KDE位被设定为1,因此在EL1层级允许调试异常的执行,但不在关键代码区域内。这样的再进入调试异常响应于断点而被接收,并且因为在此点上调试掩蔽旗标CPSR.D是0且KDE=1,因此该调试异常被执行且内核使用断点处理程序来处理该异常。当这完成时,有异常返回且内核继续处理系统异常处理程序。当系统异常处理已经完成,则进入关键代码区域,其中调试掩蔽旗标设定为1,并且若任何调试异常在该点处被接收到,其被忽略。图4图示出根据本发明实施例的处理异常的又一实例。再次说明,如图3b中一样,KDE位被设定,并且在应用层级接收并执行异常,且处理切换至EL1层级。关键代码最初被执行用于储存处理器的状态,因此调试掩蔽旗标CPSR.D被设定为1。在该时间期间,发生监视点调试事件,且因为调试掩蔽旗标被设定,所以其不能被执行,然而,因为在此实施例中KDE被设定而不是忽略该监视点,所以待决调试异常旗标被设定为1。因此,当关键代码完成执行时并且该软件已将调试掩蔽旗标重置为0时,待决调试异常旗标向处理器指示有待决的调试异常,因此其在此点处被执行 且内核执行监视点处理程序以处理该异常。执行待决调试异常后,处理器立即储存待决调试掩蔽旗标的当前值(为0值),然后设定其(CPSR.D)为1。然后调试异常处理程序(在此例中是监视点处理程序)被执行,并且当其已完成时,针对该调试掩蔽旗标的所储存值被恢复,在此例中CPSR.D被重置为0。在此点时系统调用处理程序运行,并且当其完成时,软件进入异常返回代码(关键代码),并且因此在此代码执行期间调试异常旗标CPSR.D再次设定为1。虽然在前面的实例中,已经就EL1层级描述了KDE位,但是也可能有与EL2层级有关的KDE位。若KDE位针对特定层级被清除,则在该层级内软件调试事件被禁用。在一些实施例中,即使KDE位在该层级是清除的,也将会有一些调试事件被使能。例如,软件断点指令是一种产生如下调试异常的指令类型:调试器以软件断点指令取代实际的程序指令,来作为在没有硬件断点寄存器42可用时在某位置处设定断点的手段。由于原来的程序指令不再存在,因此忽略这样的调试异常是不安全的,即使当KDE位是清除的也是如此。在TDE位被设定时,则来自EL0或EL1层级的软件调试事件被捕获到EL2层级。因此,若设定了TDE位,则发生在EL0或EL1层级的任何调试事件将不会受到针对EL1层级的KDE位的影响且将在EL2层级处被执行。在一些实施例中,有这样的单个KDE位:当TDE位清除时,该单个KDE位影响EL1层级处的调试异常,且当TDE位被设定时,该单个KDE位影响EL2层级的调试异常。在一些实施例中,调试器被配置为执行简单的软件步骤状态机,其中在每个指令被执行后,处理器被停止并且状态被分析。由于软件步骤是在软件控制下,因此步进也由全局调试使能控制来控制,以使得软件步骤调试器在当前异常层级被使能或禁用。图5图示出指示在示例性软件步骤调试操作期间遇到的状态的状态图。在此图中,有三种类型的代码:“调试器”包括调试器代码本身,例如在EL1执行的代码;“被调试程序”包括正被调试的代码,例如在EL0 层级执行的代码,并且若设定KDE,则为关键代码以外的在EL1执行的代码;以及“关键代码”包括必须不被调试异常中断的代码,亦即,在调试掩蔽旗标CPSR.D被设定时在与调试器(EL1)相同的层级处被执行的代码。在开始步骤过程之前,软件步骤状态机处于不活动状态且调试器代码正在运行。通过设定监视器调试状态中的单一步骤控制旗标和来自EL1层级的控制寄存器(MDSCR_EL1),调试器设置该过程用于步进。然后调试器执行异常返回指令以跳入被调试程序代码。当在被调试程序代码中时,单一步骤调试事件有效,但异常尚未待决。然后处理器执行指令,该指令通常将软件步骤状态机移至有效待决状态。在此时,待决软件步骤调试异常被执行并且返回到调试器,且单一步骤完成。然而,若在指令的执行过程中遇到另一异常,则其会被执行,并且由于关键代码在最初被运行,因此处理器设定调试掩蔽旗标CPSR.D,意味着待决单一步骤调试异常被掩蔽。只有在关键代码已经完成且CPSR.D旗标是清除的时才可执行调试异常。然而,若异常处理程序不清除CPSR.D旗标,则返回到被调试程序代码。若异常处理程序返回来重新执行正步进的指令,则待决的单一步骤调试异常将被清除。可以通过调试掩蔽旗标以及TDE和KDE位获得的粒度被显示于下表中作为一些实例情况。此表展示根据这些旗标的一些配置是否执行调试事件。在此实施例中,调试异常仅在EL1或EL2层级执行。层级TDEKDECPSR.D调试事件的动作前两行601、602显示在EL0处执行时所发生的事。若TDE位是清除的(行601),则在EL1处理EL0处的调试异常。若设定TDE位(行602),则在EL2处处理EL0处的调试异常。注意,CPSR.D旗标和KDE位在EL0没有效果。在此表中,“X”表示“不关心”,意味着该行的动作不依赖于该列的值。接下来四行603、604、605、606显示在EL1处执行时的行为。若TDE和KDE位都是清除的(行603),则忽略调试异常。若设定KDE位并清除TDE位,则调试异常在EL1可能会允许,这取决于CPSR.D旗标值。在行604,亦设定CPSR.D旗标。在该情况下,关键代码在EL1层级被执行。调试事件目前被掩蔽且将被忽略。然而,在行605,CPSR.D旗标是清除的,所以调试异常允许作为至EL1的再进入异常。在行606,设定TDE位,因此忽略KDE位和CPSR.D旗标并在EL2处执行调试异常。其余四行607、608、609、610显示在EL2处执行时的行为。若TDE或KDE位是清除的(行607、608),则调试异常被忽略。然而,若TDE和KDE位皆设定,则调试异常可能在EL2允许,这取决于CPSR.D旗标 值。在行609,亦设定CPSR.D旗标。在该情况下,关键代码正在EL2层级执行。调试事件目前被掩蔽且将被忽略。然而,在行610,CPSR.D旗标是清除的,因此允许调试异常作为至EL2的再进入异常。图6图示出响应于接收中断而执行的步骤。若在EL0层级收到中断,则在EL1层级执行中断异常,且设定调试掩蔽旗标,并且执行用于处理与储存处理器的当前状态相关的中断异常所必需的关键代码。在关键代码执行期间,设定调试掩蔽旗标,以使得若调试事件发生,则除非设定TDE位或KDE位,否则其会被忽略。在此实施例中,若没有设定TDE位但设定KDE位,则设定待决调试异常旗标。若设定TDE位,则异常被捕获到该异常被处理的EL2层级,并且然后在返回时关键代码的执行被完成,且没有待决调试异常旗标被设定。在其它实施例中,可设定待决调试异常旗标用于特定类型的调试异常而不用于其它的(其被忽略),或可完全不设定待决调试异常旗标。关键代码执行完毕后,调试掩蔽旗标被重置,并判断调试异常待决旗标是否被设定。若其被设定,则执行待决调试异常;若没有,则继续该中断异常的执行。图7是类似图6的流程图,但更为复杂,因为图7额外图示出在多个调试事件在关键代码的执行过程中发生可能会发生的事。因此,再次,接收和执行针对EL1的中断,执行关键代码,因此设定调试掩码。然后判断是否发生调试事件或指示调试事件正待决的待决旗标是否设定。若任一者为真,则设定TDE位,然后在EL2执行异常。否则,若未设定KDE位,从而使得在EL1层级不允许调试,则事件将被忽略。若设定指示调试被允许的KDE位,则判断是否调试掩码是否仍被设定(关键代码是否仍在执行),若是则设定待决旗标,若不是则在EL1执行再进入异常。待决旗标是累积的,这意味着若待决旗标已经设定,则该待决旗标维持设定。若没有执行异常,或若没有调试事件发生,则判断调试掩码是否仍被设定。若否,则判断处理器是否在处理关键代码的起始处,若是,则设定调试掩蔽旗标,若否,则不设定调试掩蔽旗标。若调试掩码仍被设定,则 判断处理器是否在执行关键代码的结束处,若是,则清除调试掩蔽旗标,若否,则不清除调试掩蔽旗标。然后判断是否已经达到了中断处理程序的结尾。若是,则执行自异常至EL0的返回,若不是,则再次判断是否已发生调试事件并重复方法步骤。图8图示出可使用的虚拟机(VM)实施方式。虽然在前面描述的实施例以用于操作支持所考虑技术的具体处理硬件的装置和方法的方式来实施本发明,但是也有可能提供所谓的硬件设备的虚拟机实施方式。这些虚拟机实施方式在主机处理器530上运行,主机处理器530运行主机操作系统520,主机操作系统520支持虚拟机程序510。通常情况下,需要以合理速度执行的大型的强大处理器来提供虚拟机实施方式,但该做法可能在某些情况下是合理的,例如为了兼容或再使用原因,当希望执行对另一个处理器而言为本地的代码时。虚拟机程序510提供应用程序接口给应用程序500,应用程序接口与真实硬件所提供的应用程序接口相同,真实硬件是由虚拟机程序510建模的设备。因此,包括如上所述的对内存存取的控制在内的程序指令可使用虚拟机程序510从应用程序500内执行,以建模所述程序指令与虚拟机硬件的互动。虽然已参考附图详细描述本发明的说明性实施例,可以理解本发明不仅限于那些精确的实施例,在不脱离后附权利要求定义的本发明范围和精神的情况下,本领域技术人员可执行各种变化和修改。例如,在不脱离本发明的范围的情况下,可以将以下从属权利要求的特征与独立权利要求的特征执行组合。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1