2013-07-11 8 views
5

Javaでは、JVM(例えば、HotSpot)はJITコンパイルが可能であり、この技法は、バイトコードをネイティブコードにコンパイルすることによって実行をスピードアップするために使用される。私の質問は、これは技術的にどのように起こるのでしょうか?私の理解では、最新のプロセッサーは、メモリー領域を読み取り専用のセクションと悪質なコードの実行を防ぐために実行可能なセクションにマークしていました。したがって、JVMはアクセス可能なメモリ空間(つまり自己修正コード)に実際に新しい "実行可能コード"を書き込むことはできません。したがって、JVMがネイティブコードを生成し、それをファイルに書き込んだ後、オペレーティングシステムサービスを使用してそのネイティブコードをメモリに動的にロードし、ネイティブコード(関数)の場所のアドレスの内部マッピングテーブルを維持することを推測していますオペレーティングシステムがこの動的コードをロードした後でメモリ内に格納され、それらのネイティブ命令に分岐することができます。JavaのJITコンパイルはどのように動的にコンパイルされた命令をメモリにロードしますか?

私はこの回答を見ました:How is JIT compiled code injected in memory and executed?ですが、なぜオペレーティングシステムがユーザープログラムにREAD + EXECUTEメモリ領域を許可するのか混乱しています。他のオペレーティングシステム、つまりLinuxなどは、JITが動作するために類似のものを提供していますか?

誰かが私の理解を明確にするのに役立つことができますか?

答えて

3

Linuxでは、メモリセグメントを書き込み可能かつ実行可能に設定することができます(また、保護によって変更することもできます)。 mmap(2)mprotect(2) syscallsを見てください。

JVMは、おそらくディスクファイルを使用せずにメモリ内にマシンコードを生成します。そのJIT機構はおそらく、実行可能メモリにバイトを書き込むだけです。

JVMは、コードを生成しているので、生成されたマシンコード保護を変更したくないことがあります(書き込み可能なメモリセグメントと実行可能なメモリセグメント内のすべてのマシンコードを生成する可能性があります)。厄介なことをしないでください(約proof-carrying codeを読んでください)。

一部のJVMは、フリーソフトウェア(OpenJdk内部例えば1)されている、あなたはそれらのソースコードを学ぶことができ...

Just-in-time compilationHotSpotVirtual Memory wikiページを読み、いくつかのjavaプロセスを-ing straceを試してみてください。

関連する問題