2012-01-04 73 views
6

从语义上讲,Dalvik VM为每种方法都有一套全新的寄存器,并且没有指令来访问调用堆栈。但就其实现而言,寄存器应以方法调用方式保存,并在方法返回时恢复。 (谷歌实施)Dalvik如何做到这一点?Dalvik VM如何在方法调用之间保存和恢复其寄存器?

+0

是否可以访问Google Dalvik实现的源代码?还要注意,* Dalvik字节码*不能访问“调用栈”和*执行*之间存在差异,该执行*执行的这种字节码没有这种访问权限。 (它*必须*有一些维护状态的方法,将方法调用的契约视为一个开始;-) – 2012-01-04 03:24:16

+0

当方法被输入时,它只是将前一个上下文推入其内部调用堆栈,并在退出方法时将其弹出。 – 2012-01-04 03:34:05

+0

@pst:Android是开源的,当然源代码可以访问:) – JesusFreke 2012-01-04 03:40:23

回答

1

这里是Dalvik的源代码库,你可以演练,以findout实施。 android source

3

说的Dalvik字节码的寄存器指的是不是机器寄存器可言,但它们实际上是调用堆栈上的位置。无论何时调用方法,dalvik都会在该方法的堆栈帧上分配足够的内存,以容纳该方法所需的所有寄存器。

请注意,并非所有的计算将立即修改堆栈上的值,虚拟机显然有加载为了做计算的值到机器寄存器。结果可以保存在一个机器寄存器中,稍后可以使用,而不必立即写回到相应的堆栈位置,由虚拟机决定。如果需要时(即当你调用另一个方法,使用各种同步结构,或者它需要寄存器进行另一次计算等),这些值将被刷新回调用堆栈。