(57)【特許請求の範囲】
【請求項１】
対象プログラムの実行環境をソフトウェアで提供するエミュレーションプログラムであって、
前記対象プログラムが出力した命令を自プログラムの実行環境で処理可能な命令に変換する変換手順と、
前記対象プログラムが使用するメモリ領域に対し、前記自プログラムの実行環境に基づく書込み保護を施した第１メモリマップと、前記対象プログラムの実行環境および／または前記対象プログラムの命令の内容に基づく書込み保護を施した第２メモリマップと、を作成するメモリマップ作成手順と、
前記変換手順が出力した書き込み命令が前記第１メモリマップに対する書込み保護違反を生じた場合に、前記第２メモリマップに対する書き込み命令に書き換える命令書き換え手順と、
をコンピュータに実行させることを特徴とするエミュレーションプログラム。
【請求項２】
前記第２メモリマップは、前記第１メモリマップと同一内容で、アドレスが所定量ずれたメモリマップであることを特徴とする請求項１に記載のエミュレーションプログラム。
【請求項３】
前記命令書き換え手順は、前記第２メモリマップにおける書き込み先が書込み保護されている場合に、書き込み違反時に例外処理に移行する書き込み命令に書き換えることを特徴とする請求項１または２に記載のエミュレーションプログラム。
【請求項４】
前記対象プログラムが出力した命令を解釈する命令解釈手順をさらにコンピュータに実行させ、前記変換手順は、前記命令解釈手順が解釈した書き込み命令が書込み保護違反を生じた場合に、当該命令を含む命令列を変換することを特徴とする請求項１〜３のいずれか一つに記載のエミュレーションプログラム。
【請求項５】
前記命令解釈手順は、前記対象プログラムが出力した命令を解釈する場合に、前記変換手順による変換対象範囲の起点を示す起点情報を作成することを特徴とする請求項４に記載のエミュレーションプログラム。
【請求項６】
対象プログラムの実行環境を仮想的に提供するエミュレーション装置であって、
前記対象プログラムが出力した命令を自装置が処理可能な命令に変換する変換手段と、
前記対象プログラムが使用するメモリ領域に対し、前記自装置の動作環境に基づく書込み保護を施した第１メモリマップと、
前記対象プログラムの実行環境および／または前記対象プログラムの命令の内容に基づく書込み保護を施した第２メモリマップと、
前記変換手段が出力した書き込み命令が前記第１メモリマップに対する書込み保護違反を生じた場合に、前記第２メモリマップに対する書き込み命令に書き換える命令書き換え手段と、
を備えたことを特徴とするエミュレーション装置。
【請求項７】
対象プログラムの実行環境を仮想的に提供するエミュレーション方法であって、
前記対象プログラムが出力した命令を実際の実行環境で処理可能な命令に変換する変換ステップと、
前記対象プログラムが使用するメモリ領域に対し、前記実際の実行環境に基づく書込み保護を施した第１メモリマップと、前記対象プログラムの実行環境および／または前記対象プログラムの命令の内容に基づく書込み保護を施した第２メモリマップと、を作成するメモリマップ作成ステップと、
前記変換ステップが出力した書き込み命令が前記第１メモリマップに対する書込み保護違反を生じた場合に、前記第２メモリマップに対する書き込み命令に書き換える命令書き換えステップと、
を含んだことを特徴とするエミュレーション方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、対象プログラムの実行環境を仮想的に提供するエミュレーションプログラム、エミュレーション装置およびエミュレーション方法に関する。
【背景技術】
【０００２】
エミュレーションプログラムやエミュレーション装置は、対象プログラムが出力する命令列であるターゲット命令を、仮想計算機で実行するものである（例えば特許文献１参照。）。以降の説明では、エミュレーション装置、およびエミュレーションプログラムの実行によってエミュレーション装置として機能するコンピュータをホストマシンと称する。同様に、エミュレーションによって提供される仮想的な計算機と、計算機上で動作する対象プログラム（ターゲットプログラム）のセットをターゲットマシンと称する。
【０００３】
エミュレーションプログラムやエミュレーション装置では、ターゲット命令列を解釈実行する命令インタプリタと、ホストマシンの命令列であるホスト命令に実行時に変換する機構である命令変換機構から構成されることが一般的になっている（例えば特許文献２，３参照。）。
【０００４】
命令変換機構は、ターゲット命令列をホスト命令列に変換する点で従来のコンパイラと同様な機能を持つが、変換処理が動的、すなわちエミュレーションのターゲットプログラムの実行時に行なわれ、変換処理の実行時に収集可能なターゲットプログラムの情報を利用することが可能である点が異なる。以下、命令変換機構がターゲット命令列から動的に生成したホスト命令列を変換コード（コードレット）と称する。
【０００５】
コードレットは、エミュレーション対象のメモリとは別のメモリ領域に置かれ、実行の正当性が保証される限りにおいて、命令変換機構なり仮想プロセッサの操作によって自由に変更可能である。これは、コードレットの位置づけが命令キャッシュ内の不可視なマイクロコードと同様に位置づけられるためである。
【０００６】
一方、ターゲットマシンの実メモリ空間及び仮想メモリ空間上のデータあるいは命令は、コードレットと異なり、エミュレーションプログラムが勝手に書き換えることは一般には許されない。これは書き換えられたメモリを参照しているターゲットマシン上のプロセスやユーティリティへの影響を判断できないためである。
【０００７】
ターゲットマシン上の仮想メモリをホストマシンで効率よくアクセス可能とするために、ホストマシンのアドレス変換機構（ＴＬＢ：Translation Lookaside Buffer）を使い、ターゲットマシンの仮想アドレス（または実アドレス）をホストマシンの仮想アドレスに直接変換する技術が現在多くのエミュレーションソフトウェアに備わっている。
【０００８】
ターゲットマシンの仮想メモリのアクセスは、ターゲットマシン上の動的アドレス変換をソフトウェアで極力行うことなく（ＴＬＢミス例外やページ例外の発生時を例外的に除く）、ホストマシンのＴＬＢで実現される。
【０００９】
ページ書き込み保護法は、ターゲットメモリのページ属性を、対応するホストメモリ上で書き込み不可に設定しておくことで、ターゲットメモリへの書き込みが生じると、当該アドレスに対応するホストアドレスに対するホストマシン上のＴＬＢの属性をチェックし、検出し、例外ハンドラで適切な保護を実施するものである。
【００１０】
【特許文献１】特表２００２−５４３４９０号公報
【特許文献２】特表２００２−５３６７１２号公報
【特許文献３】特表２００６−５２４３８２号公報
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかしながら、ページ書き込み保護方法を取ると、保護される領域のみならず、本来保護される領域以外への書き込みにも著しいオーバーヘッドが生じる場合がある。
【００１２】
たとえば、一部のコンピュータで採用されているローアドレスプロテクション機構では、０番地から５１１番地の範囲への書き込みに書き込み保護が働く。ページサイズは２Ｋバイト以上（近年は４Ｋバイト以上）のものが利用されており、５１２番地以降の同一ページ内への書き込みは、他のページと同程度存在する可能性がある。
【００１３】
ローアドレスプロテクションに対応したターゲットマシンを、ローアドレスプロテクションに対応しておらず、ページ書込み保護を用いるホストマシンでエミュレートすると、ローアドレスプロテクションを再現するために、５１２番地以降の同一ページについても書込み保護を行なう必要が発生する。そのため、ターゲットマシン本来の実行環境に比して書込み保護違反が多くなるという問題が生ずる。
【００１４】
また、命令の一貫性確保の問題もある。コードレットとターゲット命令の一貫性の保証方法はいくつか知られている。その保証方法の一つが、ページ書き込み保護方法に基づくライトプロテクション法である。
【００１５】
ページ書き込み保護方法に基づくライトプロテクション法は、ターゲット命令列を含むメモリページを書き込み保護属性に設定し、保護属性に設定したページの書き込みが行われるとターゲット命令に対するコードレットが無効になるというものである。保護はページ単位で行われるため、同一ページ内のターゲット命令列に含まれない番地（データアドレス）への書き込みにおいても書き込み保護機構が働く。
【００１６】
書き込み保護違反がホストマシンで検出されると、ホストＯＳ(Operating System)カーネルやエミュレーションプログラムの例外ハンドラが起動される。例外ハンドラは、本来保護される領域への書き込みかどうかをチェックし、書き込み保護されない領域の場合は、ホストプロセッサのＴＬＢを操作して書き込み保護を無効にし、メモリに書き込む。その後、再びホストプロセッサのＴＬＢを操作して書き込み保護を有効にする。
【００１７】
例外ハンドラの実行や特権命令であるホストＴＬＢの操作は、もともとの書き込み命令に比較して、著しいオーバーヘッドがあるため極めて低速である。ただし、オーバーヘッドが生じるのは保護違反の生じたストア命令についてのみである。
【００１８】
また、ホストマシンのページ書き込み保護機能を使わずに、命令インタプリタで書き込み保護を行なうことも考えられる。しかし、命令インタプリタでの書き込み保護は、ターゲット命令列に含まれる全てのストア命令について、書き込みアドレスが保護領域内であるか否かのチェックが必要になる。これは保護違反の有無に関わらず、ほぼ全てのストア命令にオーバーヘッドが生じ、ストア命令の実行回数に比例して全体性能が低下することを意味する。
【００１９】
すなわち、従来の技術では、対象プログラムに対して仮想的な実行環境を提供する場合に、メモリの保護と高速アクセスとを両立することができないという問題点があった。
【００２０】
本発明は、上述した従来技術にかかる問題点を解消し、課題を解決するためになされたものであり、メモリの保護と高速アクセスとを両立するエミュレーションプログラム、エミュレーション装置およびエミュレーション方法を提供することを目的とする。
【課題を解決するための手段】
【００２１】
上述した課題を解決し、目的を達成するために、開示のプログラム、装置、方法は、対象プログラムの実行環境を仮想的に提供する際に、対象プログラムが使用するメモリ領域に対し、エミュレータの実行環境に基づく書込み保護を施した第１メモリマップと、対象プログラムの実行環境および／または対象プログラムの命令の内容に基づく書込み保護を施した第２メモリマップと、を作成する。そして、対象プログラムの命令を変換して実行した結果、第１メモリマップに対する書込み保護違反を生じた場合に、第２メモリマップに対する書き込み命令に書き換える。
【発明の効果】
【００２２】
開示のプログラム、装置、方法によれば、エミュレータの実行環境が提供するメモリ保護機構のメモリ保護単位よりも小さな単位でメモリ保護を実行することができるので、メモリアクセスを効率化し、メモリの保護と高速アクセスとを両立するエミュレーションプログラム、エミュレーション装置およびエミュレーション方法を得ることができるという効果を奏する。
【発明を実施するための最良の形態】
【００２３】
以下に、本発明にかかるエミュレーションプログラム、エミュレーション装置およびエミュレーション方法の実施例を図面に基づいて詳細に説明する。
【実施例】
【００２４】
図１は、本実施例に係るエミュレーションプログラムの概要構成を説明する説明図である。図１に示したエミュレーションプログラム２０は、ホストマシン３０のハードウェアを用いて動作し、ターゲットプログラム１０に対して仮想的な実行環境を提供する。そのため、ターゲットプログラム１０からは、エミュレーションプログラム２０は本来の実行環境を備えた計算機として認識される。
【００２５】
ターゲットプログラム１０は、エミュレーションプログラム２０が提供する仮想計算機上で演算処理部１１による演算処理を実行し、演算結果の読み書きにメモリ１２を用いるように動作する。
【００２６】
実際には、演算処理部１１が出力するターゲット命令は、エミュレーションプログラム２０によって処理される。また、メモリ１２はエミュレーションプログラム２０が管理するメモリの写像である。
【００２７】
エミュレーションプログラム２０は、その内部に命令解釈部２１、命令変換部２２、演算処理部２３、メモリマップ作成部２４、実メモリ２５、仮想メモリマップ２６，２７、例外ハンドラ２８を有する。
【００２８】
命令解釈部２１は、ターゲットプログラム１０が出力したターゲット命令を解釈する命令インタプリタである。また、命令変換部２２は、ターゲットプログラム１０が出力したターゲット命令をホスト命令に実行時に変換する機構である。
【００２９】
命令解釈部２１が解釈した命令や命令変換部２２によって作成されたホスト命令は、演算処理部２３によって実行される。演算処理部２３は、演算結果をメモリマップ作成部２４、仮想メモリマップ２６，仮想メモリマップ２７を介して実メモリ２５に書き込み、また、実メモリ２５の内容をメモリマップ作成部２４、仮想メモリマップ２６，仮想メモリマップ２７を介して取得して演算に使用する。
【００３０】
メモリマップ作成部２４は、演算処理部２３による実メモリ２５へのアクセスに介在し、実メモリ２５に対するメモリマップとして仮想メモリマップ２６と仮想メモリマップ２７を作成する。
【００３１】
仮想メモリマップ２６は、ターゲットプログラム１０におけるメモリ１２に対応し、エミュレーションプログラム２０の実行環境、すなわちホストマシン３０の機能に基づく書込み保護を施されたメモリマップである。具体的には、仮想メモリマップ２６は、ページ単位で書込み保護される。
【００３２】
仮想メモリマップ２７は、ターゲットプログラム１０の本来の実行環境や、ターゲットプログラムの命令の内容に基づく書込み保護を施したメモリマップである。具体的には、仮想メモリマップ２７は、仮想メモリマップ２６と同一内容で、アドレスが所定量ずれたメモリマップである。仮想メモリマップ２７に対する書込み保護は、ソフトウェア的に実施されるので、ホストマシン３０の実行環境による制約を受けず、ターゲットプログラム１０の動作、具体的にはローアドレスプロテクションや命令間の一貫性確保の観点から保護アドレスが決定される。
【００３３】
例外ハンドラ２８は、演算処理部２３による演算の結果、メモリに対する書込み保護違反が発生した場合に呼び出される処理部であり、判別部２８ａ、命令書き換え部２８ｂ、および例外処理部２８ｃを有する。
【００３４】
エミュレーションプログラム２０では、メモリに対する書き込みを行なうストア命令を複数有している。判別部２８ａは、書き込み違反を生じたストア命令の種類を判別し、判別結果に基づいて命令書き換え部２８ｂと例外処理部２８ｃのいずれかに送る。
【００３５】
例外処理部２８ｃは、通常の例外処理を行なう処理部であり、例外処理を行なった後は演算処理部２３に処理を戻す。一方、命令書き換え部２８ｂでは、ストア命令を書き換えた上で、演算処理部２３に処理を戻す。この命令書き換え部２８ｂによる処理の詳細については、後述する。
【００３６】
図２は、エミュレーションの動作について説明する説明図である。ターゲットマシンにおいて演算を実行するターゲットプロセッサがメモリアクセスやストア命令を実行し、実行結果がターゲットメモリに反映される。
【００３７】
実際には、ターゲットプロセッサの動作とメモリの管理は、ホストマシン３０とエミュレーションプログラム２０によって実行される。すなわち、ターゲットプロセッサの命令は、命令解釈部２１によって解釈されてインタプリタコードになるか、もしくは命令変換部２２によってコードレットに変換される。
【００３８】
インタプリタコードとコードレットは、ホストマシンのプロセッサによって実行され、ホストマシンのメモリに格納される。メモリの格納時には、ターゲットマシン上の仮想メモリをホストマシンで効率よくアクセス可能とするために、ホストメモリにターゲットメモリのメモリ領域を写像して格納する。
【００３９】
具体的には、ターゲットマシンの仮想アドレス（または実アドレス）をホストマシンの仮想アドレスにホストマシンのＴＬＢを使って直接変換する。ターゲットマシンの仮想メモリへのアクセスは、ターゲットマシン上の動的アドレス変換をソフトウェアで極力行うことなく、ホストマシンのＴＬＢで実現することができる。
【００４０】
ターゲットメモリにおけるメモリ保護は、ホストマシンの実行環境を考慮しない。例えば、ターゲットマシンがローアドレスプロテクションを実行する場合、ターゲットマシンは図３に示すように、メモリの０番地から５１１番地の範囲を読み込み専用として書き込み保護する。ターゲットマシンの本来の実行環境では、メモリの０番地から５１１番地の範囲を保護したまま、同一ページの５１２番地以降にアクセス可能である。
【００４１】
しかし、ホストマシンがローアドレスプロテクションに対応していなければ、ホストマシンがローアドレスプロテクションをエミュレートし、メモリの０番地から５１１番地の範囲を保護するためにはページ全体を書込み保護する必要がある。そのため、ホストマシンが同一ページの５１２番地以降にアクセスしようとすると書込み保護違反が発生する。
【００４２】
また、図４に示したように、ページ書き込み保護法では、ターゲット命令列を含むメモリページを書き込み保護属性に設定し、ターゲット命令列を含むメモリページに書き込みが行われた場合に、ページ内のターゲット命令に対するコードレットが無効にすることで、コードレットとターゲット命令の一貫性を保証している。
【００４３】
ページ書き込み保護法は、ページ単位で書込み保護を行なうので、同一ページ内のターゲット命令列に含まれない番地（データアドレス）への書き込みにおいても書き込み保護機構が働いて書込み保護違反が発生する。
【００４４】
そこで、エミュレーションプログラム２０では、仮想アドレス空間の複製と、ストア命令の書き換えによってホストマシンの実行環境に依存しない書込み保護を実現する。
【００４５】
図５は、エミュレーションプログラム２０における書込み保護の概要について説明する説明図である。まず、事前準備について説明する。書き込み保護が必要なページＵに対して、書き込み保護されていないページＶを用意する。書込み保護が必要なページＵは、仮想メモリマップ２６によって提供され、書込み保護されていないページＶは仮想メモリマップ２７によって提供される。
【００４６】
また、ページＵからページＶを直ちに決定できるように、例えば、ページＵのアドレスとページＶのアドレスの差分を定数Ｃとしてもよい。この時、ページＶのアドレスは、Ｖ＝（Ｕ＋Ｃ）によって求められる。
【００４７】
あるいは、ページＵのアドレスをベースレジスタＸからの相対としてもよい。この時、ページＵのアドレスは、Ｖ＝（Ｕ＋Ｃ＋Ｘ）によって求められる。また、ハッシュテーブルを用い、Ｖ＝ｈａｓｈ（Ｕ）によって求めることとしてもよい。
【００４８】
ページＵとページＶは仮想ページであり、同一の実ページをメモリマップするものである。すなわち、ページＶは、ページＵとアクセス制限属性のみ異なり、内容はまったく同じものになり、ページＵの代替ページとして機能する。
【００４９】
次に、書込み保護違反が発生した場合の命令書き換えについて説明する。まず、コードレットＰの書き込み命令（ホスト命令）であるＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）を実行する。ここで、ＡＤＤＲはページＵの中のアドレス、ＶＡＬは書き込み値を示す。
【００５０】
ＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）が書き込み違反を発生すると、例外ハンドラ２８内の命令書き換え部２８ｂは、コードレットＰの書き込み違反を発生したストア操作をコード置換（プログラム書き換え）し、ＣＨＥＣＫ＿ＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）操作に置き換える。
【００５１】
ＣＨＥＣＫ＿ＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）を実行すると、アドレスＡＤＤＲ、すなわちページＵ内のアドレスから、対応する代替ページＶのアドレスを決定する。そして、求めたアドレスを指定するストア命令（ＷＲＩＴＥコマンド）を作成する。ページＶのアドレスは、既に述べたようにＶ＝（Ｕ＋Ｃ），Ｖ＝（Ｕ＋Ｃ＋Ｘ）などによって求められるので、図５では求めたページＶのアドレスをＯＦＦＳＥＴ＋ＡＤＤＲとしている。
【００５２】
このＷＲＩＴＥ（（ＯＦＦＳＥＴ＋ＡＤＤＲ），ＶＡＬ）は、ページ保護されていない仮想アドレス空間を指しているので、書き込み可能である。なお、実際の書込み保護の必要性に基づいてソフトウェアによる書込み保護を行なった範囲には書き込みを行なわないようにする。
【００５３】
図６は、ＣＨＥＣＫ＿ＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）の具体的な定義例である。ＷＲＩＴＥの引数ＡＤＤＲに対して、書き込み保護されない代替ページＵが用意されていて、かつ、条件ＮＯＴ  ＰＲＯＴＥＣＴＥＤ＿ＲＡＮＧＥ（ＡＤＤＲ）が満たされる場合には、ＷＲＩＴＥ（（ＯＦＦＳＥＴ＋ＡＤＤＲ），ＶＡＬ）に置換する。
【００５４】
一方、書き込み保護されない代替ページＵが用意されているが、条件ＮＯＴ  ＰＲＯＴＥＣＴＥＤ＿ＲＡＮＧＥ（ＡＤＤＲ）が満たされない場合には、ＷＲＩＴＥＸ（ＡＤＤＲ，ＶＡＬ）に置換する。ＷＲＩＴＥＸコマンドは、ストア命令としては同等な機能を持つが、書き換え対象とならない点がＷＲＩＴＥコマンドと異なる。すなわち、ＷＲＩＴＥＸの実行で書き込み保護違反が発生した場合、ＷＲＩＴＥのような命令書換えは行わない。これによって、例外発生時の挙動はオリジナル（従来の例外処理）と同じものになる。ＷＲＩＴＥとＷＲＩＴＥＸの識別については後述する。
【００５５】
９行目は、書き込み保護対象と判明しているＵ以外のページをアクセスするケースである。どこのページをアクセスするかわからないため、１２行目にあるように、そのまま、ＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）が置かれている。そのまま出力されたＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）は、ＴＬＢ入れ替えなど、通常の（従来と同様の）保護領域ごとのポリシーに従うものであり、再帰的な書き換えの対象となる。再帰的書き換えの対象としない場合にはＷＲＩＴＥＸ（ＡＤＤＲ，ＶＡＬ）に置換すればよい。
【００５６】
以上の置換操作は論理的なものであり、書き換え命令長を配慮して、ＣＨＥＣＫ＿ＷＲＩＴＥが関数呼出しになるか、その場に直にインライン展開されるか、トランポリンコードを挟んで別の場所に展開されるかといった実装がありうる。また、実装上、命令キャッシュのコヒーレンシ（一貫性）を考慮した置換操作を行なう。
【００５７】
なお、書き込み保護違反したＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）が見つかったとき、例外ハンドラ２８の中で直ちにＣＨＥＣＫ＿ＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）に書き換えてもよいし、その最初の回は見逃し、次に実行されるまでの間に書き換えてもよい。直ちに書き換える場合は、行２：のところから実行を再開することになる。
【００５８】
書き込み保護されたページＵの存在は、そこにアクセスしてアクセス保護違反が発生した結果把握される。ＣＨＥＣＫ＿ＷＲＩＴＥの埋め込みは、こうしたアクセス保護違反後に行われるため、Ｕは定数として扱っている（行１：）。一方、ホスト命令のＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）においては、ＡＤＤＲは実行時に決まる変数であり、実行するたびに変わる可能性がある。また、ＰＡＧＥ（）は関数ではなくビット演算等のマクロで実現することが好適である。
【００５９】
つぎに、図７，８を参照して再帰的書換えの発生について説明する。ローアドレスプロテクション機能の実現では、静的に[0、511]番地範囲が決まっており、この範囲外であるＷＲＩＴＥについては、再帰的に命令書き換えの必要性がない。しかしながら、１つのストア命令が、異なるコンテキストで複数のページに対して書換え保護違反を生じる可能性があり、この場合には再帰的な命令書き換えが発生する。図７，８は、元のＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）のある場所に再帰的書き換えをインライン展開していく場合の具体例を説明する説明図である。
【００６０】
元のＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）が書き込み保護されたページＵ１、Ｕ２、Ｕ３にアクセスする場合、まず、Ｕ１の次にＵ２へアクセスすると、図６に示したコードの１２行目に記述したＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）がＵ２で書き込み保護違反を引き起こし、図７の８行目から１６行目のように展開される。
【００６１】
次に、図７の１５行目に示したＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）が、Ｕ３をアクセスする場合に書き込み保護違反を引き起こし、図８の１５行目から２３行目のように展開される。
【００６２】
こように、ＷＲＩＴＥ（Ｕ，ＶＡＬ）が再帰的に置換対象になると、コードサイズが線形に増加する場合がある。これを回避するため、単純なアドレス範囲比較演算ではなく、（ＰＡＧＥ（ＡＤＤＲ）＝＝Ｕ）とＰＲＯＴＥＣＴＥＤ＿ＲＡＮＧＥ（ＡＤＤＲ）の条件を判定する関数呼び出しにし、関数のボディ部を拡張することが好ましい。
【００６３】
図８に示した例では、１行目と２行目、８行目と９行目、１５行目と１６行目で、「ＰＡＧＥ（ＡＤＤＲ，Ｕｘ）…ＰＲＯＴＥＣＴＥＤ＿ＲＡＮＧＥ（ＡＤＤＲ）」という表現があるが、ＰＲＯＴＥＣＴＥＤ＿ＲＡＮＧＥの実際の処理は、２行目、９行目、１６行目で全て違う。なぜなら、ＰＲＯＴＥＣＴＥＤ＿ＲＡＮＧＥの処理は、ページＵｘ毎に保護するべきメモリ範囲が異なるためである。
【００６４】
また、「ＰＡＧＥ（ＡＤＤＲ，Ｕｘ）…ＰＲＯＴＥＣＴＥＤ＿ＲＡＮＧＥ（ＡＤＤＲ）」の判定を変更すれば、コードが増加しないように保つこともできる。この場合のＣＨＥＣＫ＿ＷＲＩＴＥの定義を図９に示す。
【００６５】
図９に示した例では、１行目で関数などを利用して、ＡＤＤＲが保護ページであるか否かをチェックし、保護ページであればＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）で処理を抜けるようにしている。これにより、実行速度が下がるが、一般性が高くコードの増加を回避したＣＨＥＣＫ＿ＷＲＩＴＥを得ることができる。
【００６６】
つぎに、ＷＲＩＴＥとＷＲＩＴＥＸの区別について説明する。ＷＲＩＴＥとＷＲＩＴＥＸを区別する方法は、ホストマシン命令セットと実装によって任意の方法を取ることができる。
【００６７】
例えば、ホストマシンに異なる種類のストア命令が用意されていれば、ＷＲＩＴＥとＷＲＩＴＥＸにそれぞれ異なるストア命令を割り当てることで区別が可能である。
【００６８】
また、各コードレットにＷＲＩＴＥとＷＲＩＴＥＸの出現位置を記した表を用意し、ＣＨＥＣＫ＿ＷＲＩＴＥの先頭で例外を起こしたストア命令がどちらか判断してもよい。
【００６９】
さらに、ストア命令の直下に異なる種類のＮＯＰ（No Operation）命令（例えばＷＲＩＴＥ用のＮＯＰａ命令、ＷＲＩＴＥＸ用のＮＯＰｂ命令)を配置し、そのＮＯＰ命令の種類で判断してもよい。
【００７０】
図１に示した判別部２８ａは、上述のいずれか、もしくは他の任意の方法によってＷＲＩＴＥとＷＲＩＴＥＸを判別し、ＷＲＩＴＥは命令書き換え部２８ｂに、ＷＲＩＴＥＸは例外処理部２８ｃへ送る。
【００７１】
つぎに、図１０を参照し、エミュレーションプログラム２０におけるコードレットの処理について説明する。エミュレーションプログラム２０内部の命令変換部２２は、まず、ターゲットプログラム１０が出力したターゲット命令をコードレットに変換する（ステップＳ１０１）。
【００７２】
演算処理部２３は、コードレットを実行し（ステップＳ１０２）、実行によって書込み保護違反が発生しなければ（ステップＳ１０３，Ｎｏ）、通常の処理を行なって（ステップＳ１０４）、処理を終了する。
【００７３】
一方、書込み保護違反が発生した場合（ステップＳ１０３，Ｙｅｓ）、例外ハンドラ２８が起動され、例外ハンドラ２８内部の判別部２８ａは、書込み保護違反を引き起こした命令がＷＲＩＴＥＸであるかＷＲＩＴＥであるかを判定する（ステップＳ１０５）。
【００７４】
書込み保護違反を引き起こした命令がＷＲＩＴＥＸである場合（ステップＳ１０５，Ｙｅｓ）、通常の処理（ステップＳ１０４）、すなわち、例外処理部２８ｃによる例外処理を行なって、処理を終了する。
【００７５】
一方、書込み保護違反を引き起こした命令がＷＲＩＴＥである場合（ステップＳ１０５，Ｎｏ）、命令書き換え部２８ｂがＷＲＩＴＥをＣＨＥＣＫ＿ＷＲＩＴＥに書き換える（ステップＳ１０６）。
【００７６】
そして、演算処理部２３は、ＣＨＥＣＫ＿ＷＲＩＴＥ処理を実行した（ステップＳ１０７）後、命令実行（ステップＳ１０２）に戻る。
【００７７】
続いて図１１を参照し、ＣＨＥＣＫ＿ＷＲＩＴＥ処理の詳細について説明する。図１１に示したように、ＣＨＥＣＫ＿ＷＲＩＴＥ処理は、まずアクセス先（ＡＤＤＲ）のページに代替ページが存在するか否かを判定する（ステップＳ２０１）。その結果、代替ページが存在しない場合には（ステップＳ２０１，Ｎｏ）、ＣＨＥＣＫ＿ＷＲＩＴＥ処理は、ＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）を出力して（ステップＳ２０４）、処理を終了する。
【００７８】
一方、代替ページが存在する場合には（ステップＳ２０１，Ｙｅｓ）、ＣＨＥＣＫ＿ＷＲＩＴＥ処理は、書込み保護領域への書き込みではないかを判定する（ステップＳ２０２）。その結果、書込み保護領域への書き込みである場合（ステップＳ２０２，Ｎｏ）、ＣＨＥＣＫ＿ＷＲＩＴＥ処理は、ＷＲＩＴＥＸ（ＡＤＤＲ，ＶＡＬ）を出力して（ステップＳ２０５）、処理を終了する。
【００７９】
書込み保護領域への書き込みでない場合（ステップＳ２０２，Ｙｅｓ）、ＣＨＥＣＫ＿ＷＲＩＴＥ処理は、ＷＲＩＴＥ（ＯＦＦＳＥＴ＋ＡＤＤＲ，ＶＡＬ）を出力して（ステップＳ２０３）、処理を終了する。
【００８０】
ここまでの説明では、命令変換部２２がコードレットに変換したストア命令を対象に説明を行なった。つぎに命令解釈部２１（インタプリタ）で解釈されたストア命令に対する処理について説明する。
【００８１】
命令解釈部２１によって解釈されたストア命令は、書き込み保護領域に書き込むたびに例外を生じるため、性能劣化が問題になる可能性がある。ただし、一般的にエミュレーションソフトウェアでは、実行回数がある閾値を超えたターゲット命令列は、コードレットに自動的にコンパイルされるため、閾値以下の実行回数を持つターゲット命令列中のストア命令の存在が問題となる。
【００８２】
一般に、コードレットとなるターゲット命令列は、ベーシックブロックを単位とするものである。あるストア命令がメモリ保護違反を起こすものであったとき、最低限、そのストア命令を含むベーシックブロックを１つ決定しなければならない。ベーシックブロックは制御の入り口であり、例外を引き起こした当該ストア命令からさかのぼって制御の入り口を決定することは一般には困難である。
【００８３】
そこで、エミュレーションプログラム２０では、現在のベーシックブロックの入り口となる命令アドレスを起点情報として保持するレジスタ等を命令解釈部２１に持たせる。そして、解釈して実行したストア命令がメモリ保護違反を起こした場合に、命令解釈部２１の起点情報を参照し、違反を起こしたストア命令を含むベーシックブロックを強制的にコードレットにコンパイルする。
【００８４】
具体的には、命令解釈部２１は、分岐命令等、命令アドレスレジスタを明示的に変更する命令において、分岐先命令アドレスを起点情報に設定する。そして、命令解釈部２１で解釈したストア命令がローアドレスプロテクション等に関連したページの書き込み保護違反を起こした場合に、本来書き込み可能であるべき場所ならば、起点情報から当該ストア命令を含むベーシックブロックを命令変換部２２でコンパイルし、生成されたコードレットを登録する。なお、コードレットの登録、実行時の検索、実行、破棄等の手続きは、通常のコードレットに対するものと同様である。
【００８５】
図１２は、エミュレーションプログラム２０において解釈されたストア命令の処理について説明するフローチャートである。エミュレーションプログラム２０内部の命令解釈部２１は、まず、ターゲットプログラム１０が出力したターゲット命令について、ベーシックブロック開始位置を起点情報として保持する（ステップＳ３０１）。
【００８６】
つぎに、命令解釈部２１は、ターゲット命令を解釈し（ステップＳ３０２）、解釈した命令を実行する（ステップＳ３０３）。命令実行によって書込み保護違反が発生しなければ（ステップＳ３０４，Ｎｏ）、通常の処理を行なって（ステップＳ３０５）、処理を終了する。
【００８７】
一方、書込み保護違反が発生した場合（ステップＳ３０４，Ｙｅｓ）、命令変換部２２が、ベーシックブロック開始位置からの命令列をコードレットに変換して（ステップＳ３０６）、処理を終了する。
【００８８】
以上説明してきたように、本実施例に係るエミュレーションプログラム２０は、ホストマシン３０のメモリ書換え保護の下で、コードレット上の動的命令書き換えを実施する。そのため、ホストハードウェアの持つページ単位のメモリ保護機能を用いて、１ページ長より小さいメモリ領域の保護を実現しつつ、ページ内の保護不要なメモリ領域への書き込みは実用的な性能で実施できる。
【００８９】
すなわち、必要なメモリ保護を確保しながらメモリ保護違反の発生数を抑制する効率的なメモリアクセスを実現できるので、メモリの保護と高速アクセスとを両立することができる。
【００９０】
また、保護ページ内の保護領域が動的に変更される場合でも、コードレットに対する動的命令書き換えによって対応することが可能である。
【００９１】
さらに、ターゲットマシン上のメモリに対する変更（命令書き換え）を行わないため、ターゲットマシン上のアプリケーション、ターゲットＯＳからは観測されず、影響を与えることがない。
【００９２】
また、コードレットの命令書き換えは、当該コードレットの実行でメモリ書き換え保護違反が生じたときのみ行われる。そのため、実行されないコードレット上の潜在的にメモリ書き換え保護違反を生じる箇所はコードレット書き換えの対象とならない。
【００９３】
さらに、稀ではないが命令変換部でコンパイルされるほど頻繁に実行されるわけではない、または、コンパイルされるまでのレイテンシが問題になるような処理における、メモリ保護例外を生じるインタプリタ実行されるストア命令について、それを含むターゲット命令列を強制的にコードレットに変換し、メモリ保護と効率的メモリ書換えを両立することができる。
【００９４】
以上の実施例を含む実施形態に関し、更に以下の付記を開示する。
【００９５】
（付記１）対象プログラムの実行環境をソフトウェアで提供するエミュレーションプログラムであって、
前記対象プログラムが出力した命令を自プログラムの実行環境で処理可能な命令に変換する変換手順と、
前記対象プログラムが使用するメモリ領域に対し、前記自プログラムの実行環境に基づく書込み保護を施した第１メモリマップと、前記対象プログラムの実行環境および／または前記対象プログラムの命令の内容に基づく書込み保護を施した第２メモリマップと、を作成するメモリマップ作成手順と、
前記変換手順が出力した書き込み命令が前記第１メモリマップに対する書込み保護違反を生じた場合に、前記第２メモリマップに対する書き込み命令に書き換える命令書き換え手順と、
をコンピュータに実行させることを特徴とするエミュレーションプログラム。
【００９６】
（付記２）前記第２メモリマップは、前記第１メモリマップと同一内容で、アドレスが所定量ずれたメモリマップであることを特徴とする付記１に記載のエミュレーションプログラム。
【００９７】
（付記３）前記第１メモリマップは、ページ単位で書込み保護を施したメモリマップであることを特徴とする付記１または２に記載のエミュレーションプログラム。
【００９８】
（付記４）前記命令書き換え手順は、前記第２メモリマップにおける書き込み先が書込み保護されている場合に、書き込み違反時に例外処理に移行する書き込み命令に書き換えることを特徴とする付記１〜３のいずれか一つに記載のエミュレーションプログラム。
【００９９】
（付記５）前記命令書き換え手順は、前記変換手順が出力した書き込み命令が前記第１メモリマップに対する書込み保護違反を生じ、かつ当該書き込み命令の書き込み先に対応する前記第２メモリマップが存在しない場合に、当該書き込み命令をそのまま出力することを特徴とする付記１〜４のいずれか一つに記載のエミュレーションプログラム。
【０１００】
（付記６）前記対象プログラムが出力した命令を解釈する命令解釈手順をさらにコンピュータに実行させ、前記変換手順は、前記命令解釈手順が解釈した書き込み命令が書込み保護違反を生じた場合に、当該命令を含む命令列を変換することを特徴とする付記１〜５のいずれか一つに記載のエミュレーションプログラム。
【０１０１】
（付記７）前記命令解釈手順は、前記対象プログラムが出力した命令を解釈する場合に、前記変換手順による変換対象範囲の起点を示す起点情報を作成することを特徴とする付記６に記載のエミュレーションプログラム。
【０１０２】
（付記８）対象プログラムの実行環境を仮想的に提供するエミュレーション装置であって、
前記対象プログラムが出力した命令を自装置が処理可能な命令に変換する変換手段と、
前記対象プログラムが使用するメモリ領域に対し、前記自装置の動作環境に基づく書込み保護を施した第１メモリマップと、
前記対象プログラムの実行環境および／または前記対象プログラムの命令の内容に基づく書込み保護を施した第２メモリマップと、
前記変換手段が出力した書き込み命令が前記第１メモリマップに対する書込み保護違反を生じた場合に、前記第２メモリマップに対する書き込み命令に書き換える命令書き換え手段と、
を備えたことを特徴とするエミュレーション装置。
【０１０３】
（付記９）対象プログラムの実行環境を仮想的に提供するエミュレーション方法であって、
前記対象プログラムが出力した命令を実際の実行環境で処理可能な命令に変換する変換ステップと、
前記対象プログラムが使用するメモリ領域に対し、前記実際の実行環境に基づく書込み保護を施した第１メモリマップと、前記対象プログラムの実行環境および／または前記対象プログラムの命令の内容に基づく書込み保護を施した第２メモリマップと、を作成するメモリマップ作成ステップと、
前記変換ステップが出力した書き込み命令が前記第１メモリマップに対する書込み保護違反を生じた場合に、前記第２メモリマップに対する書き込み命令に書き換える命令書き換えステップと、
を含んだことを特徴とするエミュレーション方法。
【図面の簡単な説明】
【０１０４】
【図１】本実施例に係るエミュレーションプログラムの概要構成を説明する説明図である。
【図２】エミュレーションの動作について説明する説明図である。
【図３】ローアドレスプロテクションについて説明する説明図である。
【図４】コードレットとターゲット命令の一貫性の保証について説明する説明図である。
【図５】エミュレーションプログラム２０における書込み保護の概要について説明する説明図である。
【図６】ＣＨＥＣＫ＿ＷＲＩＴＥ（ＡＤＤＲ，ＶＡＬ）の定義例について説明する説明図である。
【図７】ＣＨＥＣＫ＿ＷＲＩＴＥの再帰的書き換えについて説明する説明図である。（その１）
【図８】ＣＨＥＣＫ＿ＷＲＩＴＥの再帰的書き換えについて説明する説明図である。（その２）
【図９】再帰的な書き換えを回避したＣＨＥＣＫ＿ＷＲＩＴＥの定義例について説明する説明図である。
【図１０】コードレットの処理について説明するフローチャートである。
【図１１】ＣＨＥＣＫ＿ＷＲＩＴＥ処理の詳細について説明するフローチャートである。
【図１２】ストア命令の処理について説明するフローチャートである。
【符号の説明】
【０１０５】
１０    ターゲットプログラム
１１    演算処理部
１２    メモリ
２０    エミュレーションプログラム
２１    命令解釈部
２２    命令変換部
２３    演算処理部
２４    メモリマップ作成部
２５    実メモリ
２６，２７    仮想メモリマップ
２８    例外ハンドラ
２８ａ  判別部
２８ｂ  命令書き換え部
２８ｃ  例外処理部
【図１】
0005115332.tif 000002
【図２】
0005115332.tif 000003
【図３】
0005115332.tif 000004
【図４】
0005115332.tif 000005
【図５】
0005115332.tif 000006
【図６】
0005115332.tif 000007
【図７】
0005115332.tif 000008
【図８】
0005115332.tif 000009
【図９】
0005115332.tif 000010
【図１０】
0005115332.tif 000011
【図１１】
0005115332.tif 000012
【図１２】
0005115332.tif 000013