Integer Java Virtual Machine
エミュレータ試作
作成者:森 考史
目次
1.Javaプログラムの実行
2.研究の目的と結果
3.IJVM(Integer Java Virtual Machine)
4.JVMについて
5.IJVMエミュレータの概要
6.まとめ
Javaプログラムの実行
Javaプログラム
コンパイル
Classファイル
Java VM
Java VM
Java VM
Java VM
Java VM
Java VM
MacOS
Windows
Linux
Free
BSD
Solaris
Solaris
Power PC
x86
SPARC
JVM (Java Virtual Machine)
・ 命令セットが用意され、命令の実行時に様々な
記憶領域の操作が行われる。
Javaプログラム
Classファイル
JVM
Class xx {
public void xxx {
・・・・
・・・・
・・・・
}
}
CA FE BA BE
00 00 00 2E
2D 0A 00 0D
86 A0 07 00
87 1E 0A 00
88 00 20 0A
89 22 0A 00.
・・・・・・・・・・・・
・・・・・・・・・・・・
Classファイルを
読み込み、
そこで指定された
操作を正しく
実行する。
目次
1. Javaプログラムの実行
2.研究の目的と結果
3.IJVM(Integer Java Virtual Machine)
4.JVMについて
5.IJVMエミュレータの概要
6.まとめ
研究の目的と結果
Javaの実行環境であるJVM(Java Virtual Machine)
本研究の成果物
をコストを少なく効果的に高速化させる
ための材料を探すこと
JVMのエミュレータを作る足がかりとして、
様々なアプリケーションにおいて
JVMのサブセットである
JVMの各命令の使用頻度や使用
1.JVMの各命令の使用頻度を取り、アプリケーション
Integer
Java
Virtual
Machine
の性格によって差異が生まれるかどうかを調査する。
順序を調べることができるJVMの
のエミュレータを作成した。
エミュレータを作る
2. JVMの各命令が使用される順序や組み合わせに
規則性がないかを調査する。
目次
1. Javaプログラムの実行
2.研究の目的と結果
3.IJVM(Integer Java Virtual Machine)
4.JVMについて
5.IJVMエミュレータの概要
6.まとめ
Integer Java Virtual Machine
Javaバイトコードの部分集合のためのアセンブラ
およびインタープリタから成るもの。
命令 : 20種類
IJVMの命令セット
オペコード
ニーモニック
操作内容
0x10
BIPUSH byte_exp byte_expをオペランド・スタックへとプッシュする
0x59
DUP
オペランド・スタックの先頭にある値がコピーさ
れ、オペランド・スタックへとプッシュされる
0xA7
GOTO label
無条件分岐を行う
0x60
IADD
オペランド・スタックから2つの値をポップして、
それらの合計をプッシュする
0x7E
IAND
オペランド・スタックから2つの値をポップして、
それらの論理積をプッシュする
0x99
IFEQ label
値をオペランド・スタックからポップし、それが
0なら分岐する
0x9B
IFLT label
値をオペランド・スタックからポップし、それが
0未満なら分岐する
0x9F
IF_ICMPEQ label 2つの値をオペランド・スタックからポップし、
それらが等しいならば分岐する
IJVMの命令セット
オペコード
ニーモニック
操作内容
0x84
IINC varnum_exp,
byte_exp
0x15
ILOAD vamum_exp vamum_expで示されたローカル変数を
オペランド・スタックへとプッシュする
0xB6
INVOKEVIRTUAL クラスに基づくディスパッチを行い、
method
インスタンス・メソッドを起動する
0x80
IOR
オペランド・スタックから2つの値をポップして、
それらの論理和をプッシュする
0xAC
IRETURN
メソッドから int をリターンする
0x36
ISTORE
varmum_exp
値をオペランド・スタックからポップし、それを
varmum_expで示すローカル変数にセットする
0x64
ISUB
オペランド・スタックから2つの値をポップして、
それらの差をプッシュする
vamum_expで示されたローカル変数に、
byte_expをintへ符号拡張したものを加算する
IJVMの命令セット
オペコード
ニーモニック
操作内容
0x13
LDC_W
constant_exp
constant_expで示される定数をオペランド・スタック
へとプッシュする
0x00
NOP
何もしない
0x57
POP
オペランド・スタックの先頭にある値をポップする
0x5F
SWAP
オペランド・スタックの先頭にある2つの値を交換
する
0xC4
WIDE
補助バイトを使用したローカル変数インデックスの
拡張をする
目次
1.Javaプログラムの実行
2.研究の目的と結果
3.IJVM (Integer Java Virtual Machine)
(1)Classファイル
4.JVMについて
(2)JVMの命令
5.IJVMエミュレータの概要
(3)JVMの構造
6.まとめ
Classファイル
Class
ファイル
マジックナンバー
マイナーバージョン
メジャーバージョン
コンスタントプール
アクセスフラグ
this_class
super_class
インターフェース
フィールド
メソッド
属性リスト
あるプログラムの
Classファイルの一部
CA FE BA BE 00 00 00 2E 00
2D 0A 00 0D 00 1C 03 00 01
86 A0 07 00 1D 09 00 0C 00
1E 0A 00 0C 00 1F 0A 00 03
00 20 0A 00 0C 00 21 07 00
22 0A 00 08 00 1C 0A 00 08
00 23 0A 00 08 00 24 07 00
25 07 00 26 01 00 0D 63 6F
6E 73 74 61 6E 74 5F 70 6F
6F 6C 01 00 13 5B 4C 6A 61
76 61 2F 6C 61 6E 67 2F 53
74 72 69 6E 67 3B 01 00 06
3C 69 6E 69 74 3E 01 00 03
28 29 56 01 00 04 43 6F 64
65 01 00 0F 4C 69 6E 65 4E
Classファイル中のメソッド情報記述部分
メソッド1
メソッドの個数
(2バイト)
アクセスフラグ(2バイト)
メソッド1
メソッド名CPエントリ番号
(2バイト)
・
・
・
ディスクプリタCPエント番号
(2バイト)
メソッドn
JVMの命令が記述されて
いるのはCode属性だけ
属性リスト
メソッドの属性の種類
・Code属性
・Exceptions属性
・Deprecated属性
・Synthetic属性
目次 1. Javaプログラムの実行
2.研究の目的と結果
3.IJVM(Integer Java Virtual Machine)
4.JVMについて
(1)Classファイル
(2)JVMの命令
(3)JVMの構造
5.IJVMエミュレータの概要
6.まとめ
JVMの命令
オペコード : 実行する操作を定義したもの(1バイト)
オペランド : 操作が用いるデータ(引数)
オペコードは約200種類
オペコード
オペランドを
持たない命令
オペコード
オペランド1
オペランド2
オペランド
を持つ
命令
・・・
Javaバイトコード : JVMの命令の集合によって記述されたもの
Javaバイトコード
の読み込み例
命令
オペコード
オペランド
iload 1
21
01
return
B1
あるClassファイルのJavaバイトコード
(16進表記)
21 01 B1
命令
引数
命令
iload 01 return
do {
オペコードの取得 ;
if (オペランドが必要か?) {
オペランドの取得 ;
}
} while (オペコードが残っているか?) ;
目次 1. Javaプログラムの実行
2.研究の目的と結果
3.IJVM(Integer Java Virtual Machine)
4.JVMについて
(1)Classファイル
(2)JVMの命令
(3) JVMの構造
5.IJVMエミュレータの概要
6.まとめ
JVMの構造
Classファイル
の取得先
CLASSPATH
インターネット
データサーバ
メソッドエリア
JVM
システム
クラスローダ
ユーザ
クラスローダ
ユーザ
クラスローダ
クラス
クラス
クラス
クラス
クラス
クラス
クラス
クラス
クラス
ス
レ
ッ
ド
Javaスタック
ス
レ
ッ
ド
Javaスタック
プログラム
カウンタ
プログラム
カウンタ
ヒープ
インスタンス
インスタンス
インスタンス
インスタンス
インスタンス
インスタンス
インスタンス
インスタンス
インスタンス
フレーム
フレーム
オペランド
スタック
オペランド
スタック
ローカル変数
ローカル変数
フレーム
オペランド
スタック
ローカル変数
あるJavaのスレッド(スレッドAとする)がmethod1
というメソッドを実行した場合
スレッドA
Javaスタック
フレーム3
フレーム2
フレーム1
method1() {
method2();
…
}
method2() {
method3();
…
}
先頭のフレームが作業中のフレーム
(例)method1の
命令
バイトコードのある部分
命令
iload 1 istore 2
21 01 36 02
フレーム
method1
ローカル変数配列
オペランドスタック
0
this
a
1
a
2
ab
目次 1. Javaプログラムの実行
2.研究の目的と結果
3.IJVM(Integer Java Virtual Machine)
4.JVMについて
(1)Classファイル
(2)JVMの命令
(3) JVMの構造
5.IJVMエミュレータの概要
6.まとめ
5.IJVMエミュレータの概要
Classファイルを読み込み様々な情報を格納するプログラム
保存しておく情報
定数
フィールド
インターフェース
メソッド
配列に格納
メソッドの情報を受け取りJavaバイトコードを実行するプログラム
フレームを可視化するプログラム
目次
1.Javaプログラムの実行
2.研究の目的と結果
3.JVMについて
4.IJVM(Integer Java Virtual Machine)
5.IJVMエミュレータの概要
6.まとめ
6.まとめ
この研究で
作成したもの
Integer Java Virtual Machine
(命令20種類)のエミュレータ
IJVMには存在しないJVMの命令を作成
Java Virtual Machine
(命令約200種類)のエミュレータを作成
JVMの高速化のために、
様々なアプリケーションの実行時におけるJVMの
各命令の使用頻度及び使用順序の調査を行う。
ダウンロード

Java Virtual Machine