2009-07-04 12 views
6

JVM/CLRはどのようにJITコンパイルされたネイティブコードを実行しますか?それはいくつかのコードを挿入するか、実行可能なメモリにコードをコピーすることによってですか?動的コード実行を可能にするシステムコールとは何ですか?JVM/CLRによるネイティブコード実行

答えて

2

私はJavaのしくみについては特に分かりませんが、一般的には、 "トラップ"オペコードをインタプリタの命令ストリームに挿入します。この目的のために特別に作られたような2つのオペコードin the JVM specがあります。

あなたは確かに知りたい場合は、ソースよりも良い答えはありません:http://download.java.net/jdk6/source/

2

共通言語ランタイムがコードをエントリがJITにネイティブコードまたはネイティブスタブを指しているとの種類ごとにmethodtable管理しており、次に作成したネイティブコードへのポインタでmethodtableをフィックスアップします。

MSDNは

This blog entry by Dave Notario MethodDescセクションの深さexplanationでより多くを持っているが、CLRのJITコンパイラがどのように機能するかを説明します。

3

CACAO VM(調査JITのみのJVM)で私たちがどのようにそれを行うのか説明できます。まず、あるヒープ割り当てメモリブロックにメソッドのマシンコードが生成されます。コンパイル後、最終的なコード長は既知であり、mmapPROT_EXECフラグ(関連するCACAOコードhere)を使用して実行可能なメモリのチャンクが割り当てられます。次に、マシンコードがmmapped領域にコピーされます。その後、多くのアーキテクチャでは、マシン固有のキャッシュフラッシュメカニズムが必要になります。たとえば、PowerPC 64用のcache-flushing functionを見てください。特に、i386とx86_64では何もしません。このステップの後、プロセッサは新たに生成されたコードを実行する準備が整う。代わりに、すでに割り当てられたメモリページはmprotectで実行可能とマークすることができます。 mmap/mprotectはUnixの機能です。

+0

DEPとデータと実行可能コードの明確な分離を考慮すると、その実行可能メモリに書き込むことができず、データメモリをジャンプ/実行することはできないため、CLR/JIT 。 – Abel

+1

@Abel [this](http://blogs.msdn.com/b/vcblog/archive/2009/05/21/dynamicbase-and-nxcompat.aspx)の記事が興味深いかもしれません。 – ghord

関連する問題