JP2004507832A - 仮想マシン命令を実行するシステム - Google Patents
仮想マシン命令を実行するシステム Download PDFInfo
- Publication number
- JP2004507832A JP2004507832A JP2002523152A JP2002523152A JP2004507832A JP 2004507832 A JP2004507832 A JP 2004507832A JP 2002523152 A JP2002523152 A JP 2002523152A JP 2002523152 A JP2002523152 A JP 2002523152A JP 2004507832 A JP2004507832 A JP 2004507832A
- Authority
- JP
- Japan
- Prior art keywords
- virtual machine
- instruction
- native
- group
- machine instruction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline, look ahead
- G06F9/3802—Instruction prefetching
- G06F9/3808—Instruction prefetching for instruction reuse, e.g. trace cache, branch target cache
- G06F9/381—Loop buffering
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline, look ahead
- G06F9/3877—Concurrent instruction execution, e.g. pipeline, look ahead using a slave processor, e.g. coprocessor
- G06F9/3879—Concurrent instruction execution, e.g. pipeline, look ahead using a slave processor, e.g. coprocessor for non-native instruction execution, e.g. executing a command; for Java instruction set
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
Abstract
【課題】プロセサコア、メモリそして仮想マシンインタプリタを備えたデータ処理システムを提供する。
【解決手段】仮想マシンインタプリタはプロセサコアにより実行される仮想マシン命令を導入するネイティブマシン命令を発生する。仮想マシンインタプリタは繰り返し実行されることが予想される一連の仮想マシン命令の一群から先頭仮想マシン命令を検出する。仮想マシンインタプリタは一群中の先頭仮想マシン命令とメモリのメモリ位置との対応関係を記録し、このメモリ位置からメモリにネイティブマシン命令を書き込む。このメモリ位置からメモリに書き込まれたネイティブマシン命令を実行することにより、プロセサコア上記一群のためのネイティブマシン命令を繰り返し実行する。
【解決手段】仮想マシンインタプリタはプロセサコアにより実行される仮想マシン命令を導入するネイティブマシン命令を発生する。仮想マシンインタプリタは繰り返し実行されることが予想される一連の仮想マシン命令の一群から先頭仮想マシン命令を検出する。仮想マシンインタプリタは一群中の先頭仮想マシン命令とメモリのメモリ位置との対応関係を記録し、このメモリ位置からメモリにネイティブマシン命令を書き込む。このメモリ位置からメモリに書き込まれたネイティブマシン命令を実行することにより、プロセサコア上記一群のためのネイティブマシン命令を繰り返し実行する。
Description
【0001】
【発明の属する技術分野】
この発明は、仮想マシン命令とは異なるネイティブ命令を実行するプロセッサコアを用いて仮想マシン命令プログラムを実行する方法及び装置に関する。
【0002】
【従来の技術】
仮想マシンプログラムは、コンパイルされたJAVAプログラム実行時やこの仮想マシン命令プログラムとは異なる命令セットを備えたプロセサによりエミュレートされるプロセサによるプログラム実行時などの様々状況で実行される。
【0003】
JAVAの場合、JAVA言語によるプログラムがまず、JAVAバイトコードと呼ばれるJAVA仮想マシン命令のプログラムにコンパイルされる。コンパイルは、多くの実行時、即ち、”Just−In−Time”(JIT)、JAVAプログラム実行前、JAVAプログラムのブロック実行前に一度だけ行われる。このプログラム又はブロックはJAVA仮想マシン命令にコンパイルされてメモリにロードされる。そしてプロセサによりバイトコードが実行される。このプロセサによってJAVA言語に規定されたそれらバイトコードのための効果が得られなければならない。
【0004】
仮想マシンプログラムはインタプリタにより実行される。このインタプリタは、例えば、プロセサのエミュレーションプログラムにより実行され、又はインストラクションメモリとプロセッサコア間にプリプロセサを配して実行される。インタプリタプログラムは仮想マシン命令をロードし、仮想マシン命令により要求される効果を得るためにどんなアクションをとるかを判断し、そしてそれらのアクションをとるためのネイティブマシン命令を備える。同様にプリプロセサは仮想マシン命令をチェックし、上記要求される効果を得るためのプロセサに対し命令を発する。
【0005】
両者いずれの場合においても、仮想マシン命令はロードされ直ぐに変換される。各仮想マシン命令は、実行時(又は直ぐ後で実行されるるとき)一つ以上のネイティブマシン命令に変換される。実行時、プログラムフローによりどの各仮想マシン命令を変換するかが指示される。このため、エミュレータが仮想プログラムカウンタを備え、命令実行中カウウントアップし、又は仮想マシンブランチ命令を実行するように変更する。
【0006】
【発明が解決しようとする課題】
通常、仮想マシン命令プログラムの実行エミュレレーションは、同様なネイティブマシン命令プログラムの実行よりはるかに遅い。これを早めるためのあるタスクを備えたネイティブマシン命令プログラムライブラリが従来知られている。仮想マシン命令プログラムがこのタスクの実行を要求すると、ライブラリからあるプログラムが呼び出されて、エミュレータの管理なしに、タスクを速く実行するようプロセサを制御する。JITコンパイラはVMの実行を早める他の手段である。しかし、これらはVMコードと変換されたコードの両方を記憶する多くのメモリを必要とする。これに加えて、実際の変換が行われる実行フェーズは非常に遅いためこれらの実行タイミングは予測しがたい。
【0007】
PCT特許出願番号99/18486によれば仮想マシン命令プログラムを実行するプリプロセサは公知である。このプリプロセサは、仮想マシン命令とネイティブマシン命令の実行を非常に早く切り替えることができる。このプリプロセサはプロセサコアのプログラムカウンタを監視する。仮想マシン命令とネイティブマシン命令のそれぞれに所定のプログラムカウンタ値範囲が規定されている。カウント値がネイティブマシン命令用に規定された範囲にある限り、プリプロセサは受動的で、メモリよりプロセサにフェッチされるネイティブマシン命令がプログラムカウンタにより指定される。一方、カウント値が仮想マシン命令用に規定された範囲にあるとプリプロセサは能動的になり、プロセサコア用ネイティブマシン命令はもはやメモリよりフェッチされなくなる。プリプロセサは仮想マシン命令をメモリよりロードし、これら仮想マシン命令よりネイティブマシン命令を発生する。ネイティブマシン命令のプログラムライブラリとして導入されているタスクの実行を仮想マシン命令が要求すると、プリプロセサはプロセサコアを制御してプロセサコアのプログラムカウンタをネイティブマシン命令プログラムの開始点に変更する。これによりネイティブマシン命令プログラム実行速度は速まるが、仮想マシン命令実行速度は依然として遅い。
【0008】
米国特許番号5,889,996に記載されているインタプリタはネイティブマシン命令プログラムの、仮想マシン命令に応じた異なるブロックを示している。この特許によれば、これらのブロックはすべてキャッシュメモリにロードされ、インタプリタは仮想マシン命令を実行する度に、適切なブロックに制御を移す。これにより、キャッシュメモリより必要なネイティブマシン命令がフェッチされるのでプグラム実行速度が上がる。しかし、仮想マシン命令実行速度は依然としてネイティブマシン命令プログラム実行速度より遅い。
【0009】
従って、この発明の目的は、実行速度が早い仮想マシン命令実行方法及び装置を提供するものである。
【0010】
【課題を解決するための手段】
この発明の装置並びに方法は請求項1並びに請求項5に規定されている。繰り返し実行されることが予想される仮想マシン命令を導入するネイティブマシン命令群の少なくとも一部が規定されている。ネイティブマシン命令群の少なくとも一部、好ましくは、繰り返し実行されることが予想される命令の1セット又はそれ以上のループの開始点での仮想マシン命令に対応する第1のネイティブマシン命令からメモリに記憶される。エミュレータがネイティブマシン命令群の少なくとも一部の開始点の記憶位置とこの開始点に相当する仮想マシン命令の対応関係を記録する。続いて、エミュレータはプロセサコアを制御して、仮想マシン命令の各繰り返し実行のために対応するネイティブマシン命令を発生することなしに、メモリからネイティブマシン命令群の少なくとも一部を実行する。好ましくは、ネイティブマシン命令群はキャッシュメモリに保存される。
【0011】
繰り返し実行されることが予想されるネイティブマシン命令群の好ましい例はループであり、割り込み命令が実行されることなく命令群は続いて繰り返し実行される。しかし、この発明は、例えば、サブルーチン命令群のように、他の理由で繰り返し実行されるループではない命令群にも適用できる。ループの場合は命令群全体が保存されるとよい。さらに好ましくは、バックワードブランチネイティブマシン命令群が発生され、命令群の最後でメモリ保存されるとよい。これにより、エミュレータのさらなる介入なしにループが繰り返し実行される。代わりに、ループ実行毎にループの一部に対応したネイティブマシン命令を新たにエミュレータより発生してもよい。これにより実行効率は落ちるが、ループ内のある命令がエミュレータによる特別な処理を必要とする場合に効果的である。
【0012】
好ましくは、エミュレータにより、プロセサコアの命令フェッチアドレスから命令群の命令をプロセサコアが実行中であるかどうか、又はプログラムカウンタが命令群のカウントを終了したかを判断する。後者の場合、エミュレータはネイティブマシン命令の発生を再開する。原理的に、エミュレータは命令群の最終アドレスを記憶し、このアドレスと命令フェッチアドレスを比較することにより、プロセサコアの命令フェッチアドレスにより命令群がフェッチされたことを検出する。しかし、好ましくは、命令群の最後でブランチ命令を追加してプロセサがいくつかの事前に規定されたアドレス範囲(例えば、アドレスの所定ビットが1に等しいが、所定範囲であればよい)に入り込む。この場合、エミュレータは命令フェッチアドレスがその所定範囲にあるか判断すればよい。
【0013】
原理的に、命令群のネイティブマシン命令は発生されたとき初めてプロセサにより実行され、エミュレータにより記憶される。即ち、命令群全体が発生され記憶される前にネイティブマシン命令は実行される。この場合、プロセサコアはネイティブマシン命令の命令群を2度又はそれ以上実行する。しかし、好ましい実施形態では、エミュレータにより命令群をまず記憶し、そしてメモリから発生したループの命令をプロセサコアが実行開始するよう制御する。そしてプロセサコアは1度メモリからの命令群を実行する。従って、他の実行と異なるループの最初の実行を処理する必要が無く、エミュレータの動作が簡単になる。
【0014】
この発明においては、命令群の少なくとも一部の最初のネイティブマシン命令とこのネイティブマシン命令が記憶されるメモリ位置の対応関係を記録する必要がある。
【0015】
これは、例えば、予め規定されたメモリ位置からの命令群の少なくとも一部に対して発生したネイティブマシン命令を記憶し始めることで達成され、これは実行されるある特定のプログラムとは無関係に行われる。
【0016】
発生したネイティブマシン命令の記憶開始をエミュレータが知るためには、記憶されるべく発生したネイティブマシン命令に対するプログラムの一部の最初の仮想マシン命令を示すヒント情報が仮想マシン命令プログラムと組合わさるとよい。このヒント情報はプログラムの追加命令でもよく、又はプログラムのその部分の最初の仮想マシン命令位置を示すリストであってもよい。例えば、そのような処理に適するループ又はサブルーチン命令群を検出するプログラムを分析することによりこのヒント情報を先にコンパイルしてもよい。
【0017】
代わりに、プログラム実行中に発生したネイティブマシン命令をほぼ区別無く記憶して、プログラム中の仮想マシン命令位置と対応する発生したネイティブマシン命令のメモリアドレスの組み合わせを記録してもよい。従って、仮想マシンブランチバック命令が発生したら、エミュレータによりブランチの仮想マシン目的位置により対応するネイティブマシン命令が開始するメモリ位置を検出することができる。これにより、プロセサコアはメモリからのこれらの命令を実行開始できる。
【0018】
【発明の実施の形態】
以下、図面を参照して、この発明の実施形態を説明する。
【0019】
図1はこの発明の一実施形態である装置を示している。この装置はプロセサコア10,メモリシステム14,そしてメモリシステム14とプロセサコア10に配された仮想マシンインタプリタ12を備えている。プロセサコア10は命令アドレス出力100を出力し、仮想マシンインタプリタ12から命令入力102を受ける。メモリシステム14はアドレス入力144を受け、仮想マシンインタプリタ12との間でデータ入出力146をやりとりする。メモリシステム14にはキャッシュメモリ140と主メモリ142が備えられている。説明を簡単にするために、プロセサコア10へのオペランドデータ入力は示していない。これはこの発明の理解には必ずしも必要ではないからである。オペランドデータは例えば別々の図示しないデータメモリからプロセサコア10に対するそれ自身のデータアドレスとデータ値の関係から、プロセサコア10に与えられる。又は、命令供給との時分割マルチプレックスによりメモリシステム14から与えられても良い。このシステムはVM命令と発生するネイティブマシン命令に対し物理的に異なるメモリを備えてもよく、VMIが書き込み接続を有するメモリに対しプロセサコアが読み出し接続を有することになる。
【0020】
仮想マシンインタプリタ12は、プリプロセサ120、命令マルチプレクサ122,アドレスマルチプレクサ124そして読み出し/書き込みスイッチ126を備える。仮想マシンインタプリタ12の制御出力は命令マルチプレクサ122、アドレスマルチプレクサ124、読み出し/書き込みスイッチ126の制御入力となる。プロセサコア10のアドレス出力100がプリプロセサ120の入力となる。プリプロセサ120のアドレス出力はアドレスマルチプレクサ124を介してメモリシステム14のアドレス入力144となる。プリプロセサ120の仮想マシン命令入力はメモリシステム14のデータ入出力146となる。プリプロセサ120のネイティブマシン命令出力は命令マルチプレクサ122を介してプロセサコア10の命令入力102となる。
【0021】
これらの入出力関係により、仮想マシンインタプリタ12が通常動作モードとなり、アドレスマルチプレクサ124を介して、またメモリシステム14のデータ入出力142からの仮想マシン命令に応答して、プリプロセサ120が仮想マシン命令のアドレスをメモリシステム14のアドレス入力140として発生する。プリプロセサは受け取った仮想マシン命令を解読して、この仮想マシン命令に対してどのネイティブマシン命令をプロセサコア10が実行すべきかを判断する。そして、これらのネイティブマシン命令を命令マルチプレクサ122を介してプロセサコア10命令入力102とする。
【0022】
プリプロセサ120は(プロセサコア10のプログラムカウンタとは異なる)仮想マシンプログラムカウンタを有し、これによりプログラムフロー中次に実行すべき仮想マシン命令のプログラムにおける位置を検出する。通常モードでは、プリプロセサ120自身が仮想マシン命令を取り扱い、これがプリプロセサのプログラムカウンタに働きかける。ブランチ命令の状態検出以外には、この目的のためにネイティブマシン命令を発生する必要はない。原理的には、このように通常モードで、繰り返し実行されるプログラムループとサブルーチンを含み、すべての仮想マシン命令が実行可能である。しかし、この発明では繰り返し実行されると予想されるプログラムのそのような部分には特別な処理が(必要ではないが)施されることもある。
【0023】
ループ動作モードでは、仮想マシンインタプリタ12は発生したネイティブマシン命令を直接プロセサコア10に与えることはない。代わりに、仮想マシンインタプリタはこれらの命令をメモリシステム14に記憶する。これは、メモリシステム14のアドレス入力140に、アドレスマルチプレクサ124を介して、また、データ読み出し/書き込みスイッチ126を介してデータ入出力142にネイティブマシン命令を与えることにより行われる。この目的のため、データ読み出し/書き込みスイッチ126を介してネイティブマシン命令出力がメモリシステム14のデータ入出力142に与えられる。
【0024】
ネイティブ実行モードでは、プロセサコア10がメモリシステム14からのネイティブマシン命令を実行する。この目的のため、プロセサコア10の命令アドレス出力100が、アドレスマルチプレクサ124を介して、メモリシステム14のアドレス入力140に与えられる。そしてプロセサコア10の命令入力102が命令マルチプレクサ122を介してメモリシステム14のデータ入出力142に与えられる。
【0025】
図2は仮想マシンインタプリタ12の動作を示すフローチャートである。通常動作モードでは、仮想マシンインタプリタ12は、最終ステップ29で仮想マシン命令の終了(又は仮想マシンプログラムを停止させるバイトコードの実行)を検知するまで第一ステップ21,第二ステップ22,第三ステップ23を繰り返す。フローチャートのステップ21において、仮想マシンインタプリタ12はメモリシステム14からある仮想マシン命令をロードし、この命令がループの開始命令か否かを判定する。開始命令でない場合、仮想マシンインタプリタ12は第二ステップ22を実行する。第二ステップ22では、仮想マシンインタプリタ12は第一ステップ21でロードされた仮想マシン命令を解読し、この仮想マシン命令を実行する少なくとも一つのネイティブマシン命令を発生する。このネイティブマシン命令発生過程はすでに引用したPCT特許出願番号99/18486及びそれに対する引例に記載されている。第三ステップ23で、仮想マシンインタプリタ12は発生したネイティブマシン命令又をプロセサコア10に与え、プロセサコアからの命令アドレス出力ををモニタして次の仮想マシン命令をいつ実行すべきか判定する。次の仮想マシン命令を実行するときは最終ステップ29を実行してプログラムが終了したか判断する。終了してない場合は、第一ステップ21,第二ステップ22,第三ステップ23を繰り返す。第一ステップ21,第二ステップ22,第三ステップ23へ戻るのは無条件に行われてもよく、仮想マシンプログラムを停止させるバイトコードに応答してソフトウエアトラップ命令を実行してロープから抜けても良い。
【0026】
通常動作モードでは、プロセサコア10から発生した命令アドレスは命令を特定するのには用いられない。仮想マシンインタプリタ12の仮想マシンプログラムカウンタがメモリシステム14内のアドレスを制御しここから仮想マシン命令をフェッチする。仮想マシンインタプリタ12はプロセサコア10から発生した命令アドレスを用いてプロセサコア10の状態テストを行ってもよい。これは、ネイティブ条件ブランチ命令をプロセサコア10に与えプロセサコア10がこのブランチを受け入れるかを見ることにより行われる。さらに、仮想マシンインタプリタ12は、少なくとも二つの命令アドレスレンジを規定し、その一の最上位ビットを1とすることにより、プロセサコア10から発生した命令アドレスをモード選択に用いてもよい。第1のレンジ内でプロセサコア10がアドレスを発生する間は、上記したように、仮想マシンインタプリタ12は通常モードで仮想マシン命令を解読する。しかし、プロセサコア10が発生したアドレスが第1のレンジ以外であると、仮想マシンインタプリタ12は別のモード、例えば、ネイティブモードで動作し、プロセサコア10がメモリシステム14からネイティブマシン命令をフェッチし実行する。
【0027】
第一ステップ21で、仮想マシンインタプリタ12がループの開始命令がロードされたことを検出すると、仮想マシンインタプリタ12は第四ステップ24,第五ステップ25,第六ステップ26、第七ステップ27,第八ステップ28を実行する。第四ステップ24は第二ステップ22と似ており、現在の仮想マシン命令を実行するための一つ以上のネイティブマシン命令を発生する。しかし、第五ステップ25では仮想マシンインタプリタ12は、この(これらの)ネイティブマシン命令を、第三ステップ23で実行する代わりに、メモリシステム14に記憶する。第六ステップ26で仮想マシンインタプリタ12は次の仮想マシン命令をロードし、この仮想マシン命令がループの最終命令ではない場合は第四ステップ24に戻る。このようにして、仮想マシンインタプリタ12は発生した一連のネイティブマシン命令をメモリシステム14に記憶する。仮想マシンインタプリタ12が仮想マシン命令のループの最後まで達したことを検知したら、第七ステップ27,第八ステップ28を実行する。第七ステップ27では、ループに対して発生した一連の命令の最後で、仮想マシンインタプリタ12がネイティブ条件ブランチバック命令をメモリシステム14に記憶する。ネイティブ条件ブランチバック命令の後、仮想マシンインタプリタ12は無条件ブランチ命令を所定のレンジ内の命令アドレスに記憶する。この所定レンジは、例えば、プロセサコア10から発生する仮想マシンインタプリタ12が通常モードで動作すべきアドレスから始まるレンジである。
【0028】
第八ステップ28で、仮想マシンインタプリタ12はブランチ命令をプロセサコア10に与えて、ループに対して発生した一連のネイティブ命令をフェッチする。この点に関して、第八ステップ28は第三ステップ23に似ている。ただし、第八ステップ28ではプロセサコア10がメモリシステム14からのネイティブ命令を実行するのに対し、第三ステップ23ではネイティブ命令は仮想マシンインタプリタ12から供給される点が異なる。第八ステップ28において、プロセサコア10が発生した命令アドレス値を仮想マシンインタプリタ12がモニタしてプロセサコア10がループから抜けたことを検知するまで、プロセサコア10はメモリシステム14から命令をフェッッチし実行する。そして、仮想マシンインタプリタ12は最終ステップ29を実行して通常モード動作を再開する。
【0029】
図2のフローチャートは、ネイティブ命令が発生しメモリに記憶された後にループが実行される例を示している。これがこの発明の最も簡潔な応用例であるが、ループ以外の繰り返し実行されると予想される他の仮想マシン命令セットにもこの発明は応用できる。例としては、サブルーチン、例外的ハンドラ又はより大きなループの最も処理しやすい命令群等である。これらの場合、記憶されたネイティブマシン命令は発生した命令の最後にブランチバックを含まない。一連の仮想マシン命令の実行を仮想マシンプログラムが呼び出す度に、記憶された対応するネイティブ命令に制御が戻る。
【0030】
図2の実施形態では、繰り返し実行される仮想マシン命令セットに対して発生した第1のネイティブ命令からのみ、仮想マシンインタプリタ12が発生したネイティブマシン命令のメモリシステム14への書き込みを開始する。仮想マシンインタプリタ12がネイティブマシン命令の書き込みを開始するメモリアドレスは、実行される仮想マシン命令プログラムとは無関係な、所定のメモリアドレスでもよい。これにより、ループ外の仮想マシン命令に対して発生するネイティブマシン命令の書き込みにオーバヘッドが生ずることがなくなる。さらには、メモリシステム14にキャッシュメモリを用いるとキャッシュ交換量がこのように減少する。
【0031】
しかし、これは仮想マシンインタプリタ12が、発生したネイティブマシン命令をいつ書き込み始めるかを示す信号が必要であることを意味する。所定数の仮想マシン命令を所定回数実行することを示すループ命令を仮想マシン命令が含む場合は、発生したネイティブマシン命令を記憶開始するためのトリガーとして用いることができる。代わりに、解読結果がメモリに記憶されるべき命令群の開始を示すメタ命令を仮想マシン命令プログラムに含んでもよい。この場合、メタ命令により、第1ステップにおいて仮想マシンインタプリタ12が次の仮想マシン命令をロードし、第4ステップ24から実行する。なお、必ずしも必要ではないがメタ命令は仮想マシン命令群のサイズを示しても良く、命令群の位置に等しいブランチターゲットを用いて仮想マシンブランチバック命令から命令群の最後が検出される。代わりに、そのような命令群の先頭にある仮想マシン命令のアドレスリストと仮想マシンプログラムを組み合わせても良い。この場合、第1ステップ21で、仮想マシンインタプリタ12がこのリストの少なくとも一部をロードして現在の仮想マシン命令アドレスと比較する。
【0032】
仮想マシン命令の位置は、例えば、高水準言語から仮想マシン命令へのコンパイル最中に、コンパイルされた高水準言語ループ(例えばループ用)位置として検出してもよい。代わりに、仮想マシンプログラムをを事前処理してこれらの位置を検出し、ブランチバック命令を検出し、そして検出されたブランチバック命令のターゲットをループの開始点としてマークしてもよい。従って、高水準言語ソースコードが不要となる。同様に、サブルーチンの開始点(仮想マシン命令がサブルーチン命令にジャンプするためのターゲット)及び/又はキャッシングの例外としての命令をこのようにマークしてもよい。
【0033】
最も簡潔な実施形態としては、メモリから発生したネイティブマシン命令シーケンスの実行を、ブランチ命令を含まない仮想マシン命令セット又はこのセットの最後のブランチバック以外の他の制御転送命令用のネイティブマシン命令シーケンスのみに適用してもよい。これにより、毎回実行すべきネイティブマシン命令シーケンスが同じになる。もし、セットの最後には位置しないブランチ命令を仮想マシン命令セットが含む場合は多くの手法がとれる。第1の手法は通常モードでのこのセットの実行であり、即ち、毎回仮想マシン命令の解読を実行し、メモリからの解読された命令は実行しない。
【0034】
仮想マシン命令セット内のブランチのための第2の手法は、ネイティブマシン命令セットを、同じネイティブマシン命令と共にいつも実行される複数部分に分岐し、これら部分用に記憶されたネイティブマシン命令を記憶することである。この場合、仮想マシン命令セットの最後にはない制御命令の転送において終了する各部分のネイティブマシン命令の終了を仮想マシンインタプリタ12が検出する。これは、通常モードでの実行を示すレンジにジャンプする各部分の最後へのネイティブマシン命令の挿入と組み合わせたい場合は、プロセサコア10により発生した命令アドレスをモニタすることにより行ってもよい。ネイティブマシンブランチ命令のブランチターゲットは終了した部分を示すのに用いてもい。この部分の実行終了時に、制御転送を命令する仮想マシン命令を仮想マシン命令が処理し、そしてプロセサコアにメモリシステム14からの、仮想マシン命令セットの選択された部分のために発生したネイティブマシン命令を実行する。又は命令セット以外に仮想マシン命令が制御を転送する場合は、通常モードが再開する。
【0035】
第3の手法は、ネイティブマシン命令間のネイティブマシンブランチ命令を用いて、命令セット内で制御転送命令を実行するそれら制御を転送を発生することある。これによりネストループが実現できる。
【図面の簡単な説明】
【図1】
この発明の装置の一実施形態を示す図である。
【図2】
仮想マシンプログラムをエミュレートする方法を示すフローチャートを示す図である。
【発明の属する技術分野】
この発明は、仮想マシン命令とは異なるネイティブ命令を実行するプロセッサコアを用いて仮想マシン命令プログラムを実行する方法及び装置に関する。
【0002】
【従来の技術】
仮想マシンプログラムは、コンパイルされたJAVAプログラム実行時やこの仮想マシン命令プログラムとは異なる命令セットを備えたプロセサによりエミュレートされるプロセサによるプログラム実行時などの様々状況で実行される。
【0003】
JAVAの場合、JAVA言語によるプログラムがまず、JAVAバイトコードと呼ばれるJAVA仮想マシン命令のプログラムにコンパイルされる。コンパイルは、多くの実行時、即ち、”Just−In−Time”(JIT)、JAVAプログラム実行前、JAVAプログラムのブロック実行前に一度だけ行われる。このプログラム又はブロックはJAVA仮想マシン命令にコンパイルされてメモリにロードされる。そしてプロセサによりバイトコードが実行される。このプロセサによってJAVA言語に規定されたそれらバイトコードのための効果が得られなければならない。
【0004】
仮想マシンプログラムはインタプリタにより実行される。このインタプリタは、例えば、プロセサのエミュレーションプログラムにより実行され、又はインストラクションメモリとプロセッサコア間にプリプロセサを配して実行される。インタプリタプログラムは仮想マシン命令をロードし、仮想マシン命令により要求される効果を得るためにどんなアクションをとるかを判断し、そしてそれらのアクションをとるためのネイティブマシン命令を備える。同様にプリプロセサは仮想マシン命令をチェックし、上記要求される効果を得るためのプロセサに対し命令を発する。
【0005】
両者いずれの場合においても、仮想マシン命令はロードされ直ぐに変換される。各仮想マシン命令は、実行時(又は直ぐ後で実行されるるとき)一つ以上のネイティブマシン命令に変換される。実行時、プログラムフローによりどの各仮想マシン命令を変換するかが指示される。このため、エミュレータが仮想プログラムカウンタを備え、命令実行中カウウントアップし、又は仮想マシンブランチ命令を実行するように変更する。
【0006】
【発明が解決しようとする課題】
通常、仮想マシン命令プログラムの実行エミュレレーションは、同様なネイティブマシン命令プログラムの実行よりはるかに遅い。これを早めるためのあるタスクを備えたネイティブマシン命令プログラムライブラリが従来知られている。仮想マシン命令プログラムがこのタスクの実行を要求すると、ライブラリからあるプログラムが呼び出されて、エミュレータの管理なしに、タスクを速く実行するようプロセサを制御する。JITコンパイラはVMの実行を早める他の手段である。しかし、これらはVMコードと変換されたコードの両方を記憶する多くのメモリを必要とする。これに加えて、実際の変換が行われる実行フェーズは非常に遅いためこれらの実行タイミングは予測しがたい。
【0007】
PCT特許出願番号99/18486によれば仮想マシン命令プログラムを実行するプリプロセサは公知である。このプリプロセサは、仮想マシン命令とネイティブマシン命令の実行を非常に早く切り替えることができる。このプリプロセサはプロセサコアのプログラムカウンタを監視する。仮想マシン命令とネイティブマシン命令のそれぞれに所定のプログラムカウンタ値範囲が規定されている。カウント値がネイティブマシン命令用に規定された範囲にある限り、プリプロセサは受動的で、メモリよりプロセサにフェッチされるネイティブマシン命令がプログラムカウンタにより指定される。一方、カウント値が仮想マシン命令用に規定された範囲にあるとプリプロセサは能動的になり、プロセサコア用ネイティブマシン命令はもはやメモリよりフェッチされなくなる。プリプロセサは仮想マシン命令をメモリよりロードし、これら仮想マシン命令よりネイティブマシン命令を発生する。ネイティブマシン命令のプログラムライブラリとして導入されているタスクの実行を仮想マシン命令が要求すると、プリプロセサはプロセサコアを制御してプロセサコアのプログラムカウンタをネイティブマシン命令プログラムの開始点に変更する。これによりネイティブマシン命令プログラム実行速度は速まるが、仮想マシン命令実行速度は依然として遅い。
【0008】
米国特許番号5,889,996に記載されているインタプリタはネイティブマシン命令プログラムの、仮想マシン命令に応じた異なるブロックを示している。この特許によれば、これらのブロックはすべてキャッシュメモリにロードされ、インタプリタは仮想マシン命令を実行する度に、適切なブロックに制御を移す。これにより、キャッシュメモリより必要なネイティブマシン命令がフェッチされるのでプグラム実行速度が上がる。しかし、仮想マシン命令実行速度は依然としてネイティブマシン命令プログラム実行速度より遅い。
【0009】
従って、この発明の目的は、実行速度が早い仮想マシン命令実行方法及び装置を提供するものである。
【0010】
【課題を解決するための手段】
この発明の装置並びに方法は請求項1並びに請求項5に規定されている。繰り返し実行されることが予想される仮想マシン命令を導入するネイティブマシン命令群の少なくとも一部が規定されている。ネイティブマシン命令群の少なくとも一部、好ましくは、繰り返し実行されることが予想される命令の1セット又はそれ以上のループの開始点での仮想マシン命令に対応する第1のネイティブマシン命令からメモリに記憶される。エミュレータがネイティブマシン命令群の少なくとも一部の開始点の記憶位置とこの開始点に相当する仮想マシン命令の対応関係を記録する。続いて、エミュレータはプロセサコアを制御して、仮想マシン命令の各繰り返し実行のために対応するネイティブマシン命令を発生することなしに、メモリからネイティブマシン命令群の少なくとも一部を実行する。好ましくは、ネイティブマシン命令群はキャッシュメモリに保存される。
【0011】
繰り返し実行されることが予想されるネイティブマシン命令群の好ましい例はループであり、割り込み命令が実行されることなく命令群は続いて繰り返し実行される。しかし、この発明は、例えば、サブルーチン命令群のように、他の理由で繰り返し実行されるループではない命令群にも適用できる。ループの場合は命令群全体が保存されるとよい。さらに好ましくは、バックワードブランチネイティブマシン命令群が発生され、命令群の最後でメモリ保存されるとよい。これにより、エミュレータのさらなる介入なしにループが繰り返し実行される。代わりに、ループ実行毎にループの一部に対応したネイティブマシン命令を新たにエミュレータより発生してもよい。これにより実行効率は落ちるが、ループ内のある命令がエミュレータによる特別な処理を必要とする場合に効果的である。
【0012】
好ましくは、エミュレータにより、プロセサコアの命令フェッチアドレスから命令群の命令をプロセサコアが実行中であるかどうか、又はプログラムカウンタが命令群のカウントを終了したかを判断する。後者の場合、エミュレータはネイティブマシン命令の発生を再開する。原理的に、エミュレータは命令群の最終アドレスを記憶し、このアドレスと命令フェッチアドレスを比較することにより、プロセサコアの命令フェッチアドレスにより命令群がフェッチされたことを検出する。しかし、好ましくは、命令群の最後でブランチ命令を追加してプロセサがいくつかの事前に規定されたアドレス範囲(例えば、アドレスの所定ビットが1に等しいが、所定範囲であればよい)に入り込む。この場合、エミュレータは命令フェッチアドレスがその所定範囲にあるか判断すればよい。
【0013】
原理的に、命令群のネイティブマシン命令は発生されたとき初めてプロセサにより実行され、エミュレータにより記憶される。即ち、命令群全体が発生され記憶される前にネイティブマシン命令は実行される。この場合、プロセサコアはネイティブマシン命令の命令群を2度又はそれ以上実行する。しかし、好ましい実施形態では、エミュレータにより命令群をまず記憶し、そしてメモリから発生したループの命令をプロセサコアが実行開始するよう制御する。そしてプロセサコアは1度メモリからの命令群を実行する。従って、他の実行と異なるループの最初の実行を処理する必要が無く、エミュレータの動作が簡単になる。
【0014】
この発明においては、命令群の少なくとも一部の最初のネイティブマシン命令とこのネイティブマシン命令が記憶されるメモリ位置の対応関係を記録する必要がある。
【0015】
これは、例えば、予め規定されたメモリ位置からの命令群の少なくとも一部に対して発生したネイティブマシン命令を記憶し始めることで達成され、これは実行されるある特定のプログラムとは無関係に行われる。
【0016】
発生したネイティブマシン命令の記憶開始をエミュレータが知るためには、記憶されるべく発生したネイティブマシン命令に対するプログラムの一部の最初の仮想マシン命令を示すヒント情報が仮想マシン命令プログラムと組合わさるとよい。このヒント情報はプログラムの追加命令でもよく、又はプログラムのその部分の最初の仮想マシン命令位置を示すリストであってもよい。例えば、そのような処理に適するループ又はサブルーチン命令群を検出するプログラムを分析することによりこのヒント情報を先にコンパイルしてもよい。
【0017】
代わりに、プログラム実行中に発生したネイティブマシン命令をほぼ区別無く記憶して、プログラム中の仮想マシン命令位置と対応する発生したネイティブマシン命令のメモリアドレスの組み合わせを記録してもよい。従って、仮想マシンブランチバック命令が発生したら、エミュレータによりブランチの仮想マシン目的位置により対応するネイティブマシン命令が開始するメモリ位置を検出することができる。これにより、プロセサコアはメモリからのこれらの命令を実行開始できる。
【0018】
【発明の実施の形態】
以下、図面を参照して、この発明の実施形態を説明する。
【0019】
図1はこの発明の一実施形態である装置を示している。この装置はプロセサコア10,メモリシステム14,そしてメモリシステム14とプロセサコア10に配された仮想マシンインタプリタ12を備えている。プロセサコア10は命令アドレス出力100を出力し、仮想マシンインタプリタ12から命令入力102を受ける。メモリシステム14はアドレス入力144を受け、仮想マシンインタプリタ12との間でデータ入出力146をやりとりする。メモリシステム14にはキャッシュメモリ140と主メモリ142が備えられている。説明を簡単にするために、プロセサコア10へのオペランドデータ入力は示していない。これはこの発明の理解には必ずしも必要ではないからである。オペランドデータは例えば別々の図示しないデータメモリからプロセサコア10に対するそれ自身のデータアドレスとデータ値の関係から、プロセサコア10に与えられる。又は、命令供給との時分割マルチプレックスによりメモリシステム14から与えられても良い。このシステムはVM命令と発生するネイティブマシン命令に対し物理的に異なるメモリを備えてもよく、VMIが書き込み接続を有するメモリに対しプロセサコアが読み出し接続を有することになる。
【0020】
仮想マシンインタプリタ12は、プリプロセサ120、命令マルチプレクサ122,アドレスマルチプレクサ124そして読み出し/書き込みスイッチ126を備える。仮想マシンインタプリタ12の制御出力は命令マルチプレクサ122、アドレスマルチプレクサ124、読み出し/書き込みスイッチ126の制御入力となる。プロセサコア10のアドレス出力100がプリプロセサ120の入力となる。プリプロセサ120のアドレス出力はアドレスマルチプレクサ124を介してメモリシステム14のアドレス入力144となる。プリプロセサ120の仮想マシン命令入力はメモリシステム14のデータ入出力146となる。プリプロセサ120のネイティブマシン命令出力は命令マルチプレクサ122を介してプロセサコア10の命令入力102となる。
【0021】
これらの入出力関係により、仮想マシンインタプリタ12が通常動作モードとなり、アドレスマルチプレクサ124を介して、またメモリシステム14のデータ入出力142からの仮想マシン命令に応答して、プリプロセサ120が仮想マシン命令のアドレスをメモリシステム14のアドレス入力140として発生する。プリプロセサは受け取った仮想マシン命令を解読して、この仮想マシン命令に対してどのネイティブマシン命令をプロセサコア10が実行すべきかを判断する。そして、これらのネイティブマシン命令を命令マルチプレクサ122を介してプロセサコア10命令入力102とする。
【0022】
プリプロセサ120は(プロセサコア10のプログラムカウンタとは異なる)仮想マシンプログラムカウンタを有し、これによりプログラムフロー中次に実行すべき仮想マシン命令のプログラムにおける位置を検出する。通常モードでは、プリプロセサ120自身が仮想マシン命令を取り扱い、これがプリプロセサのプログラムカウンタに働きかける。ブランチ命令の状態検出以外には、この目的のためにネイティブマシン命令を発生する必要はない。原理的には、このように通常モードで、繰り返し実行されるプログラムループとサブルーチンを含み、すべての仮想マシン命令が実行可能である。しかし、この発明では繰り返し実行されると予想されるプログラムのそのような部分には特別な処理が(必要ではないが)施されることもある。
【0023】
ループ動作モードでは、仮想マシンインタプリタ12は発生したネイティブマシン命令を直接プロセサコア10に与えることはない。代わりに、仮想マシンインタプリタはこれらの命令をメモリシステム14に記憶する。これは、メモリシステム14のアドレス入力140に、アドレスマルチプレクサ124を介して、また、データ読み出し/書き込みスイッチ126を介してデータ入出力142にネイティブマシン命令を与えることにより行われる。この目的のため、データ読み出し/書き込みスイッチ126を介してネイティブマシン命令出力がメモリシステム14のデータ入出力142に与えられる。
【0024】
ネイティブ実行モードでは、プロセサコア10がメモリシステム14からのネイティブマシン命令を実行する。この目的のため、プロセサコア10の命令アドレス出力100が、アドレスマルチプレクサ124を介して、メモリシステム14のアドレス入力140に与えられる。そしてプロセサコア10の命令入力102が命令マルチプレクサ122を介してメモリシステム14のデータ入出力142に与えられる。
【0025】
図2は仮想マシンインタプリタ12の動作を示すフローチャートである。通常動作モードでは、仮想マシンインタプリタ12は、最終ステップ29で仮想マシン命令の終了(又は仮想マシンプログラムを停止させるバイトコードの実行)を検知するまで第一ステップ21,第二ステップ22,第三ステップ23を繰り返す。フローチャートのステップ21において、仮想マシンインタプリタ12はメモリシステム14からある仮想マシン命令をロードし、この命令がループの開始命令か否かを判定する。開始命令でない場合、仮想マシンインタプリタ12は第二ステップ22を実行する。第二ステップ22では、仮想マシンインタプリタ12は第一ステップ21でロードされた仮想マシン命令を解読し、この仮想マシン命令を実行する少なくとも一つのネイティブマシン命令を発生する。このネイティブマシン命令発生過程はすでに引用したPCT特許出願番号99/18486及びそれに対する引例に記載されている。第三ステップ23で、仮想マシンインタプリタ12は発生したネイティブマシン命令又をプロセサコア10に与え、プロセサコアからの命令アドレス出力ををモニタして次の仮想マシン命令をいつ実行すべきか判定する。次の仮想マシン命令を実行するときは最終ステップ29を実行してプログラムが終了したか判断する。終了してない場合は、第一ステップ21,第二ステップ22,第三ステップ23を繰り返す。第一ステップ21,第二ステップ22,第三ステップ23へ戻るのは無条件に行われてもよく、仮想マシンプログラムを停止させるバイトコードに応答してソフトウエアトラップ命令を実行してロープから抜けても良い。
【0026】
通常動作モードでは、プロセサコア10から発生した命令アドレスは命令を特定するのには用いられない。仮想マシンインタプリタ12の仮想マシンプログラムカウンタがメモリシステム14内のアドレスを制御しここから仮想マシン命令をフェッチする。仮想マシンインタプリタ12はプロセサコア10から発生した命令アドレスを用いてプロセサコア10の状態テストを行ってもよい。これは、ネイティブ条件ブランチ命令をプロセサコア10に与えプロセサコア10がこのブランチを受け入れるかを見ることにより行われる。さらに、仮想マシンインタプリタ12は、少なくとも二つの命令アドレスレンジを規定し、その一の最上位ビットを1とすることにより、プロセサコア10から発生した命令アドレスをモード選択に用いてもよい。第1のレンジ内でプロセサコア10がアドレスを発生する間は、上記したように、仮想マシンインタプリタ12は通常モードで仮想マシン命令を解読する。しかし、プロセサコア10が発生したアドレスが第1のレンジ以外であると、仮想マシンインタプリタ12は別のモード、例えば、ネイティブモードで動作し、プロセサコア10がメモリシステム14からネイティブマシン命令をフェッチし実行する。
【0027】
第一ステップ21で、仮想マシンインタプリタ12がループの開始命令がロードされたことを検出すると、仮想マシンインタプリタ12は第四ステップ24,第五ステップ25,第六ステップ26、第七ステップ27,第八ステップ28を実行する。第四ステップ24は第二ステップ22と似ており、現在の仮想マシン命令を実行するための一つ以上のネイティブマシン命令を発生する。しかし、第五ステップ25では仮想マシンインタプリタ12は、この(これらの)ネイティブマシン命令を、第三ステップ23で実行する代わりに、メモリシステム14に記憶する。第六ステップ26で仮想マシンインタプリタ12は次の仮想マシン命令をロードし、この仮想マシン命令がループの最終命令ではない場合は第四ステップ24に戻る。このようにして、仮想マシンインタプリタ12は発生した一連のネイティブマシン命令をメモリシステム14に記憶する。仮想マシンインタプリタ12が仮想マシン命令のループの最後まで達したことを検知したら、第七ステップ27,第八ステップ28を実行する。第七ステップ27では、ループに対して発生した一連の命令の最後で、仮想マシンインタプリタ12がネイティブ条件ブランチバック命令をメモリシステム14に記憶する。ネイティブ条件ブランチバック命令の後、仮想マシンインタプリタ12は無条件ブランチ命令を所定のレンジ内の命令アドレスに記憶する。この所定レンジは、例えば、プロセサコア10から発生する仮想マシンインタプリタ12が通常モードで動作すべきアドレスから始まるレンジである。
【0028】
第八ステップ28で、仮想マシンインタプリタ12はブランチ命令をプロセサコア10に与えて、ループに対して発生した一連のネイティブ命令をフェッチする。この点に関して、第八ステップ28は第三ステップ23に似ている。ただし、第八ステップ28ではプロセサコア10がメモリシステム14からのネイティブ命令を実行するのに対し、第三ステップ23ではネイティブ命令は仮想マシンインタプリタ12から供給される点が異なる。第八ステップ28において、プロセサコア10が発生した命令アドレス値を仮想マシンインタプリタ12がモニタしてプロセサコア10がループから抜けたことを検知するまで、プロセサコア10はメモリシステム14から命令をフェッッチし実行する。そして、仮想マシンインタプリタ12は最終ステップ29を実行して通常モード動作を再開する。
【0029】
図2のフローチャートは、ネイティブ命令が発生しメモリに記憶された後にループが実行される例を示している。これがこの発明の最も簡潔な応用例であるが、ループ以外の繰り返し実行されると予想される他の仮想マシン命令セットにもこの発明は応用できる。例としては、サブルーチン、例外的ハンドラ又はより大きなループの最も処理しやすい命令群等である。これらの場合、記憶されたネイティブマシン命令は発生した命令の最後にブランチバックを含まない。一連の仮想マシン命令の実行を仮想マシンプログラムが呼び出す度に、記憶された対応するネイティブ命令に制御が戻る。
【0030】
図2の実施形態では、繰り返し実行される仮想マシン命令セットに対して発生した第1のネイティブ命令からのみ、仮想マシンインタプリタ12が発生したネイティブマシン命令のメモリシステム14への書き込みを開始する。仮想マシンインタプリタ12がネイティブマシン命令の書き込みを開始するメモリアドレスは、実行される仮想マシン命令プログラムとは無関係な、所定のメモリアドレスでもよい。これにより、ループ外の仮想マシン命令に対して発生するネイティブマシン命令の書き込みにオーバヘッドが生ずることがなくなる。さらには、メモリシステム14にキャッシュメモリを用いるとキャッシュ交換量がこのように減少する。
【0031】
しかし、これは仮想マシンインタプリタ12が、発生したネイティブマシン命令をいつ書き込み始めるかを示す信号が必要であることを意味する。所定数の仮想マシン命令を所定回数実行することを示すループ命令を仮想マシン命令が含む場合は、発生したネイティブマシン命令を記憶開始するためのトリガーとして用いることができる。代わりに、解読結果がメモリに記憶されるべき命令群の開始を示すメタ命令を仮想マシン命令プログラムに含んでもよい。この場合、メタ命令により、第1ステップにおいて仮想マシンインタプリタ12が次の仮想マシン命令をロードし、第4ステップ24から実行する。なお、必ずしも必要ではないがメタ命令は仮想マシン命令群のサイズを示しても良く、命令群の位置に等しいブランチターゲットを用いて仮想マシンブランチバック命令から命令群の最後が検出される。代わりに、そのような命令群の先頭にある仮想マシン命令のアドレスリストと仮想マシンプログラムを組み合わせても良い。この場合、第1ステップ21で、仮想マシンインタプリタ12がこのリストの少なくとも一部をロードして現在の仮想マシン命令アドレスと比較する。
【0032】
仮想マシン命令の位置は、例えば、高水準言語から仮想マシン命令へのコンパイル最中に、コンパイルされた高水準言語ループ(例えばループ用)位置として検出してもよい。代わりに、仮想マシンプログラムをを事前処理してこれらの位置を検出し、ブランチバック命令を検出し、そして検出されたブランチバック命令のターゲットをループの開始点としてマークしてもよい。従って、高水準言語ソースコードが不要となる。同様に、サブルーチンの開始点(仮想マシン命令がサブルーチン命令にジャンプするためのターゲット)及び/又はキャッシングの例外としての命令をこのようにマークしてもよい。
【0033】
最も簡潔な実施形態としては、メモリから発生したネイティブマシン命令シーケンスの実行を、ブランチ命令を含まない仮想マシン命令セット又はこのセットの最後のブランチバック以外の他の制御転送命令用のネイティブマシン命令シーケンスのみに適用してもよい。これにより、毎回実行すべきネイティブマシン命令シーケンスが同じになる。もし、セットの最後には位置しないブランチ命令を仮想マシン命令セットが含む場合は多くの手法がとれる。第1の手法は通常モードでのこのセットの実行であり、即ち、毎回仮想マシン命令の解読を実行し、メモリからの解読された命令は実行しない。
【0034】
仮想マシン命令セット内のブランチのための第2の手法は、ネイティブマシン命令セットを、同じネイティブマシン命令と共にいつも実行される複数部分に分岐し、これら部分用に記憶されたネイティブマシン命令を記憶することである。この場合、仮想マシン命令セットの最後にはない制御命令の転送において終了する各部分のネイティブマシン命令の終了を仮想マシンインタプリタ12が検出する。これは、通常モードでの実行を示すレンジにジャンプする各部分の最後へのネイティブマシン命令の挿入と組み合わせたい場合は、プロセサコア10により発生した命令アドレスをモニタすることにより行ってもよい。ネイティブマシンブランチ命令のブランチターゲットは終了した部分を示すのに用いてもい。この部分の実行終了時に、制御転送を命令する仮想マシン命令を仮想マシン命令が処理し、そしてプロセサコアにメモリシステム14からの、仮想マシン命令セットの選択された部分のために発生したネイティブマシン命令を実行する。又は命令セット以外に仮想マシン命令が制御を転送する場合は、通常モードが再開する。
【0035】
第3の手法は、ネイティブマシン命令間のネイティブマシンブランチ命令を用いて、命令セット内で制御転送命令を実行するそれら制御を転送を発生することある。これによりネストループが実現できる。
【図面の簡単な説明】
【図1】
この発明の装置の一実施形態を示す図である。
【図2】
仮想マシンプログラムをエミュレートする方法を示すフローチャートを示す図である。
Claims (8)
- ネイティブマシン命令を実行するプロセサコアを備えた仮想マシン命令プログラムを実行するデータ処理システムであって、
前記プロセサコアと、
メモリと、
前記プログラム実行中にプログラムフローに応じて選択された仮想マシン命令を受け取る仮想マシンインタプリタであって、前記プロセサコアに接続されて、前記プロセサコアにより実行される仮想マシン命令を導入するネイティブマシン命令を発生する仮想マシンインタプリタであって、繰り返し実行されることが予想される一連の前記選択された仮想マシン命令の一群から先頭仮想マシン命令を検出し、前記一群中の前記先頭仮想マシン命令と前記メモリのメモリ位置との対応関係を記録し、前記先頭仮想マシン命令から開始する仮想マシン命令に対して発生した前記一群のためのネイティブマシン命令を前記メモリ位置から前記メモリに書き込み、前記メモリ位置から前記メモリに書き込まれたネイティブマシン命令を実行することにより前記一群のためのネイティブマシン命令を繰り返し実行するよう前記プロセサコアを制御する仮想マシンインタプリタとを備えたことを特徴とするデータ処理システム。 - 前記仮想マシンインタプリタは、前記一群の開始時にネイティブブランチバック命令を発生し、このネイティブブランチバック命令を前記メモリ中の前記一群の最後に置くこと特徴とする請求項1に記載のデータ処理システム。
- 前記仮想マシンインタプリタは、前記一群が記憶されるアドレスレンジとは重ならないあるアドレスレンジ内のターゲットアドレスを有する無条件なさらなるネイティブブランチ命令を前記ネイティブブランチ命令の後に置き、そして前記プロセサコアのプログラムカウンタをモニタし、そして前記仮想マシン命令の選択と、前記ループ群の開始後に前記アドレスレンジに前記プログラムカウンタの値が入ったときに前記選択された仮想マシン命令からのネイティブマシン命令の発生を再開すること特徴とする請求項2に記載のデータ処理システム。
- 前記仮想マシンインタプリタは、少なくとも前記先頭仮想マシン命令
を示し、プログラムフローに影響しないヒント情報を受け取り、前記対応関係を記録し、前記ヒント情報を受け取ったときに所定条件で、前記プログラムフローが前記先頭仮想マシン命令に達したときに前記一群用に前記ネイティブマシン命令を書き込むこと特徴とする請求項2に記載のデータ処理システム。 - ネイティブマシン命令を実行するプロセサコアを用いて仮想マシン命令プログラムを実行する方法であって、
プログラムフローの基に実行すべき仮想マシン命令を選択し、
前記選択された仮想マシン命令から、該選択された仮想マシン命令を実行すべくネイティブマシン命令を決定し、
繰り返し実行されることが予想される一連の前記選択された仮想マシン命令の一群から先頭仮想マシン命令を検出し、
前記先頭仮想マシン命令とメモリ位置との対応関係を記録し、
前記先頭仮想マシン命令から開始する仮想マシン命令から決定される前記一群のためのネイティブマシン命令を前記メモリ位置からメモリに書き込み、
前記メモリ位置から前記メモリに書き込まれた前記一群のためのネイティブマシン命令を実行することにより前記一群のためのネイティブマシン命令を繰り返し実行するようプロセサコアを制御することを特徴とする実行方法。 - 前記一群の開始時にネイティブブランチバック命令を発生し、このネイティブブランチバック命令を前記メモリ中の前記ループ群の最後に置くこと特徴とする請求項5に記載の実行方法。
- 前記一群が記憶されるアドレスレンジとは重ならないあるアドレスレンジ内のターゲットアドレスを有する無条件なさらなるネイティブブランチ命令を前記ネイティブブランチ命令の後に置き、そして前記プロセサコアのプログラムカウンタをモニタし、そして前記仮想マシン命令の選択と、前記ループ群の開始後に前記アドレスレンジに前記プログラムカウンタの値が入ったときに前記選択と決定を再開すること特徴とする請求項6に記載の実行方法。
- 前記先頭仮想マシン命令の検出は、仮想ブランチバック命令により終了するループを検出する前記プログラムを事前処理し、前記先頭仮想マシン命令として前記仮想ブランチバック命令のターゲットアドレスを示す前記プログラムにヒントを加えること特徴とする請求項6に記載の実行方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
EP00203024 | 2000-08-31 | ||
PCT/EP2001/009694 WO2002019100A1 (en) | 2000-08-31 | 2001-08-22 | System for executing virtual machine instructions |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004507832A true JP2004507832A (ja) | 2004-03-11 |
Family
ID=8171966
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002523152A Pending JP2004507832A (ja) | 2000-08-31 | 2001-08-22 | 仮想マシン命令を実行するシステム |
Country Status (4)
Country | Link |
---|---|
US (1) | US7234134B2 (ja) |
EP (1) | EP1316014A1 (ja) |
JP (1) | JP2004507832A (ja) |
WO (1) | WO2002019100A1 (ja) |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2005506630A (ja) * | 2001-10-25 | 2005-03-03 | コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ | 低オーバヘッドの例外チェック |
DE60223990T2 (de) * | 2001-10-31 | 2008-12-04 | Aplix Corp. | System zum Ausführen von Zwischenkode, Methode zum Ausführen von Zwischenkode, und Computerprogrammprodukt zum Ausführen von Zwischenkode |
EP1308838A3 (en) * | 2001-10-31 | 2007-12-19 | Aplix Corporation | Intermediate code preprocessing apparatus, intermediate code execution apparatus, intermediate code execution system, and computer program product for preprocessing or executing intermediate code |
US9207958B1 (en) | 2002-08-12 | 2015-12-08 | Arm Finance Overseas Limited | Virtual machine coprocessor for accelerating software execution |
US7328432B2 (en) * | 2003-06-02 | 2008-02-05 | Sun Microsystems, Inc. | Proximity-based addressing for supporting in-place execution in virtual machines |
US20050251652A1 (en) * | 2004-04-27 | 2005-11-10 | Eswaramoorthi Nallusamy | Methods and apparatus for processing an extensible firmware interface byte code instruction in a loop |
CN101963917B (zh) * | 2004-12-31 | 2016-03-02 | 钟巨航 | 具有多个子系统的数据处理系统及方法 |
JP4833568B2 (ja) * | 2005-03-15 | 2011-12-07 | 株式会社リコー | 情報処理装置、画像形成装置、起動プログラムおよび記憶媒体 |
WO2007053980A1 (en) * | 2005-11-12 | 2007-05-18 | Intel Corporation | Method and apparatus to support virtualization with code patches |
US8068602B1 (en) * | 2006-09-29 | 2011-11-29 | Verint Americas, Inc. | Systems and methods for recording using virtual machines |
EP2254070A1 (en) * | 2009-05-18 | 2010-11-24 | Nxp B.V. | Secure execution of native code |
KR20120083803A (ko) * | 2011-01-18 | 2012-07-26 | 삼성전자주식회사 | 가상머신을 위한 추가코드 생성장치 및 방법 |
US20150186168A1 (en) * | 2013-12-30 | 2015-07-02 | Unisys Corporation | Dedicating processing resources to just-in-time compilers and instruction processors in a dynamic translator |
US10114638B2 (en) * | 2014-12-15 | 2018-10-30 | Cisco Technology, Inc. | Command message generation and execution using a machine code-instruction |
US10216926B2 (en) * | 2016-01-29 | 2019-02-26 | Cisco Technology, Inc. | Isolation of untrusted code in operating system without isolation capability |
CN110633130B (zh) * | 2019-08-29 | 2023-10-31 | 上海仪电(集团)有限公司中央研究院 | 一种基于内存热插拔技术的虚拟内存管理方法和装置 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4638423A (en) * | 1985-03-06 | 1987-01-20 | Motorola, Inc. | Emulating computer |
GB9526129D0 (en) * | 1995-12-21 | 1996-02-21 | Philips Electronics Nv | Machine code format translation |
US5768593A (en) * | 1996-03-22 | 1998-06-16 | Connectix Corporation | Dynamic cross-compilation system and method |
US5889996A (en) * | 1996-12-16 | 1999-03-30 | Novell Inc. | Accelerator for interpretive environments |
US6513156B2 (en) * | 1997-06-30 | 2003-01-28 | Sun Microsystems, Inc. | Interpreting functions utilizing a hybrid of virtual and native machine instructions |
EP0902365B1 (en) * | 1997-09-09 | 2003-11-12 | Motorola Semiconducteurs S.A. | Method and system for executing instructions in a microprocessor |
EP1019794B1 (en) * | 1997-10-02 | 2008-08-20 | Koninklijke Philips Electronics N.V. | Data processing device for processing virtual machine instructions |
US6332215B1 (en) * | 1998-12-08 | 2001-12-18 | Nazomi Communications, Inc. | Java virtual machine hardware for RISC and CISC processors |
JP3470948B2 (ja) * | 1999-01-28 | 2003-11-25 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 動的コンパイル時期決定方法、バイトコード実行モード選択方法、及びコンピュータ |
-
2001
- 2001-08-22 JP JP2002523152A patent/JP2004507832A/ja active Pending
- 2001-08-22 WO PCT/EP2001/009694 patent/WO2002019100A1/en active Application Filing
- 2001-08-22 EP EP01978295A patent/EP1316014A1/en not_active Withdrawn
- 2001-08-29 US US09/942,001 patent/US7234134B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
WO2002019100A1 (en) | 2002-03-07 |
US20020053072A1 (en) | 2002-05-02 |
US7234134B2 (en) | 2007-06-19 |
EP1316014A1 (en) | 2003-06-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2004507832A (ja) | 仮想マシン命令を実行するシステム | |
US5960198A (en) | Software profiler with runtime control to enable and disable instrumented executable | |
JP3816961B2 (ja) | バーチャルマシン命令を処理するためのデータ処理装置 | |
Wallace et al. | Superpin: Parallelizing dynamic instrumentation for real-time performance | |
JP3574019B2 (ja) | 分岐履歴装置およびプログラムのプロファイル作成方法 | |
US8578351B2 (en) | Hybrid mechanism for more efficient emulation and method therefor | |
KR100578583B1 (ko) | 코드 생성의 모드 전환 방법 | |
US7568190B2 (en) | Late binding of optimization information for just in time compilation | |
US7210127B1 (en) | Methods and apparatus for executing instructions in parallel | |
EP0926592B1 (en) | Software emulation system | |
KR100890243B1 (ko) | 변환된 명령어의 재시작 | |
JPH11338738A (ja) | ソフトウェアのエミュレ―ションおよび変換方法 | |
JP5443172B2 (ja) | 処理環境での命令実行の制御 | |
JP2004062858A (ja) | データ処理装置内のアプリケーション・コードのコンパイル | |
US6256784B1 (en) | Interpreter with reduced memory access and improved jump-through-register handling | |
JPH05224911A (ja) | 動的命令修正制御装置 | |
US20060070049A1 (en) | Java bytecode translation method and Java interpreter performing the same | |
JP2000222220A (ja) | 動的コンパイル時期決定方法、バイトコード実行モード選択方法、及びコンピュータ | |
US5933643A (en) | Profiler driven data prefetching optimization where code generation not performed for loops | |
JP2002532775A (ja) | インタープリタプログラム実行方法 | |
US6701518B1 (en) | System and method for enabling efficient processing of a program that includes assertion instructions | |
KR20120064446A (ko) | 컴퓨팅 시스템 상의 바이트코드의 분기 처리 장치 및 방법 | |
GB2376097A (en) | Configuration control within data processing systems | |
Hoogerbrugge et al. | Pipelined Java virtual machine interpreters | |
WO2001013223A1 (fr) | Procede et appareil permettant de faire fonctionner un ordinateur virtuel |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
RD02 | Notification of acceptance of power of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7422 Effective date: 20070501 |