入门ART虚拟机(8)——artInterpreterToCompiledCodeBridge

Android安全交流群:478084054

artInterpreterToCompiledCodeBridge用于从一个解释执行的类方法跳到另一个以本地机器指令执行的类方法去执行。

以Android 6代码为例(贴代码时,为了主干清晰,省略了部分代码)。

入门ART虚拟机(8)——artInterpreterToCompiledCodeBridge_第1张图片

首先得到要调用的method,如果是静态方法并且类还没有初始化,则调用ClassLinker类的成员函数EnsureInitialized来初始化类。

最后会调用ArtMethod的Invoke方法来找到类方法的本地机器指令去执行。

入门ART虚拟机(8)——artInterpreterToCompiledCodeBridge_第2张图片

假设是arm架构,并且是非静态方法,则会调用art_quick_invoke_stub。

继续跟代码。

继续quick_invoke_reg_setup。

入门ART虚拟机(8)——artInterpreterToCompiledCodeBridge_第3张图片

先准备一些寄存器,并将方法参数设置好,然后调用art_quick_invoke_stub_internal。

入门ART虚拟机(8)——artInterpreterToCompiledCodeBridge_第4张图片

art_quick_invoke_stub_internal由汇编语言编写。看阴影覆盖的两行代码,r0保存method对象的地址,根据偏移ART_METHOD_QUICK_CODE_OFFSET_32找到机器指令的地址,然后blx跳转执行。

36正好是entry_point_from_quick_compiled_code_成员在method对象中的偏移。

最后贴一下art_quick_invoke_stub_internal的注释。

入门ART虚拟机(8)——artInterpreterToCompiledCodeBridge_第5张图片

本篇笔记简单的跟了一下artInterpreterToCompiledCodeBridge的执行流程,大概了解一下从解释器到另一个以本地机器指令执行的类方法的执行过程。

你可能感兴趣的:(入门ART虚拟机(8)——artInterpreterToCompiledCodeBridge)