卷二 Dalvik与Android源码分析 第五章 Interpreter与JIT 5.6 dalvik运行时帧结构 图书版试读--请勿转发
2014-03-14 10:21
477 查看
作者 crosskernel@gmail.com
在dalvik运行时每个函数也是有自己的Frame的,首先分析在dalvik源码里描述了对Frame结构的描述:
Low addresses (0x00000000)
+- - - - - - - - -+
- out0 -
+-----------------+ <-- stack ptr (top of stack)
+ VM-specific +
+ internal goop +
+-----------------+ <-- curFrame: FP for cur function
+ v0 == local0 +
+-----------------+ +-----------------+
+ out0 + + v1 == in0 +
+-----------------+ +-----------------+
+ out1 + + v2 == in1 +
+-----------------+ +-----------------+
+ VM-specific +
+ internal goop +
+-----------------+ <-- frame ptr (FP) for previous function
+ v0 == local0 +
+-----------------+
+ v1 == local1 +
+-----------------+
+ v2 == in0 +
+-----------------+
+ v3 == in1 +
+-----------------+
+ v4 == in2 +
+-----------------+
- -
- -
- -
+-----------------+ <-- interpStackStart
High addresses (0xffffffff)
其中寄存器分配规则是由dalvik编译器决定的。而VM-specific internal goop就是“struct StackSaveArea”,该结构定义如下:
struct StackSaveArea {
…
/* saved frame pointer for previous frame, or NULL if this is at bottom */
u4* prevFrame;
/* saved program counter (from method in caller's frame) */
//该PC指针为并不是二进制的r15,而是当前字节码地址
const u2* savedPc;
/* pointer to method we're *currently* executing; handy for exceptions */
const Method* method;
union {
/* for JNI native methods: bottom of local reference segment */
u4 localRefCookie;
/* for interpreted methods: saved current PC, for exception stack
* traces and debugger traces */
const u2* currentPc;
} xtra;
/* Native return pointer for JIT, or 0 if interpreted */
const u2* returnAddr;
…
};
“struct StackSaveArea”作用如下:
保存当前字节码的地址到其成员变量“xtra. currentPc”
#define EXPORT_PC() \
str rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
其中offStackSaveArea_currentPc被定义为12,sizeofStackSaveArea即为“struct StackSaveArea”结构的size。rFP为当前帧基地址,参考上一节的Frame结构,“[rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]”为“xtra. currentPc”所在地址。
在dalvik运行时每个函数也是有自己的Frame的,首先分析在dalvik源码里描述了对Frame结构的描述:
Low addresses (0x00000000)
+- - - - - - - - -+
- out0 -
+-----------------+ <-- stack ptr (top of stack)
+ VM-specific +
+ internal goop +
+-----------------+ <-- curFrame: FP for cur function
+ v0 == local0 +
+-----------------+ +-----------------+
+ out0 + + v1 == in0 +
+-----------------+ +-----------------+
+ out1 + + v2 == in1 +
+-----------------+ +-----------------+
+ VM-specific +
+ internal goop +
+-----------------+ <-- frame ptr (FP) for previous function
+ v0 == local0 +
+-----------------+
+ v1 == local1 +
+-----------------+
+ v2 == in0 +
+-----------------+
+ v3 == in1 +
+-----------------+
+ v4 == in2 +
+-----------------+
- -
- -
- -
+-----------------+ <-- interpStackStart
High addresses (0xffffffff)
其中寄存器分配规则是由dalvik编译器决定的。而VM-specific internal goop就是“struct StackSaveArea”,该结构定义如下:
struct StackSaveArea {
…
/* saved frame pointer for previous frame, or NULL if this is at bottom */
u4* prevFrame;
/* saved program counter (from method in caller's frame) */
//该PC指针为并不是二进制的r15,而是当前字节码地址
const u2* savedPc;
/* pointer to method we're *currently* executing; handy for exceptions */
const Method* method;
union {
/* for JNI native methods: bottom of local reference segment */
u4 localRefCookie;
/* for interpreted methods: saved current PC, for exception stack
* traces and debugger traces */
const u2* currentPc;
} xtra;
/* Native return pointer for JIT, or 0 if interpreted */
const u2* returnAddr;
…
};
“struct StackSaveArea”作用如下:
保存当前字节码的地址到其成员变量“xtra. currentPc”
#define EXPORT_PC() \
str rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
其中offStackSaveArea_currentPc被定义为12,sizeofStackSaveArea即为“struct StackSaveArea”结构的size。rFP为当前帧基地址,参考上一节的Frame结构,“[rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]”为“xtra. currentPc”所在地址。
相关文章推荐
- 卷二 Dalvik与Android源码分析 第五章 Interpreter与JIT 5.1 解释器编译结构、5.2dalvik寄存器编译模型 图书版试读--请勿转发
- 卷二 Dalvik与Android源码分析 第五章 Interpreter与JIT 5.3-C解释器 5.4--汇编解释器 图书版试读--请勿转发
- 卷二 Dalvik与Android源码分析 第五章 Interpreter与JIT 5.5 Interpreter的切换 图书版试读--请勿转发
- 卷二 Dalvik与Android源码分析 第二章 进程与线程 2.2 Dalvik线程创建机制 图书版试读--请勿转发
- 卷二 Dalvik与Android源码分析 第二章 进程与线程 2.1 Dalvik虚拟机的进程创建机制 图书版试读--请勿转发
- 【OpenVswitch源码分析之六】内核空间转发面数据结构与流程
- Android笔记四 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB
- Android ART运行时无缝替换Dalvik虚拟机的过程分析
- Android——4.2.2 源码目录结构分析
- 【OpenVswitch源码分析之五】用户空间转发面数据结构与流程
- Appium Android Bootstrap源码分析之启动运行
- android应用程序源码结构分析
- 从源码角度分析Android系统的异常捕获机制是如何运行的