目标是实现兼容部分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代码长度 ├── 指令代码(列表) ├── 方法异常表捕获表长度 └── 方法异常表捕获表列表 ├── (方法异常表捕获表结构) ├── 起始命令位置 ├── 结束命令位置 ├── 捕获处理命令位置 └── 捕获类型索引
|