用于在程序代码转换过程中准确地处理异常的方法和设备转让专利

申请号 : CN200680013311.5

文献号 : CN101164041B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 加文·巴勒克拉夫万奇曼阿贝杜尔·R·胡梅达

申请人 : 国际商业机器公司

摘要 :

本发明公开了用于在程序代码转换过程中准确地处理异常的方法和设备。准确的异常处理依赖于准确的主体状态,包括精确的程序计数器和主体处理器的寄存器值。主体代码(17)被转换成可由目标处理器(13)执行的目标代码(21)。生成的目标代码(17)包括与易发生错误的主体代码指令(174)关联的对等目标指令(214)。此外,每一个对等目标代码指令(214)都与恢复信息(195)关联。当发生异常(例如,错误)时,检索恢复信息(195),并将其用于恢复准确的主体状态,具体来说,通过考虑优化以生成共同的目标常见的情况的目标代码(21)。然后,使用准确的主体状态来准确地处理异常。

权利要求 :

1.一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的方法,包括下列步骤:(a)根据主体指令集体系结构,对可由主体处理器执行的所述主体代码(17)进行解码;

(b)从所述主体代码(17)生成目标代码(21);以及

(c)根据目标指令集体系结构,在目标处理器(13)上执行所述目标代码(21);

其特征在于:

步骤(a)包括识别潜在地会在所述主体指令集体系结构中发生错误的易发生错误的指令(174);

步骤(b)包括从所述识别的易发生错误的主体指令生成一个或多个对等目标指令(214),并存储与所述对等目标指令(214)或每一个所述对等目标指令(214)关联的恢复信息(195);以及所述方法进一步包括:

(d)当在执行所述对等目标指令(214)或其中一个所述对等目标指令(214)时指出发生了错误时,那么,执行下列步骤:(i)检索与所述对等目标指令(214)关联的所述恢复信息(195);

(ii)使用所述恢复信息(195),恢复准确地代表发生错误时所述主体处理器的准确的主体状态;以及(iii)使用所述准确的主体状态,准确地处理所述错误,

其中,生成所述目标代码(21)的过程包括执行一次或多次代码优化,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。

2.根据权利要求1所述的方法,其中,生成所述目标代码的过程包括执行一次或多次代码优化,在所述一次或多次对等目标指令(214)中留下不准确的主体状态,所述恢复信息(195)使得可以从所述可用的不准确主体状态获得准确的主体状态。

3.根据权利要求1所述的方法,其中,所述准确的主体状态至少包括一个精确的主体程序计数器。

4.根据权利要求1所述的方法,其中,所述准确的主体状态至少包括代表所述主体处理器的主体寄存器的精确的寄存器值。

5.根据权利要求1所述的方法,其中,存储所述恢复信息(195)的过程包括紧随在所述生成的目标代码(21)之后立即存储所述恢复信息(195)。

6.根据权利要求5所述的方法,其中,检索恢复信息(195)的过程包括下列步骤:对所述目标代码(21)进行扫描以定位紧随其后的所述恢复信息(195);以及检索与所述相应的对等目标指令(214)关联的所述恢复信息(195)。

7.根据权利要求1所述的方法,包括:

将所述主体代码(17)划分为多个代码块;

生成多个目标代码块(21);以及

存储在所述生成的目标代码块(21)之间的恢复信息(195)。

8.根据权利要求1所述的方法,包括存储将所述目标代码(21)与所述恢复信息(195)分开的标记(196),通过从指出错误的所述对等目标指令(214)进行扫描以定位标记(196),然后从标记(196)扫描以定位所述关联的恢复信息(195),来检索所述恢复信息(195)。

9.根据权利要求1所述的方法,包括存储所述恢复信息(195),所述恢复信息由表示所述关联的对等目标指令(214)的目标程序计数器索引。

10.根据权利要求1所述的方法,其中,恢复所述准确的主体状态的过程包括将所述检索到的恢复信息(195)传递到恢复处理器(215),获取当前可用的主体状态,以及使用所述恢复信息(195)修改所述当前可用的主体状态,以提供所述准确的主体状态。

11.根据权利要求1所述的方法,包括将所述恢复信息(195)传递到恢复处理器(215),以及根据所述恢复信息(195),从所述恢复处理器(215)调用一个或多个本机代码恢复例程。

12.根据权利要求1所述的方法,其中,所述恢复信息(195)包括目标程序计数器值(195a)和主体程序计数器值(195b)。

13.根据权利要求12所述的方法,其中,所述恢复信息(195)进一步包括一组恢复指示符(195c),它们表示在对等目标代码指令处未完成的代码优化。

14.根据权利要求12所述的方法,其中,所述恢复信息(195)进一步包括映射模板(195d),用于标识目标寄存器与对等目标指令(214)处适用的抽象主体寄存器的映射。

15.根据权利要求1所述的方法,其中,所述恢复信息(195)以压缩的形式存储。

16.根据权利要求12所述的方法,其中,所述恢复信息(195)包括相对于以完整的程序计数器值作为基准值存储的一个目标代码块(21)的第一恢复信息项(195),以及一个或多个随后的恢复信息项(195),每一个恢复信息项都包括程序计数器值作为与基准值的偏移。

17.根据权利要求1所述的方法,进一步包括下列步骤:

当在目标代码(21)的执行过程中,在所述目标处理器(13)上接收到中断信号时,继续执行所述目标代码(21),直到遇到所述对等目标指令(214)或其中一个所述对等目标指令(214);

检索与所述相应的对等指令关联的所述恢复信息(195),并恢复所述准确的主体状态;

使用所述准确的主体状态,准确地处理所述中断。

18.一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的方法,所述方法包括下列步骤:(a)将可由主体处理器执行的所述主体代码(17)转换为可由目标处理器(13)执行的目标代码(21);以及(b)在所述目标处理器(13)上执行所述目标代码(21);

其特征在于,步骤(a)进一步包括:

(a1)标识所述主体代码(17)中的易发生错误的指令(174);

(a2)生成一个或多个对等目标代码指令作为易发生错误的主体指令的对等物;

(a3)存储与所述对等目标指令(214)或每一个所述对等目标指令(214)关联的恢复信息(195);以及其中,步骤(b)进一步包括:

(b1)当相对于所述对等目标指令(214)或其中一个所述对等目标指令(214)发生异常时,定位与所述发生错误的对等目标指令(214)关联的所述恢复信息(195);

(b2)根据所述定位的恢复信息(195),执行恢复例程,以纠正代表所述主体处理器的准确的主体状态,所述经过纠正的主体状态准确地代表发生错误时所述主体处理器;以及(b3)调用异常处理器以相对于经过纠正的准确的主体状态处理所述异常;

其中,步骤(a)还包括执行一次或多次代码优化,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。

19.一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的方法,其特征在于,包括下列步骤:生成目标代码(21),包括对应于所述主体代码(17)中的潜在地易发生错误的主体指令的至少一个对等目标指令(214),并存储与所述至少一个对等目标指令(214)关联的恢复信息(195);

在接收到中断时,继续执行目标代码指令,直到遇到所述至少一个对等目标指令(214);

在到达所述对等目标指令(214)时,使用所述关联的恢复信息(195)恢复准确地代表发生错误时主体处理器的准确的主体状态;以及使用所述已恢复的准确的主体状态,准确地处理所述中断;

其中,生成所述目标代码(21)的过程包括执行一次或多次代码优化,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。

20.根据权利要求19所述的方法,包括,在接收到所述中断时,逐个地执行所述目标代码指令。

21.根据权利要求20所述的方法,包括在目标处理器(13)中调用步进模式,以逐个地执行所述目标指令。

22.根据权利要求20所述的方法,包括调用目标代码解释器(197)以逐个地解释所述目标代码指令。

23.一种用于在从主体代码(17)到目标代码(21)的动态二进制转换过程中准确地处理异常的方法,包括下列步骤:从主体代码指令的序列生成目标代码指令的序列;以及

执行所述目标代码指令的序列;

其特征在于:

当发生异常时,沿着目标代码指令的所述序列向前滚动,直到遇到能实现准确地代表发生错误时主体处理器的准确的主体状态的目标代码指令;以及推迟所述异常的处理,直到能实现所述准确的主体状态;

其中,该目标代码指令的序列包括对应于主体代码中的潜在地易发生错误的主体指令的至少一个对等目标代码指令,所述至少一个对等目标代码指令关联恢复信息;

其中,生成目标代码指令的序列的过程包括执行一次或多次代码优化,以及,其中,所述恢复信息提供涉及所述一次或多次代码优化的信息。

24.一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的转换器设备,包括:用于根据主体指令集体系结构,对可由主体处理器执行的所述主体代码(17)进行解码的装置,用于从所述主体代码(17)生成目标代码(21)的装置;以及

用于根据目标指令集体系结构,在目标处理器(13)上执行所述目标代码(21)的装置;

其特征在于:

所述用于根据主体指令集体系结构对可由主体处理器执行的主体代码(17)进行解码的装置包括用于识别潜在地会在所述主体指令集体系结构中发生错误的易发生错误的指令(174)的装置;以及所述用于从所述主体代码(17)生成目标代码(21)的装置包括用于从所述识别的易发生错误的主体指令生成一个或多个对等目标指令(214),并存储与所述对等目标指令(214)或每一个所述对等目标指令(214)关联的恢复信息(195)的装置;

其中,所述设备进一步包括:

用于当在执行所述对等目标指令(214)或其中一个所述对等目标指令(214)时指出发生了错误时,检索与所述对等目标指令(214)关联的所述恢复信息(195),使用所述恢复信息(195)恢复准确地代表发生错误时所述主体处理器的准确的主体状态,并使用所述准确的主体状态准确地处理所述错误的装置;

其中,用于从所述主体代码(17)生成目标代码(21)的装置包括用于执行一次或多次代码优化的装置,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。

25.一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的转换器设备,包括:用于将可由主体处理器执行的所述主体代码(17)转换为可由目标处理器(13)执行的目标代码(21)的装置;以及用于在所述目标处理器(13)上执行所述目标代码(21)的装置;

其特征在于:

用于将可由主体处理器执行的所述主体代码(17)转换为可由目标处理器(13)执行的目标代码(21)的装置进一步包括:用于标识所述主体代码(17)中的易发生错误的指令(174),生成一个或多个对等目标代码指令作为所述易发生错误的主体指令的对等物,并存储与所述对等目标指令(214)或所述一个或多个对等目标指令(214)中的每一个对等目标指令(214)关联的恢复信息(195)的装置;以及所述用于执行所述目标代码(21)的装置进一步包括:用于当相对于所述对等目标指令(214)或其中一个所述对等目标指令(214)发生异常时,定位与所述发生错误的对等目标指令(214)关联的所述恢复信息(195),根据所述定位的恢复信息(195),执行恢复例程,以纠正代表所述主体处理器的准确的主体状态,并调用异常处理器(170)以相对于所述经过纠正的准确的主体状态处理所述异常的装置,所述经过纠正的准确的主体状态准确地代表发生错误时所述主体处理器;

其中,用于将可由主体处理器执行的所述主体代码(17)转换为可由目标处理器(13)执行的目标代码(21)的装置还包括用于执行一次或多次代码优化的装置,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。

26.一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的转换器设备,包括:用于生成所述目标代码(21),包括对应于所述主体代码(17)中的潜在地易发生错误的主体指令的至少一个对等目标指令(214),并存储与所述至少一个对等目标指令(214)关联的恢复信息(195)的装置,以及用于在接收到中断时,继续执行目标代码指令,直到遇到所述至少一个对等目标指令(214)的装置;

用于在遇到所述至少一个对等目标指令(214)时,使用所述关联的恢复信息(195)恢复准确地代表发生错误时主体处理器的准确的主体状态的装置,以及用于使用所述已恢复的准确的主体状态,准确地处理所述中断的装置;

其中,所述用于生成所述目标代码(21),包括对应于所述主体代码(17)中的潜在地易发生错误的主体指令的至少一个对等目标指令(214),并存储与所述至少一个对等目标指令(214)关联的恢复信息(195)的装置包括用于执行一次或多次代码优化的装置,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。

27.一种用于在从主体代码(17)到目标代码(21)的动态二进制转换过程中准确地处理异常的转换器设备,包括:用于从主体代码指令的序列生成目标代码指令的序列的装置;以及

用于执行所述目标代码指令的序列的装置;

用于当发生异常时,沿着目标代码指令的所述序列向前滚动,直到遇到能实现准确地代表发生错误时主体处理器的准确的主体状态的目标代码指令的装置;以及用于推迟对所述异常进行处理直到能够实现所述准确的主体状态的装置;

其中,该目标代码指令的序列包括对应于主体代码中的潜在地易发生错误的主体指令的至少一个对等目标代码指令,所述至少一个对等目标代码指令关联恢复信息;

其中,所述用于从主体代码指令的序列生成目标代码指令的序列的装置包括用于执行一次或多次代码优化的装置,以及,其中,所述恢复信息提供涉及所述一次或多次代码优化的信息。

说明书 :

用于在程序代码转换过程中准确地处理异常的方法和设备

技术领域

[0001] 本发明一般涉及计算机和计算机软件的领域,具体来说,涉及用于例如转换程序代码的代码转换器,仿真器和加速器中的程序代码转换方法和设备。

背景技术

[0002] 在嵌入式和非嵌入式CPU中,有占主导地位的指令集体系结构(ISA),对于这些指令集体系结构,存在大量的为了性能而可以被“加速”的软件,或“转换”为无数的可能提供更好的开销/性能优点的处理器,假设它们可以透明地访问有关的软件。也会找到主导的CPU体系结构,它们在时间上锁定于ISA,并且在性能或市场销售方面不能有所发展。这样的CPU将受益于面向软件的处理器共同体系结构。
[0003] PCT申请WO00/22521说明了有助于这样的加速、转换和共同体系结构功能的程序代码转换方法和设备。
[0004] 与主体程序在主体处理器上的本机执行相比,执行程序代码转换会在转换过程中带来开销。相对于异常的处理,会产生特定困难。
[0005] 异常是指改变程序中的正常的控制流的状况。异常表明,在系统内的某处发生了需要处理器注意并且通常需要在处理过程可以继续之前加以处理的状况。异常可以细分为各种不同类型,如中断、错误、陷阱或中止。术语在不同体系结构之间有所不同,特定的异常类型或类别可以是特定体系结构所特有的。
[0006] 可以由硬件或软件生成(“引发”)异常。硬件异常包括诸如重置、中断之类的信号,或来自存储器管理单元的信号。作为示例,异常可以由算术逻辑单元或浮点单元为诸如“除以零”之类的数值错误,为溢 出或下溢,或为诸如有特权的、预留的,陷阱或未定义指令之类的指令解码错误来生成异常。
[0007] 软件异常在各种软件程序之间也有所不同,并可以应用于修改了程序的正常行为的任何类型的错误检查。作为说明性示例,如果一个寄存器的值大于第二个寄存器的值,主体代码中的指令导致异常被报告。
[0008] 异常处理器是当在执行程序的过程中发生异常时调用的特殊代码。如果主体程序不为给定异常提供处理器,则将调用默认系统异常处理器,通常导致正在运行的程序中止,并返回错误指示。
[0009] 异常信号是用于在许多操作系统上引发异常的常见的机制。被许多操作系统(特别是类似于Unix的系统)遵循的POSIX标准,说明了此机制应该如何运转以便异常信号在许多系统之间都类似。触发异常的最常见的事件是当由程序实现的进程试图(i)访问取消映射的存储器区域或(ii)操纵它没有正确的权限的存储器区域。触发异常信号的其他常见的事件是(iii)接收到从另一个进程发送的信号,(iv)由一个进程执行该进程没有特权来执行的指令,或(v)硬件中的I/O事件。
[0010] 本发明主要讨论对异常的准确的处理,常常还简称为“准确的异常”。在主体代码指令之间的边界上报告准确的异常。当报告了准确的异常时,所有以前的主体指令的效果都是完整的,异常指向主体代码的没有执行的第一指令,该主体指令或任何后续指令的效果还没有产生。
[0011] 在二进制转换的上下文中,显然,当在目标处理器上执行目标指令并导致异常被报告时,目标指令一般将不会满足将准确的异常报告给以主体代码编写的异常处理器的条件。指令通常按照与指令在对应的主体代码块中的顺序不同的顺序来在目标处理器上执行,首先由于编写主体代码所针对的主体处理器的指令集和目标代码在其上面运行的目标处理器之间的区别,其次由于通常在程序代码转换过程中发生的优化。
[0012] 一个已知方法是使用“恢复点”,它们将虚拟主体机器返回到在进入到正在被转换或执行的一部分代码时应用的状况,即,通过将虚拟主体机器返回到进入到正在被转换或执行的当前主体代码指令块时占优势的状况。
[0013] US 5832205(Kelly等)公开了一种仿真器,该仿真器使用一组“工作”寄存器,然后,使用栅极存储缓冲器,将该组“工作”寄存器复制到主体代码的每一部分的末尾处的一组“正式”虚拟主体寄存器。如果发生异常,这将只影响工作寄存器,可以从进入点处的“正式”寄存器中将虚拟主体机器的状况恢复到主体代码的那一部分。然而,使用“工作”和“正式”寄存器将会使目标处理器中的模拟进程的开销显著增大。
[0014] 作为另一个示例,已发表的PCT申请WO-A-00/65440说明了在A和B寄存器组之间交替,以提供程序代码转换过程中的历史恢复点。
[0015] 已公开的PCT申请WO-A-2005/006106公开了另一种方法:通过为主体程序中的多种类型的指令中的每一种指令记录不同级别的细节,应用精确性可变的异常处理。即,要记录的信息的量和类型随着主体指令的特征不同而不同。适当地,判断每一个主体指令是四种类型中的一种,并记录对应的级别的细节。第一级别完全不记录状态。第二级别使用最后一个已知的堆栈帧来提供不精确的(不准确的)状态信息。第三级别在临时抽象寄存器中记录转换过程中的准确的主体程序计数器,然后检索该计数器以便对异常进行处理。第四级别生成并安插额外的目标代码,以纠正引发了异常的目标指令(特别是触发了异常的陷阱型指令)紧前面的准确的状态(即,记录主体程序计数器,并纠正任何懒惰或挂起的主体寄存器值)。所附权利要求的前序部分基于此文档。
[0016] 这些以前的方法依赖于记录信息,利用该记录信息,通过回滚到预先定义的恢复点或通过纠正该点前面的主体状态,可使发生异常时的主体处理器状态得到准确确定。然而,在现有技术中,获取用于进 行准确的异常处理的准确的状态仍对程序代码转换过程有较大的限制,并产生相当大的开销和/或需要特定的硬件支持。

发明内容

[0017] 本发明的目的是改善进行程序代码转换时的性能。
[0018] 本发明的一个优选的目的是缩小在进行程序代码转换过程中,特别是在进行动态二进制转换过程中与对异常进行处理关联的开销。
[0019] 本发明的实施例的另一个优选目的是缩小与提供用于对异常进行准确的处理的准确的主体状态关联的开销。
[0020] 根据本发明,提供了如所附权利要求中所阐述的设备和方法。根据相关的权利要求,以及随后的描述,本发明的优选特征将变得显而易见。
[0021] 下面是根据本发明的实施例可实现的各种方面和优点的摘要。它是作为引言提供的,以帮助本领域技术人员比较快速地吸收详细的设计讨论,该讨论不以任何方式限制所附的权利要求的范围。
[0022] 具体来说,发明人开发了旨在加速程序代码转换的方法,特别与提供主体程序代码到目标代码的动态二进制转换的运行时转换器一起使用。
[0023] 在本发明的一个方面,提供了在从主体代码到目标代码的程序代码转换的情况下准确地处理异常的方法。该方法包括从容易发生错误的主体代码指令生成包括一个或多个对等目标指令的目标代码。每一个对等目标代码指令都与恢复信息关联。在执行目标代码指令的过程中发生异常(例如,错误)之后,检索恢复信息,并将其用于纠正准确的主体状态。
[0024] 优选情况下,恢复信息考虑了在目标代码生成过程中执行的优化。适当地,使用恢复信息来执行恢复例程,这些例程在容易发生错误的主体代码指令处纠正代表主体处理器的准确的主体状态。
[0025] 优选情况下,该方法包括紧随在生成的目标代码之后立即存储一个或多个恢复信息项。检索恢复信息的过程包括对目标代码进行扫描 以定位随后的恢复信息,以及检索与相应的发生错误的对等目标指令关联的恢复信息项。
[0026] 优选情况下,目标代码和恢复信息在代码块之间是交织的。
[0027] 在特定优选实施例中,使用目标程序计数器来索引恢复信息。
[0028] 在本发明的第二个方面,提供了准确地处理从主体代码到目标代码的程序代码转换过程中所存在的异常的方法,包括生成目标代码的步骤,该目标代码包括对应于主体代码中的潜在地发生错误的主体指令的至少一个对等目标指令,并存储与所述至少一个对等目标指令关联的恢复信息。在接收到中断信号时,继续执行目标代码指令,直到遇到一个对等目标指令。在到达对等目标指令时,检索关联的恢复信息,并将其用于恢复准确的主体状态。
[0029] 在优选实施例中,准确的异常处理方法从发生异常的点向前滚动,直到使用存储的恢复信息可恢复准确的主体状态。适当地,继续逐个地执行目标代码指令,优选情况下,通过调用目标代码解释器或调用步进式目标处理器模式。
[0030] 本发明还扩展到用于执行这里所定义的任何一个方法的转换器设备。此外,本发明还扩展到在其上记录了可由计算机实现的指令以执行这里所定义的任何一个方法的计算机可读取的存储介质。
[0031] 本发明实施例公开的一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的方法,包括下列步骤:
[0032] (a)根据主体指令集体系结构,对可由主体处理器执行的所述主体代码(17)进行解码;
[0033] (b)从所述主体代码(17)生成目标代码(21);以及
[0034] (c)根据目标指令集体系结构,在目标处理器(13)上执行所述目标代码(21); [0035] 其特征在于:
[0036] 步骤(a)包括识别潜在地会在所述主体指令集体系结构中发生错误的易发生错误的指令(174);
[0037] 步骤(b)包括从所述识别的易发生错误的主体指令生成一个或 多个对等目标指令(214),并存储与所述对等目标指令(214)或每一个所述对等目标指令(214)关联的恢复信息(195);以及
[0038] 所述方法进一步包括:
[0039] (d)当在执行所述对等目标指令(214)或其中一个所述对等目标指令(214)时指出发生了错误时,那么,执行下列步骤:
[0040] (i)检索与所述对等目标指令(214)关联的所述恢复信息(195);
[0041] (ii)使用所述恢复信息(195),恢复准确地代表发生错误时所述主体处理器的准确的主体状态;以及
[0042] (iii)使用所述准确的主体状态,准确地处理所述错误。
[0043] 其中,生成所述目标代码(21)的过程包括执行一次或多次代码优化,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。
[0044] 其中,生成所述目标代码的过程包括执行一次或多次代码优化,在所述一次或多次对等目标指令(214)中留下不准确的主体状态,所述恢复信息(195)使得可以从所述可用的不准确主体状态获得准确的主体状态。
[0045] 其中,所述准确的主体状态至少包括一个精确的主体程序计数器。 [0046] 其中,所述准确的主体状态至少包括代表所述主体处理器的主体寄存器的精确的寄存器值。
[0047] 其中,存储所述恢复信息(195)的过程包括紧随在所述生成的目标代码(21)之后立即存储所述恢复信息(195)。
[0048] 其中,检索恢复信息(195)的过程包括下列步骤:
[0049] 对所述目标代码(21)进行扫描以定位紧随其后的所述恢复信息(195);以及 [0050] 检索与所述相应的对等目标指令(214)关联的所述恢复信息(195)。 [0051] 该方法包括:
[0052] 将所述主体代码(17)划分为多个代码块;
[0053] 生成多个目标代码块(21);以及
[0054] 存储在所述生成的目标代码块(21)之间的恢复信息(195)。
[0055] 该方法包括存储将所述目标代码(21)与所述恢复信息(195)分开的标记(196),通过从指出错误的所述对等目标指令(214)进行扫描以定位标记(196),然后从标记(196)扫描以定位所述关联的恢复信息(195),来检索所述恢复信息(195)。
[0056] 该方法包括存储所述恢复信息(195),所述恢复信息由表示所述关联的对等目标指令(214)的目标程序计数器索引。
[0057] 其中,恢复所述准确的主体状态的过程包括将所述检索到的恢复信息(195)传递到恢复处理器(215),获取当前可用的主体状态,以及使用所述恢复信息(195)修改所述当前可用的主体状态,以提供所述准确的主体状态。
[0058] 该方法包括将所述恢复信息(195)传递到恢复处理器(215),以及根据所述恢复信息(195),从所述恢复处理器(215)调用一个或多个本机代码恢复例程。 [0059] 其中,所述恢复信息(195)包括目标程序计数器值(195a)和主体程序计数器值(195b)。
[0060] 其中,所述恢复信息(195)进一步包括一组恢复指示符(195c),它们表示在对等目标代码指令处未完成的代码优化。
[0061] 其中,所述恢复信息(195)进一步包括映射模板(195d),用于标识目标寄存器与对等目标指令(214)处适用的抽象主体寄存器的映射。
[0062] 其中,所述恢复信息(195)以压缩的形式存储。
[0063] 其中,所述恢复信息(195)包括相对于以完整的程序计数器值作为基准值存储的一个目标代码块(21)的第一恢复信息项(195),以及一个或多个随后的恢复信息项(195),每一个恢复信息项都包括程序计数器值作为与基准值的偏移。
[0064] 该方法进一步包括下列步骤:
[0065] 当在目标代码(21)的执行过程中,在所述目标处理器(13)上接收到中断信号时,继续执行所述目标代码(21),直到遇到所述对等目标指令(214)或其中一个所述对等目标指令(214);
[0066] 检索与所述相应的对等指令关联的所述恢复信息(195),并恢复所述准确的主体状态;
[0067] 使用所述准确的主体状态,准确地处理所述中断。
[0068] 本发明实施例公开的一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的方法,所述方法包括下列步骤:
[0069] (a)将可由主体处理器执行的所述主体代码(17)转换为可由目标处理器(13)执行的目标代码(21);以及
[0070] (b)在所述目标处理器(13)上执行所述目标代码(21);
[0071] 其特征在于,步骤(a)进一步包括:
[0072] (a1)标识所述主体代码(17)中的易发生错误的指令(174);
[0073] (a2)生成一个或多个对等目标代码指令作为易发生错误的主体指令的对等物; [0074] (a3)存储与所述对等目标指令(214)或每一个所述对等目标指令(214)关联的恢复信息(195);以及
[0075] 其中,步骤(b)进一步包括:
[0076] (b1)当相对于所述对等目标指令(214)或其中一个所述对等目标指令(214)发生异常时,定位与所述发生错误的对等目标指令(214)关联的所述恢复信息(195); [0077] (b2)根据所述定位的恢复信息(195),执行恢复例程,以纠正代表所述主体处理器的准确的主体状态,所述经过纠正的主体状态准确地代表发生错误时所述主体处理器;以及
[0078] (b3)调用异常处理器以相对于经过纠正的准确的主体状态处理所述异常; [0079] 其中,步骤(a)还包括执行一次或多次代码优化,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。
[0080] 本发明实施例公开的一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的方法,其特征在于,包括下列步骤:
[0081] 生成目标代码(21),包括对应于所述主体代码(17)中的潜在地易发生错误的主体指令的至少一个对等目标指令(214),并存储与所述至少一个对等目标指令(214)关联的恢复信息(195);
[0082] 在接收到中断时,继续执行目标代码指令,直到遇到所述至少一个对等目标指令(214);
[0083] 在到达所述对等目标指令(214)时,使用所述关联的恢复信息(195)恢复准确地代表发生错误时所述主体处理器的准确的主体状态;以及
[0084] 使用所述已恢复的准确的主体状态,准确地处理所述中断;
[0085] 其中,生成所述目标代码(21)的过程包括执行一次或多次代码优化,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。
[0086] 该方法包括,在接收到所述中断时,逐个地执行所述目标代码指令。 [0087] 该方法包括在所述目标处理器(13)中调用步进模式,以逐个地执行所述目标指令。
[0088] 该方法包括调用目标代码解释器(197)以逐个地解释所述目标代码指令。 [0089] 本发明实施例公开的一种用于在从主体代码(17)到目标代码(21)的动态二进制转换过程中准确地处理异常的方法,包括下列步骤:
[0090] 从主体代码指令的序列生成目标代码指令的序列;以及
[0091] 执行所述目标代码指令的序列;
[0092] 其特征在于:
[0093] 当发生异常时,沿着目标代码指令的所述序列向前滚动,直到遇到能实现准确地代表发生错误时所述主体处理器的准确的主体状态 的目标代码指令;以及 [0094] 推迟所述异常的处理,直到能实现所述准确的主体状态;
[0095] 其中,该目标代码指令的序列包括对应于主体代码中的潜在地易发生错误的主体指令的至少一个对等目标代码指令,所述至少一个对等目标代码指令关联恢复信息; [0096] 其中,生成目标代码指令的序列的过程包括执行一次或多次代码优化,以及,其中,所述恢复信息提供涉及所述一次或多次代码优化的信息。
[0097] 本发明实施例公开的一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的转换器设备,包括:
[0098] 用于根据主体指令集体系结构,对可由主体处理器执行的所述主体代码(17)进行解码的装置,
[0099] 用于从所述主体代码(17)生成目标代码(21)的装置;以及
[0100] 用于根据目标指令集体系结构,在目标处理器(13)上执行所述目标代码(21)的装置;
[0101] 其特征在于:
[0102] 所述用于根据主体指令集体系结构对可由主体处理器执行的主体代码(17)进行解码的装置包括用于识别潜在地会在所述主体指令集体系结构中发生错误的易发生错误的指令(174)的装置;以及
[0103] 所述用于从所述主体代码(17)生成目标代码(21)的装置包括用于从所述识别的易发生错误的主体指令生成一个或多个对等目标指令(214),并存储与所述对等目标指令(214)或每一个所述对等目标指令(214)关联的恢复信息(195)的装置;
[0104] 其中,所述设备进一步包括:
[0105] 用于当在执行所述对等目标指令(214)或其中一个所述对等目标指令(214)时指出发生了错误时,检索与所述对等目标指令(214)关联的所述恢复信息(195),使用所述恢复信息(195)恢复准确地代表发生错误时所述主体处理器的准确的主体状态,并使用所述准确的主体状态准确地处理所述错误的装置;
[0106] 其中,用于从所述主体代码(17)生成目标代码(21)的装置包括用于执行一次或多次代码优化的装置,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。
[0107] 本发明实施例公开的一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的转换器设备,包括:
[0108] 用于将可由主体处理器执行的所述主体代码(17)转换为可由目标处理器(13)执行的目标代码(21)的装置;以及
[0109] 用于在所述目标处理器(13)上执行所述目标代码(21)的装置;
[0110] 其特征在于:
[0111] 用于将可由主体处理器执行的所述主体代码(17)转换为可由目标处理器(13)执行的目标代码(21)的装置进一步包括:用于标识所述主体代码(17)中的易发生错误的指令(174),生成一个或多个对等目标代码指令作为所述易发生错误的主体指令的对等物,并存储与所述对等目标指令(214)或所述一个或多个对等目标指令(214)中的每一个对等目标指令(214)关联的恢复信息(195)的装置;以及
[0112] 所述用于执行所述目标代码(21)的装置进一步包括:用于当相对于所述对等目标指令(214)或其中一个所述对等目标指令(214)发生异常时,定位与所述发生错误的对等目标指令(214)关联的所述恢复信息(195),根据所述定位的恢复信息(195),执行恢复例程,以纠正代表所述主体处理器的准确的主体状态,并调用异常处理器(170)以相对于所述经过纠正的准确的主体状态处理所述异常的装置,所述经过纠正的准确的主体状态准确地代表发生错误时所述主体处理器;
[0113] 其中,用于将可由主体处理器执行的所述主体代码(17)转换为可由目标处理器(13)执行的目标代码(21)的装置还包括用于执行一次或多次代码优化的装置,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。
[0114] 本发明实施例公开的一种用于在从主体代码(17)到目标代码(21)的程序代码转换过程中准确地处理异常的转换器设备,包括:
[0115] 用于生成所述目标代码(21),包括对应于所述主体代码(17)中 的潜在地易发生错误的主体指令的至少一个对等目标指令(214),并存储与所述至少一个对等目标指令(214)关联的恢复信息(195)的装置,以及
[0116] 用于在接收到中断时,继续执行目标代码指令,直到遇到所述至少一个对等目标指令(214)的装置;
[0117] 用于在遇到所述至少一个对等目标指令(214)时,使用所述关联的恢复信息(195)恢复准确地代表发生错误时所述主体处理器的准确的主体状态的装置,以及 [0118] 用于使用所述已恢复的准确的主体状态,准确地处理所述中断的装置; [0119] 其中,所述用于生成所述目标代码(21),包括对应于所述主体代码(17)中的潜在地易发生错误的主体指令的至少一个对等目标指令(214),并存储与所述至少一个对等目标指令(214)关联的恢复信息(195)的装置包括用于执行一次或多次代码优化的装置,以及,其中,所述恢复信息(195)提供涉及所述一次或多次代码优化的信息。 [0120] 本发明实施例公开的一种用于在从主体代码(17)到目标代码(21)的动态二进制转换过程中准确地处理异常的转换器设备,包括:
[0121] 用于从主体代码指令的序列生成目标代码指令的序列的装置;以及 [0122] 用于执行所述目标代码指令的序列的装置;
[0123] 其特征在于:
[0124] 用于当发生异常时,沿着目标代码指令的所述序列向前滚动,直到遇到能实现准确地代表发生错误时所述主体处理器的准确的主体状态的目标代码指令,推迟对所述异常进行处理直到能够实现所述准确的主体状态;
[0125] 其中,该目标代码指令的序列包括对应于主体代码中的潜在地易发生错误的主体指令的至少一个对等目标代码指令,所述至少一个对等目标代码指令关联恢复信息; [0126] 其中,所述用于从主体代码指令的序列生成目标代码指令的序列 的装置包括用于执行一次或多次代码优化的装置,以及,其中,所述恢复信息提供涉及所述一次或多次代码优化的信息。

附图说明

[0127] 本说明书收入的并构成本说明书的一部分的附图说明了目前优选的实现方式,并描述如下:
[0128] 图1是说明应用了本发明的实施例的设备的方框图;
[0129] 图2是说明在程序代码转换过程中执行控制的首选方法的示意流程图; [0130] 图3是显示了在程序代码转换之后主体指令和目标指令之间的关系的示意图; [0131] 图4显示了根据本发明的优选实施例的在程序代码转换过程中目标机器中的示例程序代码结构;
[0132] 图5是根据本发明的优选实施例的创建准确的异常的目标代码的方法的示意概述;
[0133] 图6是显示了存储恢复信息和生成的目标代码的首选机制的示意图; [0134] 图7是获取恢复信息的首选方法的示意图;
[0135] 图8是本发明的优选实施例中使用的恢复信息的示意表示方式;
[0136] 图9是本发明的另一个优选实施例中使用的恢复信息的示意表示方式; [0137] 图10显示了说明中断的处理的示例目标代码序列;以及
[0138] 图11是显示了在目标计算平台内处理中断的首选实施方式的示意视图。 具体实施方式
[0139] 下面的描述使本领域技术人员能做出并使用本发明,并阐明了发明人设想的实现他们的发明的最佳模式。然而,各种修改对本领域技 术人员是显而易见的,因为这里专门定义了本发明的一般原理,以提供改善的程序代码转换方法和设备。
[0140] 在下面的术语中,主体程序可以在包括主体处理器的主体计算平台上运行。包括目标处理器的目标计算平台用于通过执行动态程序代码转换的转换器来运行主体程序。转换器执行从主体代码到目标代码的代码转换,以便目标代码可在目标计算平台上执行。 [0141] 图1说明了示例目标计算平台,包括具有多个目标寄存器15的目标处理器13,存储多个软件组件17、19、20、21,以及27的存储器18。软件组件包括操作系统20、主体代码17、转换器代码19,以及经过转换的目标代码21。
[0142] 在一个实施例中,转换器代码19是将主体指令集体系结构(ISA)的主体代码转换为另一个ISA的经过转换的目标代码的仿真器,有或者没有优化。在另一个实施例中,转换器19充当加速器,用于通过进行程序代码优化,将主体代码转换为目标代码,各自都是同一ISA。
[0143] 转换器19,即,实现了转换器的源代码的已编译的版本,和经过转换的代码21,即,由转换器19产生的主体代码17的转换,与在目标处理器13(通常是微处理器或其他合适的计算机)上运行的操作系统20一起运行。
[0144] 应该理解,图1中所显示的结构只是示范性的,例如,根据本发明的软件、方法和进程可以以驻留在操作系统内或操作系统下面的代码来实现。如本领域技术人员所知道的,主体代码17、转换器代码19、操作系统20,以及存储器18的存储机制可以是各式各样的类型中的任何一种类型。
[0145] 在根据图1的设备中,优选情况下,在目标代码21正在运行的过程中,在运行时动态地执行程序代码转换。转换器19与经过转换的程序21内联地运行。优选情况下,转换器19被用作为目标体系结构编译的应用程序。主体程序17被转换器19在运行时转换,以在目标体系结构14上执行。
[0146] 通过转换器19运行主体程序17涉及以交织方式执行的两种不同类型的代码:转换器代码19;以及目标代码21。转换器代码19是基于转换器19的高级源代码实施方式,在运行时之前,诸如通过编译器生成的。相比之下,由转换器代码19在整个运行时过程中基于正在被转换的程序的存储的主体代码17生成的。
[0147] 主体程序17可以在主体处理器(未显示)上运行。在一个实施例中,转换器19充当仿真器。即,当实际作为目标代码21在目标处理器13上执行主体程序17时,转换器19模拟主体处理器。在优选实施例中,提供过至少一个全局寄存器存储器27(也简称为主体寄存器组27或抽象寄存器组27)。在多处理器环境中,根据主体处理器的体系结构,可选地,提供了一个以上的抽象寄存器组27。由转换器19和目标代码21的组件提供主体处理器状态的表示形式。即,转换器19将主体处理器状态存储在诸如变量和/或对象之类的各种显式的编程语言设备中。用于编译转换器19的编译器判断在目标代码中是如何实现状态和操作的。比较起来,目标代码21在目标寄存器15中和存储器位置18(它们由目标代码21的目标指令操纵)处隐式地提供主体处理器状态。例如,全局寄存器存储器27的低水平的表示形式只不过是已分配的存储器的一个区域。然而,在转换器19的源代码中,全局寄存器存储器27是在较高的级别可以被访问和操纵的数据阵列或对象。 [0148] 图2是说明在程序代码转换过程中执行控制的首选方法的示意流程图。 [0149] 如图2所示,控制首先从转换器控制循环190开始。在步骤201中,控制循环190调用转换器代码19的代码生成功能192,该功能将主体代码块17转换为对应的经过转换的代码块21。然后,在步骤202中,在目标处理器13上执行该经过转换的代码块21。方便地,每一个经过转换的代码块21的末尾都包含将控制返回到控制循环201的指令。换句话说,转换和执行主体代码的步骤是交替的,以便转换主体程序17的部分,然后再执行。 [0150] 这里,对于本领域技术人员来说,术语“基本块”是熟悉的。基本块是正好具有一个入口点和正好一个出口点的代码的一部分,它将块代码限制到单个控制路径。由于这个缘故,基本块是控制流的有用的基本单位。适当地,转换器19将主体代码17划分为多个基本块,每一个基本块都是单个入口点中的第一指令和单个出口点中的最后一个指令之间的连续的指令集(如跳转调用或转移指令)。转换器可以只选择这些基本块中的一个(块模式)或选择一组基本块(组合块模式)。组合块适当地包括两个或更多将一起被当作单个单元对待的基本块。此外,转换器还可以构成代表主体代码的相同基本块但是在不同入口条件下的“相同块”。
[0151] 在优选实施例中,基于主体指令序列,生成中间表示形式(IR)的树,作为从原始主体程序17生成目标代码21的过程的一部分。IR树是计算出的表达式和由主体程序执行的操作的抽象表示形式。稍后,基于IR树来生成目标代码21。IR节点的集合实际是有向非循环图(DAG),但是用通俗语简称为“树”。
[0152] 如本领域技术人员所理解的,在一个实施例中,使用诸如C++之类的面向对象的编程语言来实现转换器19。例如,IR节点作为C++对象来实现,而对其他节点的引用作为对对应于那些其他节点的C++对象的C++引用来实现。因此,IR树作为IR节点对象的集合来实现,包含对彼此的各种引用。
[0153] 此外,在所讨论的实施例中,IR生成过程使用了一组抽象寄存器定义,这些定义对应于主体程序17在其上运行的主体体系结构的特定特征。例如,对于主体体系结构上的每一个物理寄存器,都有唯一的抽象寄存器定义。如此,转换器中的抽象寄存器定义可以作为包含对IR节点对象(即,IR树)的引用的C++对象来实现。被抽象寄存器定义集引用的所有IR树的聚合被称为工作IR森林(“森林”,因为它包含多个抽象寄存器根,每一个根都引用IR树)。这些IR树及其他进程适当地构成了转换器代码生成功能192的一部分。 [0154] 异常处理
[0155] 图3是显示在本发明的优选实施例的程序代码转换之后主体程序中的指令和目标程序中的指令之间的关系的示意图。
[0156] 在此示例中,主体指令S1-S3产生功能等效的目标指令T1-T3。主体指令S1诸如通过死代码消除优化被消除,在生成的目标代码中没有对等物。主体指令S2产生一个等效的目标指令T3。相比之下,主体指令S3产生两个目标指令T1&T2。在目标和主体代码指令之间可以有一对无、一对一、一对多或多对一的关系。
[0157] 也是如图3所示,另一个常用的优化是执行代码重安排,从而,目标代码中的指令序列不相当于主体代码中的原始序列。这里,第二主体指令S2一直被重安排为第三目标指令T3。
[0158] 图3还显示了主体异常处理器170。通常,主体环境将提供一个或多个特定主体错误处理器170a(即,特定类型的异常所特有的)和/或一个或多个默认异常处理器170b(在没有注册特定异常处理器的情况下使用)。
[0159] 在此示例中,主体指令S1、S2或S3中的任何一个指令潜在地产生异常,该异常需要由主体异常处理器170来处理。
[0160] 经过转换的主体异常处理器270在目标代码中提供在目标处理器上执行的异常处理器,该异常处理器模拟主体异常处理器170。在实践中,提供了一个或多个经过转换的主体特定的异常处理器270a或默认异常处理器270b。一旦处理完了异常,异常处理器270通常将控制返回到目标代码21。
[0161] 经过转换的主体异常处理器270希望接收准确的主体状态,以便准确地处理异常。如上所述,重新创建准确的主体状态既困难,又开销大。首先,有与计算和收集主体状态关联的实际开销。例如,诸如惰性求值之类的转换器优化可以通过存储计算主体寄存器值所需的基础数据来延迟计算这些值。响应异常而重新创建主体状态需要立即纠正(即,计算)这些值。即使以前已经计算了主体寄存器,也必须从存储器中,如从主体寄存器组27中,检索它们。
[0162] 其次,有与在主体程序中的任意点计算准确的主体状态的功能关联的机会成本。动态二进制转换器中的许多关键优化,如代码重安排,涉及相对于二进制兼容性的严格的模式的偏离。二进制兼容性是指,转换器可以重新创建主体体系结构的准确的状态。严格的模式是可以在经过转换的程序中的任何一点(即,在任何主体指令)重新创建主体状态的模式。为了保留在执行中的任何一点重新创建主体状态所需的信息,转换器通常必须在显著的优化之前进行。当这些优化正在使用中时,转换器无法准确地重新创建主体上下文。
如此,准确的异常处理的实际开销不只是生成准确的主体状态的工作。对代码转换过程有一些限制,以便能够完全地生成主体状态。
[0163] 错误
[0164] 通过首先集中说明通常被称为错误的特定类别的异常来说明本发明是有帮助的。 [0165] 错误通常用于错误处理。在异常情况下,许多操作可能不能产生正确结果。例如,整数加法指令可能产生太大而无法被表示的结果(假定结果的大小匹配输入的大小)。处理器体系结构设计者决定如何标记这样的错误(如果有的话)。三个典型设计选项是:悄悄地忽略溢出,通过修改内部处理器状态(例如,状态标志)来标记错误,但是继续执行下面的指令,或引发溢出异常。特定的体系结构可以通过提供特定指令的发生错误的和非发生错误的版本来提供这些选项的混合模式。
[0166] 作为其他示例,某些常见的错误类别是:算术异常、各种形式的存储器错误(无效地址、保护违规,以及校准检查),以及畸形或非法(在当前特权级别)指令错误。 [0167] 错误通常是同步的强制的异常,因为它们由于在操作数数据,以及处理器状态(包括存储器分配等等)的上下文中执行给定指令而发生的。错误在指令内发生,也就是说,不能完成发生错误的指令。通常,主体处理器将使寄存器状态回到发生错误的指令开始时的寄存器状态,允许错误处理器尝试解决错误,以便使执行得以恢复。在某些 情况下,可能无法解析这样的状态,这又可能会使错误是最后的。
[0168] 可恢复的错误的一个示例(通常在OS或子OS级别)是页面错误-当存储器尝试访问虚拟存储器中的不存在的页面时,引发异常。如果映射该页面,则虚拟存储器系统将分配物理页面,根据映射来准备它(例如,如果已经在该地址映射了一个文件,则加载数据),然后,相应地更新页面表结构。然后,处理器可以恢复执行同一个指令,该指令现在应该能够正确地完成。
[0169] 某些错误可以与用户模式应用程序屏蔽开来-例如,校准检查通常在支持不对准的访问的体系结构上作为可屏蔽的错误可用;在那些不支持校准错误的体系结构上是不可屏蔽的。
[0170] 已知,主体指令集体系结构中的某些指令是容易产生错误的,而其他指令不容易产生错误。即,大多数指令集包括某些容易发生错误的指令(还被称为“发生错误的指令或潜在地发生错误的指令”),以及某些不发生错误的不容易发生错误的指令。 [0171] 错误是有问题的,因为它们是同步的,通常是可恢复的。此外,容易发生错误的指令趋向于在任何现实的主体程序中相对频繁地执行。因此,在处理错误时的改进在程序代码转换中,特别是在动态二进制转换中,具有直接的优点。
[0172] 错误处理
[0173] 图4显示了根据本发明的优选实施例的在程序代码转换过程中目标机器中的示例程序代码结构。
[0174] 在图4中,示例主体代码块17包括主体指令SC1到SC4。这些指令中的一个指令(SC3*)是容易发生错误的指令174,而其余部分是不容易发生错误的。
[0175] 此外,还显示了对应的目标代码块21,并具有等效的目标代码指令TC1到TC6。容易发生错误的主体指令174(SC3)涉及生成的目标代码21中的一个或多个对等目标指令214(在此情况下,TC4*)。
[0176] 如图4所示,提供了恢复映射194,它将每一个对等目标指令 214链接到相应的恢复信息项195。即,每一个容易发生错误的主体指令174都具有一个或多个对等目标代码指令214,每一个对等目标代码指令214都映射到相应的目标特定的恢复信息项195。 [0177] 通过恢复信息195,可以准确地处理在目标代码21的执行过程中发生的异常(特别是错误)。具体来说,恢复信息195允许执行额外的本机代码指令,以便创建准确的主体状态,以便在经过转换的主体异常处理器270中准确地处理异常。
[0178] 在一个优选实施例中,提供了恢复处理器215,它使用恢复信息195来纠正准确的主体状态,以便由异常处理器270处理异常。
[0179] 图5是根据本发明的优选实施例的创建能够准确地处理错误型异常的目标代码21的方法的示意概述。
[0180] 在步骤501中,对主体代码17的一部分(基本块比较合适)进行解码。在解码过程中,根据主体ISA的定义,来标识一个或多个容易发生错误的指令174。 [0181] 在步骤502中,进行程序代码转换,以将主体代码17转换为对应的目标代码块21。可选地,程序代码转换包括诸如死代码删除和/或代码重安排之类的优化,等等。生成的目标代码块21包括每一个容易发生错误的主体指令174的一个或多个对等目标指令214。 [0182] 在步骤503中,为每一个对等目标指令214提供了恢复信息195。适当地,在恢复映射表194中创建将每一个对等目标指令214链接到相应的恢复信息195的条目。 [0183] 在步骤504中,执行生成的目标代码块21中的指令。如果不发生异常(错误),那么,继续执行,直到代码块的末尾,然后,如通过图2的转换器运行循环来调用下一个代码块。
[0184] 在步骤505中,当相对于一个对等目标指令214发生异常(错误)时,获取相应的恢复信息195,并用于纠正准确的主体状态。即,使用恢复信息195来执行一组额外的恢复代码指令(在理想情况下,在恢复处理器215中执行)。
[0185] 适当地以本机代码编写恢复处理器215,它天然地可由目标处理 器执行(而不是由转换器19动态地生成的经过转换的目标代码)。
[0186] 在步骤506中,由异常处理器270准确地处理异常。即,步骤505中的恢复提供了准确的主体状态,以符合由异常处理器270进行准确的异常处理的条件。通常,成功地处理异常,控制返回到执行程序。通常,控制返回,以完成当前代码块的执行。在其它情况下,错误是最后的,程序结束。
[0187] 存储恢复信息
[0188] 图6显示了在目标计算平台上存储恢复信息195和生成的目标代码21的首选机制。
[0189] 上文所讨论的恢复机制本身会给转换器19带来某些开销。首先,需要存储器空间来存储恢复信息195。此外,还需要空间来存储将每一个对等目标代码指令214链接到相应的恢复信息195的恢复映射194。当发生异常(错误)时,希望快速而有效地获取有关的恢复信息195。
[0190] 图6显示了目标计算平台中的存储了生成的目标代码块21a的存储器区域。目标代码块21包括对应于主体指令中的容易发生错误的指令174的一个或多个对等目标指令214。
[0191] 恢复信息195存储在存储器中,紧随在相应的目标代码块21a之后。即,每一个对等目标指令214都具有紧随在有关的目标代码块21a之后存储的相应的恢复信息项195。 [0192] 优选情况下,提供了标记196,以便轻松地区别目标代码块21a的末尾和恢复信息195的开始。
[0193] 此外,如图6所示,另一个经过转换的目标代码块21b存储在存储器中,接下来是相应的恢复信息195和标记196。即,目标代码21和恢复信息195在存储器中相互交织。 [0194] 当在特定对等目标指令214中发生异常(错误)时,执行下面的步骤,以便获取相应的恢复信息。
[0195] 第一个步骤是进行扫描,直到目标代码块的末尾。此步骤方便地包括读取连续的指令,直到发现了标记196。其次,对恢复信息195 的列表进行扫描,发现相应的所需要的恢复信息。
[0196] 在特定优选实施例中,根据对等目标指令214的程序计数器来索引每一个恢复信息195。即,对等目标代码指令214的程序计数器值构成了恢复信息195的列表中的索引。当发生异常时,在目标处理器中,目标程序计数器轻松地可用。首先,对存储器进行扫描,以查找标记196,然后,查找恢复信息的列表中的目标程序计数器,可以有效地定位相应的恢复信息195。
[0197] 图7显示了使用图6的存储器布局来获取恢复信息的首选方法。
[0198] 在实际的实施例中,每一个基本块通常都包含大约十二个指令。因此,扫描到当前目标代码块的末尾相对来说比较快,因为涉及的距离相对来说比较短。在优选实施例中,每一个主体块都只限于比方说100或200个指令的最大大小。甚至在相对来说比较长的目标块的这些稀少的情况下,扫描仍是有效而便宜的机制。
[0199] 图8显示了恢复信息195的特定优选实施例。
[0200] 在图8的示例中,恢复信息195包括目标程序计数器195a、主体程序计数器195b、一组恢复指示符195c和映射模板195d。
[0201] 恢复信息195可使恢复处理器215纠正准确的主体状态。具体来说,准确的主体状态包括主体程序计数器值(195b)和主体寄存器值。
[0202] 优选地,恢复处理器215使用恢复信息来纠正主体程序计数器(如果已经不可用)。在此示例中,恢复信息195为每一个目标PC
[0203] 195a都存储了精确的主体PC 195b。通过读取存储的恢复信息中的此字段195b来纠正主体PC。
[0204] 映射模板195d标识在对等目标指令214处适用的适当的寄存器映射。恢复处理器215纠正主体处理器寄存器值。在一个实施例中,寄存器值被纠正到存储器中的抽象寄存器组27。或者,存储器存储被保留在目标寄存器中。这里,恢复处理器215使用存储的映射模板195d来设置寄存器映射,从而,主体寄存器被映射到物理 目标寄存器。 [0205] 如图8所示,优选情况下,存储的恢复信息195包括一组恢复指示符(优化标记)195c,它们表示在特定目标代码指令处未完成的优化。在此示例中,设置了四个恢复指示符,作为标记F1、F2、F3和F4。适当地,恢复处理器215基于恢复指示符F1-F4来调用一个或多个本机代码恢复例程216,以执行未完成的优化。
[0206] 具体来说,恢复处理器执行在发生异常时被推迟的懒惰工作。例如,许多处理器提供了一组条件代码标记。首选的优化是通过存储基础信息(该基础信息可使条件代码标记的正确的状态在必要时得到纠正),延迟条件代码标记的纠正。恢复例程216从存储的基础信息执行懒惰的条件代码标记评估。
[0207] 图9显示了存储的恢复信息的另一个特定的优选实施例。
[0208] 在理想情况下,恢复信息195以压缩的形式存储。有益地,减少了恢复信息的存储器的占用大小。在某些环境中,转换器19在计算平台上与许多其他进程一起操作,需要缩小由转换器19的开销消耗的存储器的大小。
[0209] 如图9所示,第一目标PC 195a和第一主体PC 195b作为全值来存储。随后的每一个PC都作为与这些基准值的偏移来存储。适当地,每一个目标代码块21a、21b中的第一恢复信息195以完全PC值作为基准值地存储,每一个随后的恢复信息195都存储程序计数器值作为与基准值的偏移。或者,为代码块定义了基本PC,如代码块中的第一目标代码指令的PC,不管这是否是对等目标指令214。
[0210] 示例1:PPC到x86转换
[0211] 下面显示了主体代码17的示例序列,作为目前描述的技术的说明性示例。示例主体代码17适于PowerPC(PPC)型处理器:
[0212] Subject code(PPC):
[0213] 0x0001003c:...
[0214] 0x00010040:add.r3,r3,68
[0215] 0x00010044:Id r3,0(r3)
[0216] 0x00010048:...
[0217] 示例PPC主体代码将恒定值68添加到寄存器“r3”中,然后,从此地址加载到r3。用PPC带点“与”(dotted add)指令来执行加法,该指令设置PPC条件字段寄存器的字段0中的标记。万一发生加载错误,那么,为了准确地处理异常,应该报告加载指令(0x00010044)的程序计数器值,r3应该包含执行加法运算之后的值,条件字段0应该更新。 [0218] 在进行程序代码转换之后,产生了下面的示例目标代码21。在此示例中,目标代码可由x86型处理器执行:
[0219] Target code(x86):
[0220] 0x40083200:mov 12(%ebp),%eax
[0221] 0x40083203:add $68,%eax
[0222] 0x40083206:mov(%eax),%ecx
[0223] 0x40083208:mov%ecx,12(%ebp)
[0224] 目标代码将主体寄存器r3的值(在与ebp寄存器的偏移12处找到,这里指向抽象寄存器组27)加载到寄存器eax中。目标代码现在将68添加到eax,然后从此地址加载到ecx。最后,此结果存储回抽象寄存器组中的主体寄存器r3。
[0225] 在此示例中,恢复信息195的示范性实例是:
[0226] 0x40083206:
[0227] subj_addr=0x00010044,
[0228] flags=cr0_lazyl_cmp0,
[0229] register_map=[lazy1(%eax),r3(%eax)].
[0230] 目标PC(0x40083206)用于索引恢复信息。在此情况下,目标mov指令是潜在地发生错误的主体加载指令的对等目标指令。记录了精确的主体PC(0x00010044)。标记用于表明,条件寄存器字段0需要基于与叫做“lazyl”的特殊主体寄存器中的零值的比较结果来加以纠正。此外,恢复信息还表明,主体寄存器lazyl和r3的值位于目标寄存器eax中(由加法目标指令0x40083203产生的值)。为了 进行恢复,来自eax的值将被溢出到适当的主体寄存器中,现在可以通过使用现在溢出到lazyl的值进行适当的比较,来纠正条件字段,并可以报告适当的PC。
[0231] 总之,只有在需要的情况下,恢复信息才使工作得以执行。即,只有在发生异常时的异常情况下才执行工作。大部分时间,在正常运行中,不需要准确的主体状态,也不要进行纠正。这里所讨论的恢复机制在生成的目标代码的正常执行过程中可使工作被推迟,或根本不执行。结果,目标代码的正常执行变得更快、更加有效率。然而,当发生异常时,恢复信息195仍可使准确的主体状态得到纠正,以便使异常得到准确的处理。恢复工作在异常发生之后执行,以便纠正准确的主体状态。
[0232] 中断
[0233] 现在将就中断的准确的处理,比较详细地对本发明的进一步的优选方面进行描述。
[0234] 中断通常用于提供硬件设备支持。当在处理器的外部硬件设备中发生事件时,发送一个信号,将事件通知给处理器。来自I/O设备的数据的可用性是一个示例。外部设备中断指令通过处理器的当前流动,以便调用例程来修复中断。中断的使用减轻了系统连续地轮询设备以查看它们是否需要维护的必要性。另一个示例是时钟中断,它们可使用户应用程序以预先确定的间隔中断,控制通常转移到操作系统。定期的中断是在多任务处理系统中实施处理器资源共享的方便机制。
[0235] 中断是异步异常,因为它们对外部设备中的事件作出反应,而不是在处理器内执行特定指令。如此,中断可以在指令流中的任意一点发生。中断与正在执行的当前指令流不相关,一旦异常得到纠正,就恢复执行。
[0236] 图10显示了说明中断的处理的示例目标代码序列。
[0237] 目标代码块21a包含指令TC1-TC6。在此示例中,当处理器正在执行指令TC2时发生了中断。当前指令(TC2)的执行完成。 此外,还执行零个或多个额外指令(TC3),直到遇到与恢复信息195关联的对等目标指令214(在此情况下,指令TC4)。即,目标代码指令的执行向前滚动,直到能实现准确的主体状态的下一个点。
[0238] 当处理器到达具有关联的恢复信息195的下一个对等目标指令214时,恢复信息被传输到恢复处理器215,以便纠正准确的主体状态。然后,准确的主体状态被传输到适当的异常处理器270,该异常处理器270是主体中断处理器比较适当。
[0239] 图11显示了在目标计算平台内处理中断的三个首选实施方式。
[0240] 在第一个优选实施例中,当发生中断型异常时,调用目标代码解释器197。目标代码解释器197逐个地执行目标代码指令,直到到达具有恢复信息195的对等指令214。 [0241] 在第二个实施例中,调用步进处理器模式。即,控制目标处理器13,以进入步进处理器模式,该模式逐个地执行目标代码指令,直到到达对等指令214。
[0242] 在第三个优选实施例中,调用检查标准,以逐个指令地执行目标代码,直到到达具有恢复信息195的对等指令214。
[0243] 如果在目标代码块21a中没有遇到易发生错误的对等目标指令214,则适当地运行到代码块的末尾。在优选实施例中,在代码块边界纠正准确的主体状态。 [0244] 陷阱
[0245] 陷阱通常是用户明确地并无条件地请求的异常。在主体指令引发陷阱型异常的情况下,转换器19为该指令生成目标代码,该代码直接执行处理陷阱事件所需的行为。 [0246] 某些指令集体系结构定义了需要进一步的特殊处理的陷阱,如单个步进陷阱和条件陷阱(例如,IA-32体系结构中的INTO指令)。优选情况下,与如上文所讨论的错误类似地处理条件陷阱(为了不引发异常,是常见的情况)。这样,常见的情况中的工作被最小化。在异常情况下,通过恢复处理器,调用所需的额外的工作。
[0247] 中止
[0248] 中止通常是不可恢复的事件,但是,可以具有各种特征。中止通常用于管理关键的系统故障。在检测到硬件故障(如内部处理器状态的不一致)或严重的软件故障(如操作系统的临界区域内的故障)时,那么,处理器可能尝试忽略错误并继续执行,为安全起见停止或重新启动,也可以引发异常,以将错误通知给操作系统。与错误类似,中止在指令内发生。中止常常是最后的。中止通常不是用户可屏蔽的。
[0249] 万一在不希望发生错误的指令的执行过程中发生诸如机器校验错误之类的中止,则难以完全再现该中止指令中的准确的主体状态。一般而言,在动态二进制转换的上下文中准确地处理中止是非常昂贵的。
[0250] 从上文的讨论可以看出,这里所讨论的异常处理机制具有许多优点。具体来说,只要可能,就从常见的情况中删除工作,并只在程序的典型的执行过程中不经常发生的异常情况下执行。然而,当需要时,取得准确的主体状态。此外,取得准确的主体状态的开销也被最小化。
[0251] 尽管已示出和描述了本发明的几个优选实施例,可以设想,本领域的技术人员可在所附权利要求定义的精神和范围内设计对本发明的各种修改。
[0252] 注意了与涉及本申请的本说明书同时或在本说明书之前提出的并且对外开放可以利用本说明书进行公共的检查的所有文件和文档,这里引用了所有这样的文件和文档的内容作为参考。
[0253] 本说明书(包括任何附带的权利要求、摘要和附图)中所说明的所有特征,和/或所说明的任何方法或进程的所有步骤,可以以任何组合方式进行组合,但是,这样的特征和/或步骤中的至少某些是互相排斥的组合的情况除外。
[0254] 本说明书(包括任何附带的权利要求、摘要和附图)中所说明的每一个特征可以替换为用于相同、等效的或类似的用途的备选特征,除非明确地声明不行。如此,除非明确地声明,所说明的每一个特征都只是等效的或类似的特征的一般性系列的一个示例。 [0255] 本发明不仅局限于前面的实施例的细节。本发明可以扩展到本说 明书(包括任何所附带的权利要求、摘要和附图)中所说明的任何新颖的特征,或任何新颖的特征的组合,或扩展到所说明的任何方法或进程的任何新颖的步骤或任何新颖的步骤的组合。