GingerbreadVM 一: JavaClass文件结构

目标是实现兼容部分OpenJDK 1.8的虚拟机。
同时,部分探索到的JVM特性也将开始整理。

结构

主体结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
├── 魔法值(0xCAFEBABE)
├── 主、次版本号
├── 常量区大小
├── 常量区(下属为列表任意重复排布)
│ ├── (空常量)
│ ├── UTF8常量
│ ├── 整数常量
│ ├── 浮点数常量
│ ├── 长整数常量
│ ├── 长浮点数常量
│ ├── 类引用常量
│ ├── 字符串引用常量
│ ├── 字段名称/类型引用常量
│ ├── 方法名称/类型引用常量
│ ├── 接口方法名称/类型引用常量
│ ├── 名称/类型引用常量
│ ├── (以下类型的常量不影响最小实现的虚拟机)
│ ├── 方法句柄常量
│ ├── 方法类型常量
│ ├── 动态常量
│ ├── 调用动态常量
│ ├── 模块常量
│ └── 包常量
├── 访问标志(类)
├── 本类名称索引
├── 超类名称索引
├── interface接口数量
├── interface接口索引列表
├── 字段数量
├── 字段或方法定义列表(额外结构)(字段)
├── 方法数量
├── 字段或方法定义列表(额外结构)(方法)
├── 属性信息数量
└── 属性信息列表(额外结构)(类级别)

字段或方法定义结构

1
2
3
4
5
├── 访问标志(字段/方法)
├── 名称索引
├── 描述符索引
├── 属性信息数量
└── 属性信息列表(额外结构)(字段或方法级别)

属性信息结构

1
2
3
4
5
6
7
8
├── 属性名称索引(属性类型)
├── 属性额外信息长度
└── 属性额外信息(以下多个子结构之一)
├── Code子结构
│ └── 堆栈映射表子结构
├── 常数值子结构
├── 异常捕获表子结构
└── (其他较不重要的子结构)

注1:其他结构大体上不影响最小实现的虚拟机。

注2:子结构本身的类型 由主结构-属性名称索引定义

Code结构(包含属性信息结构和Code子结构)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
├── 属性名称索引(属性类型)
├── 属性额外信息长度
├── (Code子结构定义开始)
├── 方法最高堆栈数
├── 方法最高本地变量数
├── bytecode代码长度
├── 指令代码(列表)
├── 方法异常表捕获表长度
└── 方法异常表捕获表列表
├── (方法异常表捕获表结构)
├── 起始命令位置
├── 结束命令位置
├── 捕获处理命令位置
└── 捕获类型索引