Dalvik虚拟机在方法调用之间如何保存和恢复其寄存器?

8

从语义上讲,Dalvik虚拟机为每个方法提供了一组新的寄存器,并且没有指令可以访问调用堆栈。但在其实现方面,寄存器应该在方法调用时以某种方式保存,并在方法返回时恢复。 (Google的实现) Dalvik是如何做到这一点的?


Google Dalvik实现的源代码可访问吗?请注意,“Dalvik字节码”无法访问“调用堆栈”和执行此类字节码的“实现”无法访问此类访问之间存在差异。(它必须有一些维护状态的方式,可以从方法调用的契约开始查看;-) - user166390
当进入一个方法时,它只是将先前的上下文推入其内部调用堆栈,并在退出方法时将其弹出。 - David Schwartz
@pst:Android是开源的,当然源代码是可以访问的 :) - JesusFreke
1
我自己解决了。相关的源文件是header.cppgotoTargets.cpp。Dalvik寄存器实际上驻留在Dalvik的调用堆栈中,围绕帧指针fp。因此,寄存器n实际上是fp[ n ]。当一个方法调用另一个方法时,参数被复制到调用者的寄存器顶部,并且帧指针被减少以为被调用者的寄存器腾出空间。 - Pteromys
2个回答

6
dalvik字节码引用的寄存器实际上并不是机器寄存器,而是调用堆栈上的位置。每当您调用一个方法时,dalvik会在该方法的堆栈帧上分配足够的内存以容纳该方法所需的所有寄存器。
请注意,并非所有计算都会立即修改堆栈上的值,虚拟机显然必须将值加载到机器寄存器中以进行计算。结果可能保留在机器寄存器中以便稍后使用,而不立即写回相应的堆栈位置,由虚拟机自行决定。如果需要(例如在调用另一个方法、使用各种同步构造或需要该寄存器进行其他计算等情况下),这些值将被刷新回调用堆栈。

0

这里是Dalvik的源代码存储库,您可以浏览以查找实现。 Android源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接