JPH0695919A - コンピュータ・システムのエミュレーション方法 - Google Patents

コンピュータ・システムのエミュレーション方法

Info

Publication number
JPH0695919A
JPH0695919A JP19960592A JP19960592A JPH0695919A JP H0695919 A JPH0695919 A JP H0695919A JP 19960592 A JP19960592 A JP 19960592A JP 19960592 A JP19960592 A JP 19960592A JP H0695919 A JPH0695919 A JP H0695919A
Authority
JP
Japan
Prior art keywords
memory
access
processor
attribute
memory access
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.)
Granted
Application number
JP19960592A
Other languages
English (en)
Other versions
JPH0816875B2 (ja
Inventor
Hideaki Komatsu
秀昭 小松
Osamu Goda
修 郷田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP19960592A priority Critical patent/JPH0816875B2/ja
Publication of JPH0695919A publication Critical patent/JPH0695919A/ja
Publication of JPH0816875B2 publication Critical patent/JPH0816875B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

(57)【要約】 【目的】 メモリ・アクセスのエミュレーションを最適
化してエミュレーション全体の高速化を図る。 【構成】 メモリの1バイトに対応した属性表をもつこ
とによって高速化する従前の手法を基本とし、さらにメ
モリ操作のほとんどがデータのロード・ストアのために
使用されることに着目して、ほとんどのメモリ操作命令
において属性値のテストを行わずに実行することを可能
とするものである。メモリ空間をある一定の大きさのセ
グメントに分割して、それぞれのセグメントの属性値の
論理和を表現する1ビットのセグメント予測ビットを生
成し、さらに当該セグメントの予測ビットと、隣接する
2つのセグメントの予測ビットとの論理和を行う。その
操作をすべてのメモリ空間に対して実行し、セグメント
予測表を生成する。このセグメント予測表に格納されて
いるビットの値が0になっているということは、その予
測ビットに対応したセグメントに属しているメモリのど
れもが、通常のデータのためのメモリであり、各属性の
テストは必要ないことを意味する。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】この発明はコンピュータ・システ
ムのエミュレーション方法に関し、とくにメモリ・アク
セスに関するエミュレーションを最適化するものであ
る。
【0002】
【従来の技術】新しいプロセッサの出現によってより高
性能なコンピュータ・システムが生産されている。その
時最も問題となるのが、既存のソフトウエアの継承であ
る。既存のソフトウェアがすべて高級言語で書かれてお
り、そのソースコードを全部所有しているなら、再コン
パイルすることによって、新しいコンピュータ・システ
ムに対応した、ソフトウェアを作り上げることができ
る。しかし、実際の商用コンピュータの利用形態をみる
と、一般のユーザがソースコードをもっていることは、
ほとんどなく、また、プログラムも必ずしも高級言語で
書かれていないため簡単に変換できないものが多い。
【0003】そこで、既存のソフトウエアの有効な継承
手段として対象とするコンピュータ・システムをエミュ
レーションすることがあげられる。このエミュレーショ
ン方式では、実際のコンピュータ・システムと対象とす
るコンピュータ・システムの間のプロセッサのアーキテ
クチャ(命令セット)の違いや、ハードウエア(I/O
装置)の種類や制御方式違いをソフトウェアによって、
吸収することによって、どのようなコンピュータのため
プログラムを実行することが可能となる。
【0004】実際にエミュレーションを行なう技術とし
て、インタプリタ方式、コンパイル方式、実行時コンパ
イル方式の3方式がある。インタプリタ方式は、対象と
するプロセッサの命令を1つ1つ取り出しては、それを
解釈実行するものであり、エミュレータを作成すること
が容易である。対象とするコンピュータ・システムをマ
イクロプログラムで実現するなら速度的にも十分であ
る。しかし、通常のプロセッサ上に実現した場合には、
実用的な速度を得ることは困難である。
【0005】コンパイル方式は対象とするプログラムを
あらかじめコンパイルしておく方式であり、時間のかか
るコンパイル技術をあらかじめ適用しておくことも可能
になるため、実際の実行時間は3方式の中でもっとも高
速にできる。しかし、プログラムを変更するプログラム
を実現することはできないため、OSのローダの機能を
実現することや、プログラムテクニックとして自己変更
を用いたものは、エミュレーションすることはできな
い。さらに、バイナリコードを完全に逆コンパイルする
ことは不可能であるため、エントリアドレスのすべてが
静的にトレースできないようなプログラムに、完全に対
応することはできない。さらに、実際に実行するかどう
か、分からないコードの断片のすべてをコンパイルして
おかなければならないため、エミュレーションのための
コードサイズが大きくなってしまう、などの欠点をも
つ。
【0006】これに対し、実行時コンパイル方式はコン
パイルするためのオーバーヘッドが必要であり、また、
生成コードの質を向上させようとして、複雑な最適化手
法を利用すると、このオーバーヘッドがさらに増加して
しまう。このため、実行時コンパイル方式の実行速度
は、コンパイル方式に比べて遅くなってしまう。しか
し、対象とするアーキテクチャ(命令及びI/O)をす
べてエミュレーションすることが可能となるため、どの
ようなプログラムでさえも、実行することができるよう
になる。もっとも実用性が高いものが、この方式であ
り、本発明もこの方式を対象としている。
【0007】プロセッサの命令の種類を大まかに分類す
ると、以下の5つになる ・メモリ操作(データのロード・ストア) ・演算(整数、実数、テスト) ・分岐(条件分岐、無条件分岐) ・システム制御(OSのサポート) ・入出力 前記のエミュレーションの3方式のどの方式を用いて
も、エミュレーションの対象となるプロセッサでの処理
に比べて、もっとも処理に手間のかかるのが、メモリ操
作である。これは、メモリアクセスの動作が単純なデー
タのロード・ストアだけにとどまらず、操作の対象とな
るアドレス(実行アドレス)によって、以下の4種類の
操作に分類されるからである。 ・データのロードストア ・メモリマップI/O ・ROMエリアへのライト ・プログラムエリアへのライト
【0008】メモリマップI/Oを用いたコンピュータ
システムをエミュレーションする場合には、ロード・ス
トア命令の実行アドレスがI/Oエリアであった場合、
入出力命令として動作する必要がある。また、ROMエ
リアへのストアは無効にしなければならない。さらに、
実行時コンパイル方式を用いる場合は、プログラムエリ
ア(すでにコンパイルしたエリア)への書き込みは、コ
ードの無効化をおこない、さらに変更されたコードが実
行された場合、再コンパイルを必要とする。
【0009】原理的には、すべてのメモリオペレーショ
ンに対して、その実行アドレスが通常のデータの空間か
そうでないかをテストする必要が生じるため、エミュレ
ーションの速度低下の原因となる。 11 メモリオペレーションにおけるテストは以下のようにな
る。 実行アドレスの計算 if 実行アドレス >= I/Oエリアの先頭 かつ 実行アドレス <= I/Oエリアの最後 then I/O処
理 if 実行アドレス >= ROMエリアの先頭 かつ 実行アドレス <= ROMエリアの最後 then ROM処
理 if 実行アドレス >= プログラムエリアの先頭 かつ 実行アドレス <= プログラムエリアの最後 then プロ
グラム処理
【0010】そこで、すべてのメモリー空間に一意に対
応した属性表を用いる方法(メモリ1バイトに1バイト
の属性値を持たせる方式)がある(図1)。この属性値
(1バイト)の中の書くビットに、そのメモリ空間がど
ういうエリアに属しているかを記録しておく。これを用
いた、メモリオペレーションのテストは以下のようにな
る。(実行時コンパイル方式) 実行アドレスの計算 属性アドレスの計算 属性値のロード if 属性値が0でない then if 属性値のプログラムビットが真 then プログラム処
理 if 属性値のI/Oビットが真 then I/O処理 if 属性値のROMビットが真 then ROM処理 endif 1バイトのメモリに1バイトの属性をもたせるのは、属
性アドレスの計算の高速化と属性値の各テストの高速化
のためである。コンパイル方式では、プログラム処理は
対象としていないので、そのテストは必要ない。ほとん
どのメモリオペレーションが、通常のデータへのアクセ
スであるため(属性値が0であるため)、実行中は、属
性値の各ビットのテストがおこなわれないため実行時間
は、高速化される。この属性方式によって実用的な速度
で、実行時コンパイル方式が実用になる。
【0011】しかし、このメモリ操作は、依然としてエ
ミュレーション全体のボトルネックとなっている。その
理由としては、以下の5つが挙げられる。 (1)ほとんどのメモリ操作命令はデータのロード・ス
トアのためにのみに使用され、I/Oの処理やROMエ
リアへの書き込み、プログラムの書き直しのために使用
されることは、ほとんど稀である。 (2)メモリ操作命令は、比較的使用頻度の高い命令で
あり、テストの部分の処理時間に比べて、データのロー
ド・ストアの本来の処理はごくわずかしかないため、相
対的な速度の低下の比率が大きくなってしまう。 (3)このテストの部分の処理の各ステップはおのおの
前のステップの結果に依存してしまうため、各ステップ
をまったく並列に実行できない。これによって、スーパ
・スカラ方式(RS6000)やVLIW方式などの命
令を並列に実行できるプロセッサでの速度向上が望めな
い。 (4)メモリのロードは通常の命令に比べて実行時間が
長くなっていまう。この方式では、属性値をロードした
直後にテストしなければならないため、実行パイプライ
ンが停止してしまう。現在のプロセッサはこのパイプラ
イン技術によって実行速度をかせいでいるため、この速
度低下は問題となる。 (5)属性値のテストのコードをインラインで生成しな
ければ、実行速度が低下してしまうため、全体のコンパ
イル・コードが大きくなってしまう。また、これによっ
て命令キャッシュの利用率の低下や、ページフォールト
を増加させ、全体の処理効率を低下されてしまう。
【0012】なおこの発明と関連する特許文献として
は、特開平2−5138号公報がある。これは先に説明
したとおりの、属性値をそのまま保持するものである。
【0013】
【発明が解決しようとする課題】この発明では以上の事
情を考慮してなされたものであり、メモリ・アクセスの
エミュレーションを最適化してエミュレーション全体の
高速化を図ることを目的としている。
【0014】
【課題を解決するための手段】この発明では、メモリの
1バイトに対応した属性表をもつことによって高速化す
る従前の手法を基本とし、さらにメモリ操作のほとんど
がデータのロード・ストアのために使用されることに着
目して、ほとんどのメモリ操作命令において属性値のテ
ストを行わずに実行することを可能とするものである。
【0015】このために付加するものとしてセグメント
予測表がある(図2)。すなわち、図2に示すように、
メモリ空間をある一定の大きさのまとまり(セグメント
と呼ぶ)に分割して、それぞれのセグメントの属性値の
論理和を表現する1ビットのデータ(セグメント予測ビ
ット)を生成し、さらに当該セグメントの予測ビット
と、隣接する2つのセグメントの予測ビットとの論理和
を行う。その操作をすべてのメモリ空間に対して実行
し、セグメント予測表を生成する(図2)。
【0016】このセグメント予測表に格納されているビ
ットの値が0になっているということは、その予測ビッ
トに対応したセグメントに属しているメモリのどれも
が、通常のデータのためのメモリであり、各属性のテス
トは必要ないことを意味する。
【0017】実際にこのセグメント予測表のデータを直
接使用するのではなく、カテゴリ予測フラグを、CPU
内に保持しておき、このフラグを参照する。カテゴリ予
測フラグは、メモリ参照のカテゴリごとに検査するスパ
ンが異なるので、フラグ生成の仕方もそのスパンに応じ
たものとするものである。このカテゴリ予測フラグが0
になっていればそのカテゴリのメモリ操作命令では、属
性のテストが必要なくなる。
【0018】メモリー操作命令のためテストのアルゴリ
ズムは以下のようになる。 実行アドレスの計算 if カテゴリー予測フラグ=0でない then 属性アドレスの計算 属性値のロード if 属性値が0でない then if 属性値のプログラムビットが真 then プログラム処
理 if 属性値のI/Oビットが真 then I/O処理 if 属性値のROMビットが真 then ROM処理 endif endif
【0019】カテゴリを選ぶ基準は、アドレッシングモ
ードの計算表現に用いられている基底アドレスの値の変
更が少なく、オフセットとして、レジスタでなく定数を
とるものがよい。実際に利用可能なカテゴリーの例とし
て、以下のようなものがあげられる。 ・スタック変数へのアクセス(図3) ・グローバル変数へのアクセス(図4) ・ヒープ領域の構造体へのアクセス(図5)
【0020】スタック変数へのアクセスはスタック・ポ
インター(SP)を基底レジスタとして、変位を定数値
でアクセスすることが多い。よって、これをカテゴリと
することが可能である。グローバル変数へのアクセスも
ベース・レジスタを基底とし、変位を定数でアクセスす
ることが多い。さらに、ヒープ領域であっても同一の構
造体メンバーへのアクセスごとにそれをカテゴリーとす
ることが可能である。
【0021】この方式をもとの属性方式に付加する際に
オーバーヘッドとなるのが、実行時に必要なカテゴリー
予測フラグのテストと、カテゴリー予測フラグの更新の
ためのオーバーヘッドである。実行時のカテゴリー予測
フラグのテストのために生じるオーバーヘッドは以下の
2つである。 ・予測フラグのテストのために必要な命令の実行時間 ・そのテストの分岐によって生じるパイプラインの遅延
時間
【0022】本方式では、カテゴリー予測フラグはCP
U内部に保持しておくため、メモリからロードする必要
はない。レジスタの1ビットとして実現した場合は、テ
スト命令と条件分岐命令の2命令が、カテゴリー予測フ
ラグをテストするためのオーバーヘッドとなる。エミュ
レーションを実行しようとするCPUのアーキテクチャ
に依存するが、条件コードレジスタ中の1ビットとして
実現可能なら、条件分岐命令1つだけが、テストのため
に必要な命令の実行時間となる。また、メモリ操作命令
がデータの操作として使用される確率、すなわち、予測
が当たる確率は非常に高く、この場合、属性のテストが
省略される。予測フラグのテストのために必要な命令数
よりも属性のテストのために必要な命令数の方が多いた
め、本方式によって実行命令数は少なくなる。
【0023】後者のテストの分岐によって生じるパイプ
ラインの停止によるオーバーヘッドは、予測が当たった
場合にのみ発生するオーバーヘッドであり、予測が当た
らなかった場合には、まったく無関係である。さらに、
予測が当たった場合には、本来必要であった属性のテス
トの分岐によるパイプラインの遅延を除去できるため、
全体としてはまったくオーバーヘッドにならない。
【0024】また、これまでの方法では、属性値のテス
トを生成コードのなかにインラインで展開しなければ、
実行効率が低下してしまったが、本方式を用いることに
よって、属生値のテストをサブルーチン化しても実行速
度が低下しないため、コードサイズを圧縮でき、命令キ
ャッシュの利用効率も向上する。さらに、実行アドレス
の計算とカテゴリー予測フラグのテストは依存関係がな
いため、スーパ・スカラやVLIWなどの命令を並列に
実行できるアーキテクチャをもったプロセッサでは、並
列実行が可能となる。
【0025】もう1つのオーバーヘッドである、カテゴ
リ予測フラグの更新がおこなわれるのは、以下の2つの
タイミングである。 ・対象とするセグメントの属性が変更されたとき ・そのカテゴリーの対象とするセグメントが別のセグメ
ントになるとき
【0026】前者は、今まで実行されていないコードが
はじめて実行されるさいに起こる。実行時コンパイル方
式によるエミュレーションでは、初めて実行される時に
そのコードをコンパイルするため、それによって、コン
パイルされたメモリの属性値が変更する。I/OやRO
Mの空間は固定したものであるため、実行中に変化しな
い。もともと、実行時コンパイル方式では、コンパイル
のために、たくさんの処理時間を使用するため、セグメ
ント予測表の更新のオーバーヘッドは、それに比較して
非常に小さいものである。後者は、カテゴリーの基底レ
ジスタのアドレスが変更された際に起こる。このための
オーバーヘッドは以下の2つのステップによって生じる
ものである。 ・基底レジスタのアドレスの下位ビットをマスクする ・セグメント予測ビットを引く このオーバーヘッドは、属性値をロードするオーバーヘ
ッドと同程度であり、対象となるメモリ操作命令がデー
タ操作のためのものであれば、ほとんどオーバーヘッド
とならない。さらに、一度決定された、カテゴリー予測
フラグは再利用されるため、結果的にはまったくオーバ
ーヘッドにならない。
【0027】本方式は、実行時コンパイラ方式を高速化
するためのものであるが、既存のコンパイラの最適化技
術(データフロー解析)を利用すれば、より効率的に本
方式を適応することが可能となる。これによって、セグ
メント予測フラグの更新を最少に抑えることができる。
【0028】
【実施例】以下この発明を、米国のインターナショナル
・ビジネス・マシーンズ(IBM、商標)社のIBM
PCを同じくIBM社のRS/6000(IBM社の商
標)でエミュレートする場合に適用した実施例について
説明する。
【0029】IBM PCを実行時コンパイル方式によ
ってRS/6000上でエミュレートするための処理手
順は図6のようになる。まず実行しようとするInte
l8086プロセッサ(Intelおよび8086は米
国Intel社の商標、以下単に8086と呼ぶ)の命
令のアドレスをアドレス対応表によって、RS/600
0プロセッサのコンパイルされた命令列のアドレスに変
換する。
【0030】8086の実行アドレスがすでに実行され
たものであれば、アドレス対応表にエントリが存在し、
対応するRS/6000のアドレスが記録されているの
で、そこへ分岐することによってエミューレーションを
実行する。8086の実行アドレスがまだ実行されてい
ないものであれば、このアドレス対応表には未登録であ
るため、この場合に実行時コンパイラが起動される。コ
ンパイルする範囲はその8086の命令が到達可能であ
ると判断できるものがすべて対象となる。なるべく大き
な範囲をコンパイルの対象とすることで、実行時にコン
パイラを呼ぶ回数を減らすことが可能となる。さらに、
コンパイルの範囲を大きくとることによって、最適化が
適応される範囲も大きくなるため、より効率的な最適化
が実行できる。本手法も図6における最適化部、コード
生成部で使用されるものである。
【0031】実行時コンパイラはコンパイル対象の80
86の命令列をRS/6000の命令列に変換する。8
086の1命令がRS/6000の数命令に変換される
だけでなく、8086の数命令がRS/6000の数命
令に変換されることもある。1命令をコンパイルするよ
りも数命令をまとめてコンパイルしたほうが、最適化さ
れたコードが生成できる。コンパイルされる命令の種類
は以下のようになる。 ・メモリ操作(データのロード・ストア) ・演算(整数、実数、テスト) ・分岐(条件分岐、無条件分岐) ・システム制御(OSのサポート) ・入出力
【0032】これらの命令の種類のうち実際にコンパイ
ルされる範囲が分断されるのは、分岐命令だけである。
分岐命令もすべてのものではなく、間接分岐命令やリタ
ーン命令のようなデータの値に依存して実行後のプログ
ラム・カウンタの値が変化する命令によってである。間
接分岐命令にはレジスタ間接分岐、セグメントレジスタ
を使用した分岐命令(far call、far ju
mp)などである。このような命令をコンパイルするた
めに、コンパイラは、分岐条件の判断と分岐先の実行ア
ドレスの計算のあと、図6のループの先頭であるアドレ
ス対応表の検索の命令列へ分岐するための命令列を生成
する。
【0033】それ以外の分岐命令は、分岐先がアドレス
対応表に存在すれば、そこでそのパスのコンパイルを停
止して、別な到達可能な8086命令をコンパイルす
る。アドレス対応表に存在しなかった場合は継続してそ
のパスをコンパイルしていき、すべての到達可能なパス
をコンパイルすることによって、1回の実行時コンパイ
ルを停止する。
【0034】分岐以外の上記の命令の種類に対しては、
実行時コンパイラのコンパイル領域の制御は行なわれ
ず、純粋に命令を変換するだけの処理を行う。入出力命
令に対しては、対応するデバイス(ディスプレイ、キー
ボード、ディスクなど)をエミュレートするサブルーチ
ンを用意しておき、そのサブルーチンへのコール命令を
生成することによって、コンパイルが行われる。レジス
タ間接でI/O空間をアクセスする8086命令の場合
には、どのデバイスが使用されるのかが、実行時まで決
定できないため、その振り分けを行うサブルーチンを用
意し、そのサブルーチンへのコール命令を生成してお
く。
【0035】IBM PCではすべてのI/OがI/O
空間だけに存在するのではなく、メモリ・マップドI/
Oと呼ばれる、通常のデータ空間にI/Oを割り当てる
手法を使用している。これによって、すべてのI/Oが
I/O命令によってのみ処理されるのではなく、メモリ
にアクセスするすべての命令において、その影響を及ぼ
すアドレス(実行アドレス、effective address)がI
/Oのためのメモリ空間かデータやプログラムのための
空間かをテストする必要がある。IBM PCのメモリ
・マップドI/Oのアドレスは、A0000(16進)
からDFFFFまでの256Kバイトである(図7)。
【0036】また、ROM空間(IBM PCではE0
00(16進)からFFFFまで)への書き込みは無効
にしなければならないため、書き込みの実行アドレスの
テストも必要となる。(図7)
【0037】メモリ操作命令の実行時コンパイルでは、
前述のようにI/O空間にアクセスしているか、ROM
空間にアクセスしているがどうかをテストしけらばなら
ないほか、ストア命令が、すでにコンパイルされて、R
S/6000のオブジェクト・コードに変換されたプロ
グラムの1部を変更しているかどうかのテストも必要と
なる。
【0038】8086の命令では、演算命令のオペラン
ドとしてメモリを取り得るため、メモリ操作命令(ロー
ド・ストア命令)以外にも、メモリをオペランドとして
いる命令は上記のテストが必要となる。ROM空間とI
/O空間は固定で1つの領域をとっているため、テスト
が容易であるが、あるアドレスがすでにコンパイルされ
たプログラムであるか、データであるかを判定するのは
困難である。そこで、これらを効率的に処理するため
に、属性表を使用する。(図7)
【0039】属性表はIBM PCのメモリの1バイト
につき1バイトのエントリをもっている。使用するビッ
トは1バイト中のすべてではないが、この属性表のデー
タ(属性値)は非常に頻繁にアクセスされるため、数ビ
ットずつ使用することは、メモリを浪費せずにすむもの
の、エミュレーションの高速化のためにはよくない。そ
こでアクセスのもっとも高速な最小単位である1バイト
をこの属性表のエントリとする。
【0040】属性値は図7に示すように使用されてい
る。属性表はエミュレーションの開始時に初期化される
(図6におけるシステムの初期化)。前述のようにIB
M PCではROM空間とI/O空間が固定しているた
め、これらのアドレスの領域に対応する属性表のエント
リのI/OビットとROMビットをオン、それ以外のビ
ットをすべてオフにセットされたものが、その初期値と
なる。実行時に属性値が変化するのは、プログラムビッ
トのみで、実行時コンパイラがRS/6000のオブジ
ェクト・コードに変換した8086の命令のすべてのア
ドレスに対応する属性値のプログラム・ビットをオンに
セットする。
【0041】この属性値を用いたメモリ・リードの際の
テストのフローチャートを図8に示す。リードの場合に
はROM空間とプログラム空間のテストは不用である。
メモリ・ライトの際のテストのフローチャートを図9に
示す。ライトの場合には、ROM空間、I/O空間、プ
ログラム空間のテストが必要である。ライトの場合には
3つテストが必要となるが、属性値が0になっていれ
ば、個々のテストは不用となる。実際のプログラムで
は、通常がデータアクセスされる頻度に比較して、プロ
グラムが変更されたり、I/O空間やROM空間がアク
セスされることは、極めて稀である。それゆえ、リード
の場合のテストもライトの場合のテストも実行時間に比
べてそれほど差がない。
【0042】このテストの処理時間を縮小するために付
加するものとして、メモリ空間をある一定の大きさのセ
グメントに分割して、それぞれのセグメントの属性値の
論理和を、隣接する2つのセグメントの論理和と論理和
を行なったセグメント予測表を用いる。(セグメント予
測ビットの値が0になっていれば、各属性のテストは必
要ない)このセグメント予測表のデータを、メモリ参照
を利用法ごとに分類したカテゴリー予測フラグを、RS
/6000のフラグレジスタに割り当てる。当然このカ
テゴリー予測フラグが0になっていればそのカテゴリー
のメモリ操作命令では、属性のテストが必要ない。
【0043】8086プロセッサで使用するカテゴリは
以下のようなものが挙げられる。 (1)スタックカテゴリ SS:定数(BP) (2)グローバルカテゴリ DS:定数 (3)ヒープカテゴリ ES:定数(BX) 8086において、スタック変数へのアクセスはスタッ
クセグメント(SS)において、ベース・ポインター
(BP)を基底レジスタとして、変位を定数値でアクセ
スされる頻度が非常に高い。また、一般的にBPはサブ
ルーチンの先頭で更新され、リターン時に復帰する。こ
のスタックカテゴリの予測フラグによって、サブルーチ
ン内のスタック変数へのアクセスに必要となる、メモリ
テストコードを最適化することが可能となる。
【0044】本方式のセグメントのサイズは、8086
のアーキテクチャを有効に処理するために、128バイ
トに設定している(図10)。8086はスタックフレ
ームのアクセスするのに、BP(ベースポインタ)を基
底レジスタとして、ショートオフセットの場合には、プ
ラス127バイトマイナス128バイトの範囲でアクセ
ス可能である。8086をエミュレートする上で、本方
式をもっとも効果的に使用できるカテゴリーがスタック
フレームにある変数のアクセスであるため、128を本
方式におけるセグメントのサイズとしている。このサイ
ズをより大きなものに変更することも可能であるが、あ
まり大きな値を用いてしまうと、1セグメント内にプロ
グラムとデータが混在してしまうため、予測がはずれて
しまい、本方式で効果がえられなくなってしまう。
【0045】ショートオフセットを使用した場合(ほと
んどのスタックフレームはこのアドレッシング・モード
でアクセスされる)、BPレジスタがアクセス可能な領
域は図11のメモリ空間の斜線の部分になる。BPレジ
スタの示しているアドレスに対応する属性のセグメント
を Seg BP とする。この前後のセグメント( Se
g BPー1 及び Seg BP+1 )は、BPレジス
タがアクセス可能なメモリ領域より大きな領域となって
おり、これに対応するセグメント予測ビットは、BPレ
ジスタがアクセス可能なメモリ領域のすべてを予測可能
となる。セグメント予測表のBP番目のエントリはBP
レジスタの値を7ビット右にシフトした(128で割っ
た)ものである。
【0046】(2)のグローバル変数へのアクセスはデ
ータセグメント(DS)において、定数のオフセットの
みでアクセスされる。また、ほとんどのプログラムは実
行中にDSの値を変更しないため、1度グローバルカテ
ゴリ予測フラグを設定すれば、DSの変更によるグロー
バルカテゴリ予測フラグの更新は必要ないことが多い。
DSのサイズは64Kバイトであるため、1ビットの予
測フラグだけをRS/6000の条件レジスタにセット
するのではなく、セグメント予測表のエントリのビット
から512ビットの論理和をセットする必要がある。
【0047】論理和の値は計算される値のなかに1がひ
とつでもあれば結果も1になるので、1ビットではな
く、まとまったビット列が0かどうかのテストによって
高速化できる。RS/6000は1ワード32ビットで
あるため、1ワード分のセグメント予測フラグをロード
することによって、4Kバイトの大きさの8086のメ
モリ空間を予測可能となる。すなわち64Kバイト分の
予測を行なうために、17ワードのセグメント予測フラ
グをロードすればよい。16ワードではなく、1ワード
余分に必要なのは、DSが予測セグメントの途中の中途
半端なアドレスになっている場合に、1つ余計にテスト
しておくことで、64Kバイトが完全にテストされたこ
とを保証できる。
【0048】このグローバルカテゴリのカテゴリ予測フ
ラグの更新は、スタックカテゴリの更新に比べで、メモ
リからロードするデータが17倍も必要である。しか
し、RS/6000などのパイプライン化されたデータ
キャッシュを備えた最新のプロセッサでは、連続するア
ドレスのリードはオーバーヘッドなしで、ロード可能で
ある。さらにキャッシュミスの可能性も2、3倍程度し
か増加しないため、全体として数倍程度の処理しか必要
としない。さらに、スタックカテゴリのカテゴリ予測フ
ラグが、サブルーチ・コール程度の頻度で更新されるの
に比べて、グローバルカテゴリの更新はさらに少ない。
【0049】(3)の構造体カテゴリは、以下の2つの
メモリアクセスを高速化するものである。 ・ヒープ領域の同一構造体のメンバーへのアクセス ・ヒープ領域の配列要素へのアクセス 8086のヒープへのアクセスは ES をセグメントレ
ジスタとし、 BX レジスタをインデックスレジスタと
してアクセスされることが多い。I/O空間のアクセス
も同様のアドレッシングモード(ES:定数(BX))
でアクセスされるため、これがデータをアクセスするも
のかどうか判断できない。しかし、ヒープ領域の同一構
造体のメンバーへのアクセスやヒープ領域の配列要素へ
のアクセスは、同じ性質をもっていると考えられるた
め、これをカテゴリーとして予測フラグを使用する。
【0050】図12の例はヒープ領域にある2つのデー
タ( CHILD1 及び CHILD2 )からなる構造体( PARENT
)の各要素をそれぞれ1増加させるものである。この例
では、本手法を利用しないと5回の属性値のテストが必
要である(1から5の5つ)。これらのテストが本手法
によってまったく省略さてしまう。この例における本手
法を用いたオーバーヘッドは図12の(2)のMOV命
令の先頭で ES:0(BX)の実行アドレスからヒー
プカテゴリ用のセグメント予測フラグをリードする必要
がある。
【0051】次にセグメント予測フラグを用いることに
よって、1回のメモリアクセスのテストがどのくらい高
速化されるかを述べる。RS/6000は異なった種類
(分岐、整数、不動小数点)の命令を同時に実行可能な
スーパー・スカラー・アーキテクチャをもったCPUで
ある。さらに、RS/6000は、ユーザが自由に使用
できる32ビットの条件コードレジスタを備えているた
め、このレジスタの各ビットに様々なカテゴリー予測フ
ラグをマップすることが可能であり、これをテストする
のに1命令しか必要とならない。このテストの命令は実
行アドレスを計算する命令と並列に実行可能なため、R
S/6000上では、カテゴリー予測フラグをテストす
る命令の実行時間は完全に0にすることが可能である。
【0052】RS/6000では、条件分岐命令の分岐
条件(この場合には、予測フラグの値)が命令の実行よ
り3サイクルより前に決定していれば、0サイクルの分
岐がおこなえる、すなわち、分岐によって生じるパイプ
ラインの遅延を除去することが可能なアーキテクチャを
持っている。本方式では、カテゴリー予測フラグの値が
決定するのは、その値をテストするより、ほとんどの場
合、ずっと前である。よって、RS/6000の0サイ
クル分岐の特徴を利用することによって、予測が当たっ
た場合にも必要であった分岐による遅延時間を除去する
ことが可能となる。
【0053】RS/6000上で稼働しているPCシミ
ュレータにおけるメモリ操作命令の実行時間を測定す
る。対象とするメモリ操作命令は以下の8086のスタ
ックフレーム上の変数にAXレジスタの値を書き込むも
のである。これは、通常のデータをストアする命令なの
で、予測があった場合の実行となる。 mov ss:8(bp),ax ・本方式による実行時間 (2サイクル) 実行アドレスの計算 (0サイクル) if 予測フラグ=0でない then call
属性処理 (1サイクル) データのストア 合計3サイクル(4命令) ・属性方式による実行時間 (2サイクル) 実行アドレスの計算 (1サイクル) 属性アドレスの計算 (2サイクル) 属性値のロード (4サイクル) if 属性値が0でない then call 属
性処理 (1サイクル) データのストア 合計10サイクル(7命令)
【0054】属性値テストの処理時間(データ空間へ
の)は、属性値がデータキャッシュにヒットした場合
で、7サイクルかかってしまうが、本発明では、事実上
0サイクルとなる。処理全体の実行時間は10サイクル
が3サイクルとなる。属性値がキャッシュミスした場合
は非常に大きな差となる。予測がはずれた場合(I/
O、プログラム、ROMなどの場合)も、RS/600
0のもつ0サイクル分岐の能力のため実行時のオーバー
ヘッドはまったくない。実行する命令数はもともと7命
令必要であったものが4命令に縮小される。これによっ
て、命令キャッシュの利用効率が改善する。また、属性
値をアクセスしなくなるため、データキャッシュの利用
効率も向上する。これらによって、さらなる高速化が得
られる。
【0055】
【発明の効果】以上説明したようにこの発明によれば、
メモリ・アクセスのエミュレーション時に従来行われて
いた、実際のデータ領域かどうかのチェックを簡易に行
うようにしているので、エミュレーションを高速化でき
る。
【図面の簡単な説明】
【図1】 従来例を説明する図である。
【図2】 この発明の概略を説明する図である。
【図3】 この発明のメモリ・アクセスのカテゴリを説
明する図である。
【図4】 この発明のメモリ・アクセスのカテゴリを説
明する図である。
【図5】 この発明のメモリ・アクセスのカテゴリを説
明する図である。
【図6】 この発明の実施例の全体の動作を説明するフ
ローチャートである。
【図7】 上述実施例の要部を説明する図である。
【図8】 上述実施例のメモリ読み出しアクセスの際の
動作を説明するフローチャートである。
【図9】 上述実施例のメモリ書き込みアクセスの際の
動作を説明するフローチャートである。
【図10】 上述実施例のセグメント予測表の生成を説
明する図である。
【図11】 上述実施例のスタック変数へのアクセスの
際の動作を説明する図である。
【図12】 上述実施例のヒープ領域の構造体へのアク
セスの際の動作を説明する図である。
───────────────────────────────────────────────────── フロントページの続き (72)発明者 郷田 修 東京都千代田区三番町5−19 日本アイ・ ビー・エム株式会社 東京基礎研究所内

Claims (8)

    【特許請求の範囲】
  1. 【請求項1】 第1命令セットを有する第1プロセッサ
    を第2命令セットを有する第2プロセッサでエミュレー
    トして上記第1プロセッサ用のアプリケーションを上記
    第2プロセッサで実行させるエミュレーション方法にお
    いて、 上記第2プロセッサのメモリに上記第1プロセッサのメ
    モリ空間を生成するステップと、 上記メモリ空間の各メモリ・ロケーションの属性値を表
    す第1属性テーブルを生成するステップと、 上記メモリ空間のサブ空間ごとに当該サブ空間内のメモ
    リ・ロケーションの属性値の論理和を記憶する第2属性
    テーブルを生成するステップと、 現在のメモリ・アクセスの範囲の指定が変わるたびに、
    上記第2属性テーブルを参照し、メモリ・アクセスに加
    えて特別な処理が必要なメモリ・ロケーションが当該メ
    モリ・アクセスの範囲内にあるかどうかを判別するステ
    ップと、 特別な処理が必要なメモリ・ロケーションがないと判別
    されたときに、つぎにメモリ・アクセスの範囲の変更が
    あるまで、上記第1テーブルによる検査をせずに単にメ
    モリ・アクセスを実行するステップと、 特別な処理が必要なメモリ・アクセスがあると判別され
    たときは、少なくとも、つぎにメモリ・アクセスの範囲
    の変更があるまで、メモリ・アクセスごとに上記第1テ
    ーブルを参照して特別な処理が必要かどうか判別し、必
    要であればその特別な処理を実行するステップとを有す
    ることを特徴とするエミュレーション方法。
  2. 【請求項2】 第1命令セットを有する第1プロセッサ
    を第2命令セットを有する第2プロセッサでエミュレー
    トして上記第1プロセッサ用のアプリケーションを上記
    第2プロセッサで実行させるエミュレーション方法にお
    いて、 上記第2プロセッサのメモリに上記第1プロセッサのメ
    モリ空間を生成するステップと、 上記メモリ空間の各メモリ・ロケーションの属性値を表
    す第1属性テーブルを生成するステップと、 上記属性値が変更されたときに上記第1属性テーブルを
    修正するステップと、 上記メモリ空間のサブ空間ごとに当該サブ空間内のメモ
    リ・ロケーションの属性値の論理和を記憶する第2属性
    テーブルを生成するステップと、 上記第1属性テーブルが修正されたときに上記第2属性
    テーブルを修正するステップと、 現在のメモリ・アクセスの範囲の指定が変わるたびに、
    または上記第2属性テーブルが修正されるたびに、上記
    第2属性テーブルを参照し、メモリ・アクセスに加えて
    特別な処理が必要なメモリ・ロケーションが当該メモリ
    ・アクセスの範囲内にあるかどうかを判別するステップ
    と、 特別な処理が必要なメモリ・ロケーションがないと判別
    されたときに、つぎにメモリ・アクセスの範囲の変更が
    あるまで、または上記第2属性テーブルが修正されるま
    で、上記第1テーブルによる検査をせずに単にメモリ・
    アクセスを実行するステップと、 特別な処理が必要なメモリ・アクセスがあると判別され
    たときは、少なくとも、つぎにメモリ・アクセスの範囲
    の変更があるまで、または上記第2属性テーブルが修正
    されるまで、メモリ・アクセスごとに上記第1テーブル
    を参照して特別な処理が必要かどうか判別し、必要であ
    ればその特別な処理を実行するステップとを有すること
    を特徴とするエミュレーション方法。
  3. 【請求項3】 上記メモリ空間を満たす一連のセグメン
    トごとに上記サブ空間が割り当てられ、上記サブ空間は
    当該セグメントとこのセグメントに隣接する2つのセグ
    メントとからなる請求項1または2記載のエミュレーシ
    ョン方法。
  4. 【請求項4】 上記特別な処理が必要なメモリ・ロケー
    ションが当該メモリ・アクセスの範囲内にあるかどうか
    の判別結果を上記第2プロセッサの内部レジスタに保持
    する請求項1、2または3記載のエミュレーション方
    法。
  5. 【請求項5】 上記特別な処理は、メモリ・マップドI
    /Oへのアクセス、ROM領域への書き込みアクセスお
    よびプログラム領域への書き込みアクセスに対して実行
    される請求項1、2、3または4記載のエミュレーショ
    ン方法。
  6. 【請求項6】 メモリ・アクセスの方法に応じて上記メ
    モリ・アクセスの範囲の大きさが変化する請求項1、
    2、3、4または5記載のエミュレーション方法。
  7. 【請求項7】 メモリ・アクセスの方法には少なくとも
    スタック変数へのアクセスの方法、グローバル変数への
    アクセスの方法およびヒープ領域の構造体へのアクセス
    の方法が含まれる請求項6記載のエミュレーション方
    法。
  8. 【請求項8】 第1命令セットを有する第1プロセッサ
    を第2命令セットを有する第2プロセッサでエミュレー
    トして上記第1プロセッサ用のアプリケーションを上記
    第2プロセッサで実行させるために、上記第2プロセッ
    サで実行可能な、エミュレーション用のコンピュータ・
    プログラム製品において、 上記第2プロセッサのメモリに上記第1プロセッサのメ
    モリ空間を生成するステップと、 上記メモリ空間の各メモリ・ロケーションの属性値を表
    す第1属性テーブルを生成するステップと、 上記メモリ空間のサブ空間ごとに当該サブ空間内のメモ
    リ・ロケーションの属性値の論理和を記憶する第2属性
    テーブルを生成するステップと、 現在のメモリ・アクセスの範囲の指定が変わるたびに、
    上記第2属性テーブルを参照し、メモリ・アクセスに加
    えて特別な処理が必要なメモリ・ロケーションが当該メ
    モリ・アクセスの範囲内にあるかどうかを判別するステ
    ップと、 特別な処理が必要なメモリ・ロケーションがないと判別
    されたときに、つぎにメモリ・アクセスの範囲の変更が
    あるまで、上記第1テーブルによる検査をせずに単にメ
    モリ・アクセスを実行するステップと、 特別な処理が必要なメモリ・アクセスがあると判別され
    たときは、少なくとも、つぎにメモリ・アクセスの範囲
    の変更があるまで、メモリ・アクセスごとに上記第1テ
    ーブルを参照して特別な処理が必要かどうか判別し、必
    要であればその特別な処理を実行するステップとを上記
    第2プロセッサに実行させることを特徴とするエミュレ
    ーション用コンピュータ・プログラム製品。
JP19960592A 1992-07-27 1992-07-27 コンピュータ・システムのエミュレーション方法 Expired - Lifetime JPH0816875B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP19960592A JPH0816875B2 (ja) 1992-07-27 1992-07-27 コンピュータ・システムのエミュレーション方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP19960592A JPH0816875B2 (ja) 1992-07-27 1992-07-27 コンピュータ・システムのエミュレーション方法

Publications (2)

Publication Number Publication Date
JPH0695919A true JPH0695919A (ja) 1994-04-08
JPH0816875B2 JPH0816875B2 (ja) 1996-02-21

Family

ID=16410646

Family Applications (1)

Application Number Title Priority Date Filing Date
JP19960592A Expired - Lifetime JPH0816875B2 (ja) 1992-07-27 1992-07-27 コンピュータ・システムのエミュレーション方法

Country Status (1)

Country Link
JP (1) JPH0816875B2 (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH08123697A (ja) * 1994-10-24 1996-05-17 Nec Corp エミュレーション高速化方式
JP2010134847A (ja) * 2008-12-08 2010-06-17 Internatl Business Mach Corp <Ibm> コード実行システム、方法及びプログラム

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH08123697A (ja) * 1994-10-24 1996-05-17 Nec Corp エミュレーション高速化方式
JP2010134847A (ja) * 2008-12-08 2010-06-17 Internatl Business Mach Corp <Ibm> コード実行システム、方法及びプログラム

Also Published As

Publication number Publication date
JPH0816875B2 (ja) 1996-02-21

Similar Documents

Publication Publication Date Title
US10318322B2 (en) Binary translator with precise exception synchronization mechanism
US4951195A (en) Condition code graph analysis for simulating a CPU processor
US9495136B2 (en) Using aliasing information for dynamic binary optimization
US5167023A (en) Translating a dynamic transfer control instruction address in a simulated CPU processor
US5301302A (en) Memory mapping and special write detection in a system and method for simulating a CPU processor
US6289506B1 (en) Method for optimizing Java performance using precompiled code
JP3602857B2 (ja) 多機種対応型情報処理システム、および、方法
KR100624248B1 (ko) 어레이 정적 초기화 방법, 데이터 처리 시스템에서의 방법, 데이터 처리 시스템 및 컴퓨터 판독 가능한 매체
US7437542B2 (en) Identifying and processing essential and non-essential code separately
US9201635B2 (en) Just-in-time dynamic translation for translation, compilation, and execution of non-native instructions
US7809547B2 (en) Host computer system emulating target system legacy software and providing for incorporating more powerful application program elements into the flow of the legacy software
US9213563B2 (en) Implementing a jump instruction in a dynamic translator that uses instruction code translation and just-in-time compilation
US9529610B2 (en) Updating compiled native instruction paths
US9524178B2 (en) Defining an instruction path to be compiled by a just-in-time (JIT) compiler
US8108843B2 (en) Hybrid mechanism for more efficient emulation and method therefor
US9183018B2 (en) Dynamic on/off just-in-time compilation in a dynamic translator using instruction code translation
EP0327198B1 (en) Processor simulation
JPH0695919A (ja) コンピュータ・システムのエミュレーション方法
Magnusson Partial translation
US20150186168A1 (en) Dedicating processing resources to just-in-time compilers and instruction processors in a dynamic translator
Thongkaew et al. Dalvik bytecode acceleration using fetch/decode hardware extension
Zeng et al. Efficient condition code emulation for dynamic binary translation systems
Hepp Optimizing Java bytecode for embedded systems
Claret Exojo Design and Implementation of a PTX Emulation Library
Huberdeau et al. Tail Calling Between Code Generated by C and Native Backends