(57)【特許請求の範囲】
【請求項１】
命令キャッシュを有し、第一の命令セットを解釈・実行可能なプロセッサとメモリとを含む計算機システムにて、上記メモリに格納されたエミュレーションプログラムにより、第二の命令セットで記述されたプロクラムを上記第一の命令セットで記述されたプログラムに必要に応じて変換しながら実行する動的変換方式のプログラム実行における使用メモリの管理方法であって、
上記第二の命令セットで記述されたプログラムに対応する上記第一の命令セットで記述されたプログラムのアドレスを検索するために使用する変換済命令格納領域表の初期化のための手順として、
１）上記エミュレーションプログラムの中の特定部分のアドレス情報を、エミュレーション動作中に実行頻度が高い部分のアドレス情報として取得するステップ、及び
２）上記第二の命令セットで記述されたプログラムに対応する上記第一の命令セットで記述されたプログラムの少なくとも１つを格納可能な容量を有する領域のアドレス情報を次々に取得し、取得した各領域に格納した命令が上記命令キャッシュにて上記実行頻度が高い部分とキャッシュ競合を起こすか否かを判定し、否と判定した場合にその領域のアドレス情報を変換済命令の格納領域のアドレス情報として上記変換済命令格納領域表に登録するステップを含み、
命令変換及び実行の手順として、
３）上記第二の命令セットで作成されたプログラムに対応する第一の命令セットで作成されたプログラムが上記メモリ上に有るか否を上記変換済命令格納領域表を用いて検索し、
４）第一の命令セットで作成されたプログラムが有る場合はこれを上記プロセッサで実行し、
５）第一の命令セットで作成されたプログラムが無い場合は上記第二の命令セットで作成されたプログラムを第一の命令セットで作成したプログラムに変換し、変換したプログラムを上記メモリの設定された格納領域の範囲内に格納し、格納したプログラムの格納アドレスと変換前の上記第二の命令セットで作成されたプログラムとの対応関係を上記変換済命令格納領域表に格納する、
とのステップを含むことを特徴とするエミュレータ向けメモリ管理方法。
【請求項２】
上記エミュレーションプログラムの中の特定部分のアドレス情報は上記エミュレーションプログラムの作成時点で該プログラム中に埋め込まれることを特徴とする請求項１記載のエミュレータ向けメモリ管理方法。
【請求項３】
上記特定部分は上記エミュレーションプログラムのうち変換済命令検索処理の部分を含む請求項１記載のエミュレータ向けメモリ管理方法。
【請求項４】
上記特定部分は上記エミュレーションプログラムのうち変換済命令実行処理の部分を含む請求項１記載のエミュレータ向けメモリ管理方法。
【請求項５】
命令キャッシュを有し、第一の命令セットを解釈・実行可能なプロセッサとメモリとを含む計算機システム上で動作し、第二の命令セットで記述されたプロクラムを上記第一の命令セットで記述されたプログラムに必要に応じて変換しながら実行させるエミュレーションプログラムであって、
上記第二の命令セットで記述されたプログラムに対応する上記第一の命令セットで記述されたプログラムのアドレスを検索するために使用する変換済命令格納領域表の初期化のための手順として、
１）上記エミュレーションプログラムの中の特定部分のアドレス情報を、エミュレーション動作中に実行頻度が高い部分のアドレス情報として取得するステップ、及び
２）上記第二の命令セットで記述されたプログラムに対応する上記第一の命令セットで記述されたプログラムの少なくとも１つを格納可能な容量を有する領域のアドレス情報を次々に取得し、取得した各領域に格納した命令が上記命令キャッシュにて上記実行頻度が高い部分とキャッシュ競合を起こすか否かを判定し、否と判定した場合にその領域のアドレス情報を変換済命令の格納領域として上記変換済命令格納領域表に登録するステップを前記計算機システムに実行させ、
命令変換及び実行の手順として、
３）上記第二の命令セットで作成されたプログラムに対応する第一の命令セットで作成されたプログラムが上記メモリ上に有るか否を上記変換済命令格納領域表を用いて検索し、
４）第一の命令セットで作成されたプログラムが有る場合はこれを実行し、
５）第一の命令セットで作成されたプログラムが無い場合は上記第二の命令セットで作成されたプログラムを第一の命令セットで作成したプログラムに変換し、変換したプログラムを上記メモリの設定された格納領域の範囲内に格納し、格納したプログラムの格納アドレスと変換前の上記第二の命令セットで作成されたプログラムとの対応関係を上記変換済命令格納領域表に格納する、
との手順をステップを前記計算機システムに実行させることを特徴とするエミュレーションプログラム。
【請求項６】
命令キャッシュを有し、第一の命令セットを解釈・実行可能なプロセッサとメモリとを含む計算機システムにおいて、
上記計算機システムは、メモリ上に、第一の命令セットで記述されたエミュレーションプログラムと、第二の命令セットで記述されたプログラムのアドレスに対応する第一の命令セットで記述されたプログラムのアドレスを検索するために使用する変換済命令格納領域表とを有し、
上記エミュレーションプログラムは、
上記変換済命令格納領域表を初期化する初期化処理と、第二の命令セットで記述されたプログラムに対応する第一の命令セットで記述されたプログラムの有無を変換済命令格納領域表を用いて検索し、第二の命令セットで記述されたプログラムに対応する第一の命令セットで記述されたプログラムがある場合は、対応する第一の命令セットで記述されたプログラムを上記プロセッサで実行し、第二の命令セットで記述されたプログラムに対応する第一の命令セットで記述されたプログラムがない場合は第二の命令セットで記述されたプログラムに対応する第一の命令セットで記述されたプログラムに変換し、変換された命令を変換済命令格納領域表に予め登録された変換済命令の格納領域に格納すると共に、その対応関係を変換済命令格納領域表に格納する変換実行処理とを有し、
上記初期化処理は
上記プロセッサの命令キャッシュの構成を取得する命令キャッシュ構成取得処理と、
上記エミュレーションプログラムの中の特定部分のアドレス情報を、エミュレーション動作中に実行頻度が高い部分のアドレス情報として取得する高頻度実行アドレス取得処理と、
上記第二の命令セットで記述されたプログラムに対応する上記第一の命令セットで記述されたプログラムの少なくとも１つを格納可能な容量を有する領域のアドレス情報を次々に取得し、取得した各領域に格納した命令が上記命令キャッシュにて上記実行頻度が高い部分とキャッシュ競合を起こすか否かを判定し、否と判定した場合にその領域のアドレス情報を変換済命令の格納領域として上記変換済命令格納領域表に登録する変換済格納領域初期化処理とを有することを特徴とする計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は第一の命令セットを実行可能なプロセッサで第二の命令セット向けに記述されたプログラムを実行する計算機システムに関する。
【背景技術】
【０００２】
一般に、プログラムは特定の命令セット上で動作させることを前提に作成されている。しかしながら、コンピュータ・ハードウェアは経年変化によって故障するため、プログラムを継続して使用するためには、新しいコンピュータ・ハードウェアの導入が必要になるが、コンピュータ・ハードウェアの生産中止などにより、プログラムが前提とする命令セットを有するコンピュータ・ハードウェアを導入できないことがある。
ある命令セット（第一の命令セット）を有する新たなコンピュータ・ハードウェアで、第二の命令セットを前提に記述されたプログラムを実質的に動作させる一つの方法は、そのプログラムを、第一の命令セット、つまりコンピュータ・ハードウェアにネイティブな命令セットで記述されたプログラムに変換することである。
【０００３】
プログラムの変換方式には、プログラムの実行前に、プログラム全体の変換を行なう静的変換方式と、実行時に必要に応じて変換を行なう動的変換方式がある。静的変換方式では、命令とデータの区別が不明確である場合や、実行するまで分岐先アドレスが決定しない場合には適用できない。
一方、動的変換方式は上記の問題は生じないが、変換された命令を格納するメモリ領域によっては、命令キャッシュの競合の問題が生じる。これを説明すると、動的変換方式では、動的変換を行なうプログラム（エミュレーションプログラム）の実行により、まず変換後の命令列を格納する命令格納領域をメモリ上に確保し、第二の命令セットで記述された変換対象のプログラムを第一の命令セットのプログラムに変換して前記命令格納領域に格納し、この命令格納領域にある命令を実行する。この動的変換を行なうプログラム中の実行頻度が高い領域と、変換済み命令の格納領域とで命令キャッシュの検索に用いる添字（カラム番号）が重なる場合、変換済み命令格納領域にある命令を実行する際に、命令キャッシュミスが多数発生し、性能が大きく低下することがある。このように、同一の命令キャッシュ領域を複数のプログラム領域が使用するために、キャッシュミスが発生する状況を命令キャッシュにおける競合と呼ぶ。
【０００４】
特許文献１には、動的変換方式をとるバイナリ・プログラム変換装置が示される。それによると、複数の命令ブロックにより構成された変換前のプログラムが実行された際の情報に基づき、変換前のプログラムの複数ブロックを再構成し、もって変換後のプログラムを実行する際の命令キャッシュ競合を削減してキャッシュヒット率を向上する。
【０００５】
【特許文献１】特開平１０−１８７４６０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
動的変換手法では、変換済み命令格納領域のアドレスによっては、命令キャッシュの競合のために性能が大きく低下する可能性があるという問題がある。上記特許文献１に記載された技術により命令キャッシュの競合を削減するには、変換前のプログラム動作の履歴（実行トレース）を採取して命令ブロック単位に解析するという手順が必要となる。本発明の目的は、実行トレース採取・解析などの特別な手順を行うことなく命令キャッシュにおける競合を減らすことで、動的変換手法で安定して高い性能を得ることを可能にすることである。
【課題を解決するための手段】
【０００７】
本発明の代表的構成では、エミュレーションプログラムの初期化処理の部分に変換前のプログラムと変換済プログラムの格納アドレスとの対応関係を記録する変換済命令格納領域表に予め格納領域を設定する手順を含む。そしてその格納領域を設定は、エミュレーション動作に際して実行頻度が高い部分のメモリ上のアドレス情報を取得し、この実行頻度が高い部分と命令キャッシュ上でキャッシュ競合が生じるアドレスを除外して変換後命令が格納されるべき領域として設定する。
【０００８】
エミュレーション動作中に実行頻度が高い部分とは、代表的にはエミュレーションプログラムのうちのメインループ、例えば変換済命令検索処理の部分と変換済命令実行処理の部分である。キャッシュ競合が生じるアドレスとはその実行頻度が高い部分と命令キャッシュ上のカラム番号、つまり命令キャッシュを検索する際の添字が同一になるメモリ領域である。
【発明の効果】
【０００９】
上記構成では、エミュレーションプログラムのメインループと、そのメインループでアクセスされる変換済命令とが命令キャッシ上でキャッシュ競合となることがない。、したがってエミュレーション動作中にキャッシュミスによるメモリアクセスの回数が減少し、、動的変換手法で安定して高い性能を得ることができる。
【発明を実施するための最良の形態】
【００１０】
図1に第一の実施例のに用いられるコンピュータシステムを示す。
本実施例のコンピュータシステムは、プロセッサ100とメモリ120からなる。
プロセッサ100には命令キャッシュ101が塔載されている。命令キャッシュ101 はメモリ120から読み出したプログラムを格納する、メモリ120より高速で小容量なメモリである。最近実行されたプログラムを命令キャッシュ101に格納しておくことで、プログラムを繰り返し実行する際に、メモリ120から読み出す代わりに、命令キャッシュ101から読み出しができるため、読み出し時間を短縮することができる。
メモリ120にはエミュレーションプログラム200と高頻度実行アドレス表122と命令キャシュ構成情報123と変換済命令格納領域表124と使用way表125が格納されている。
【００１１】
図２に実施例における命令キャッシュの構成を示す。ここでは、命令キャッシュの検索の添字とアドレスタグに論理アドレスを使用する容量６４Ｋバイト、２ウエイセットアソシエティブ方式、ラインサイズ１２８バイトの命令キャッシュを使用する。他の構成、方式の命令キャッシュを採用する計算機システムであっても本発明を適用できる。命令キャッシュの１要素は、論理アドレスが格納されるアドレスタグと、このアドレスタグを開始アドレスとするラインサイズ分のデータからなる。ただし、アドレスタグはラインサイズの整数倍であるという制限がある。命令キャッシュ全体には（容量/way数/ラインサイズ）個の要素が集まったものがウエイ数分だけある。
【００１２】
命令キャッシュからある論理アドレスに対応するデータを読み出す場合は、まず、論理アドレスと（容量/way数―１）との論理積をとり、これを添字とする。次に各way毎に、添字に対応する要素のアドレスタグが論理アドレスと一致し且つ（ラインサイズー１）ではないものを検索する。いずれかのwayで該当するアドレスタグがあればキャッシュヒットであり、そのアドレスタグに対応するデータを読み出す。一方全てのなければキャッシュミスであり、メモリからデータを読み出す必要があるため読み出しが遅くなってしまう。
【００１３】
図３に、第一の実施形態におけるエミュレーションプログラム200の内容を示す。エミュレーションプログラム200は、エミュレーションに必要な変数を初期化する初期化処理220と動的変換方式でエミュレーションを実行する変換実行処理240からなる。
【００１４】
初期化処理220は、高頻度実行アドレス取得処理300、命令キャッシュ構成取得処理320、命令キャッシュ使用way数推定処理340 変換済命令格納領域初期化処理360とこれらの処理から呼び出される命令キャッシュアドレス変換処理380と命令キャッシュ競合判定処理400 からなる。
変換実行処理240は変換済命令検索処理500、命令変換処理520、変換済み命令実行処理540、終了判定処理560からなる。
【００１５】
図４に高頻度実行アドレス表122の詳細を示す。高頻度実行アドレス表122にはエミュレーションプログラム中で実行回数が多いプログラムの開始アドレスと終了アドレスが1つ以上格納されている。この例では、エミュレーションプログラムの変換済命令検索処理と変換済命令実行処理の実行回数が多く、変換済命令検索処理の開始アドレスは0x10001104、終了アドレスは0x100012ff、変換済命令実行処理の開始アドレスは0x10001728、終了アドレスは0x10001857であることを示している。
【００１６】
図５に命令キャッシュ構成表123の詳細を示す。命令キャッシュ構成表123には命令キャッシュアドレス変換処理380で論理アドレスから命令キャッシュ101の検索に用いる添字を算出するために、命令キャッシュ101 の容量、way数、ラインサイズが格納されている。この例では、容量が0x10000（64Kバイト）、way 数が1 （ダイレクトマップ方式）、ラインサイズが128バイトであることを示している。
【００１７】
図６に変換済命令格納領域表124の詳細を示す。変換済命令格納領域表124には、変換開始アドレスと変換済命令格納領域が1つ以上格納されている。この例では、4つの変換開始アドレスと変換済命令格納アドレスの対があり、変換開始アドレスが0x00000040である変換済命令は0x12001000に格納されていることを示している。
【００１８】
図７に命令キャッシュ使用way表125の詳細を示す。命令キャッシュ使用way表125は命令キャッシュ101の検索に用いる添字毎に高頻度実行アドレス表122に登録されているプログラムが使用するway数を記録する。この例では、高い頻度で実行されるプログラムが図４に示す高頻度実行アドレス表122、命令キャッシュ101 の構成が図５に示す命令キャッシュ構成表123であった時の命令キャッシュ使用way表125の内容であり、命令キャッシュ101が高い頻度で実行される。プログラムにより添字34から37までと添字46から48までが1way分使用されていることを表わしている。
【００１９】
図８に、エミュレーションプログラム200の動作手順の詳細を示す。エミュレーションプログラム200はまず初期化処理220を実行してから変換実行処理240を実行する。
【００２０】
図９に、初期化処理220の動作手順の詳細を示す。初期化処理220では、命令キャッシュ101において、エミュレーションプログラム200のなかで実行頻度が高いアドレスと競合を起こす可能性が低い変換済命令格納領域を変換済み命令格納領域表124に登録する。まず、高頻度実行アドレス取得処理300により、エミュレーションプログラム200のなかで実行頻度が高いアドレスを取得して、高頻度実行アドレス表に格納する。次に、命令キャッシュ構成取得処理320により命令キャッシュアドレス変換処理380に必要な命令キャッシュ101の構成情報（容量、way数、ラインサイズ）を取得し、命令キャッシュ構成情報123に格納する。
【００２１】
さらに、命令キャッシュ使用way推定処理340によりエミュレーションプログラム200のなかで実行頻度が高いアドレスが命令キャッシュ101中のどのキャシュアドレスとなるかを算出し、キャッシュの検索に用いる添字毎に使用way数を推定する。最後に変換済命令格納領域初期化処理360 により、エミュレーションプログラム200のなかで実行頻度が高いアドレスと競合を起こす否かを判定し、競合を起こす可能性が低い変換済命令格納領域だけを変換済み命令格納領域表124に登録する。
【００２２】
図１０に高頻度実行アドレス取得処理300の詳細を示す。高頻度実行アドレス取得処理300では、まず、高頻度実行アドレス取得301により、エミュレーショプログラム200のなかの1つ以上の実行頻度が高いプログラムの開始アドレスと終了アドレス対を取得する。取得方法としては、エミュレーショプログラム作成時点で、プログラム作成者が、高い頻度で実行されるプログラムの開始アドレスと終了アドレスを高頻度実行アドレス取得301に埋め込む方法や、高い頻度で実行されるプログラムの開始アドレスと終了アドレスをファイルに記録しておき、高頻度実行アドレス取得301 でファイルから読み出す方法がある。次に、高頻度実行アドレス表の生成302で、取得した実行頻度が高いプログラムの開始アドレスと終了アドレス対を高頻度実行アドレス表122に登録する。
【００２３】
図１１に命令キャッシュ構成取得処理320の詳細を示す。命令キャッシュ構成取得処理320では、まず、命令キャッシュ構成の取得321により、命令キャッシュ101の容量、way数、ラインサイズを取得する。取得方法としては、エミュレーショプログラム作成時点で、プログラム作成者が使用するプロセッサ100の命令キャッシュ101の構成を命令キャッシュ構成の取得321に埋め込む方法、OSが用意する命令キャッシュ構成変数を利用する方法、OSが用意する命令キャッシュ構成を取得するライブラリやAPI（Application Program Interface）を使用して取得する方法がある。次に、命令キャッシュ構成表の作成322により、取得した命令キャッシュ101の容量、way数、ラインサイズを命令キャッシュ構成表123に登録する。
【００２４】
図１２に命令キャッシュ使用way推定処理340の詳細を示す。命令キャッシュ使用way数推定処理340では、まず、高頻度実行アドレス取得341により、高頻度実行アドレス表122に登録された、実行頻度が高いプログラムの開始アドレスと終了アドレスを取得する。次に、命令キャッシュアドレス変換処理により、開始アドレスと終了アドレスをそれぞれ命令キャッシュ検索に用いる添字の開始アドレスと終了アドレスに変換する。さらに、命令キャッシュ使用way記録342により、命令キャッシュ内での開始アドレスから命令キャッシュ内での終了アドレスまでの命令キャッシュ使way表125の使用way数に1を加える。以上の手順は、終了判定ステップ343にて高頻度実行アドレス表122に登録された開始アドレスから終了アドレスまでの全てについて使用wayの記録が終了したのを確認するまで繰り返し実行される。
【００２５】
図１３に変換済命令格納領域初期化処理360の詳細を示す。変換済命令格納領域初期化処理360では、まず、メモリ取得361でmalloc（）等の関数を用いて変換済命令格納領域の1要素分の大きさを持つメモリ開始アドレスを取得する。メモリ終了アドレスはメモリ開始アドレスに変換済命令格納領域の1要素分の大きさ- 1を加算することで算出する。次に命令キャッシュアドレス変換処理380により、メモリ取得361で得たメモリ開始アドレスとメモリ終了アドレスをそれぞれ命令キャッシュ内で検索に使用する添字の開始アドレスと終了アドレスに変換する。さらに、命令キャッシュ競合判定処理400でメモリ取得361で得たメモリでプログラムを実行した際に高頻度実行プログラムと命令キャッシュ101で競合を起こすか否かを判定する。  すなわち、命令キャッシュ内での開始アドレスと終了アドレスを引数として命令キャッシュ競合判定処理400を呼び出し、戻り値として競合の有無を得る。競合がある場合は、ステップ362からメモリ取得のステップ361にもどる。競合がない場合はステップ363に進み、メモリ取得361で取得したメモリ開始アドレスを変換済命令格納領域表124の変換済命令格納アドレスに登録する。以上の手順は、終了判定ステップ364にて変換済命令格納領域表124の全ての変換済命令格納領域の登録が確認されるまで繰り返し実行する。
【００２６】
図１４に命令キャッシュアドレス変換処理380の詳細を示す。命令キャシュアドレス変換処理380では、論理アドレスを入力として受け取り、命令キャッシュ101 内の添字を戻り値として出力する。本処理はn-wayセットアソシアティブ方式で論理アドレスを添字としてキャッシュを検索する方式を仮定しているが、他の方式でも本手順と同様に命令キャッシュアドレスへの変換が可能である。まず、容量マスク381により、入力された論理アドレス and （命令キャッシュ構成表123の命令キャッシュ容量 - 1）の論理演算を行ない、これを論理アドレスMとする。次に、ラインサイズ除算382で論理アドレスM/命令キャッシュ構成表123の命令キャッシュラインサイズを計算し、これを命令キャッシュ内の添字とする。そして、命令キャッシュ内の添字を戻り値として出力する。
【００２７】
図１５に命令キャッシュ競合判定処理400の詳細を示す。命令キャッシュ競合判定処理400では、命令キャッシュ内の添字を入力として受け取り、実行頻度が高いプログラムと命令キャッシュ内で競合が発生するか否かを出力する。まず、命令キャッシュ使用way数取得401で命令キャッシュ使用way表125を参照し入力された命令キャッシュ内の添字に対応する使用way数を取得する。次に、使用way数判定402で、使用way数と命令キャッシュ構成表123の命令キャッシュway 数とを比較する。使用way数が命令キャッシュway数と等しいか小さければ競合はないと判定し、使用way数が命令キャッシュway数よりも大きければ競合があると判定する。
【００２８】
図１６に変換実行処理240の詳細を示す。変換実行処理240では、まず、変換済命令検索処理500で変換済み命令格納領域表123の命令アドレスがエミュレートするプロセッサのPC（プログラムカウンタ）と同じものを検索する。変換済み命令が存在241により、PCと同じものが存在する場合には命令変換処理520 をスキップする。PCと同じものが存在しない場合には、命令変換処理520により、メモリ上のPCが指す第一の命令セットで記述された命令以降を第二の命令セットで記述された命令列に変換し、変換済命令格納領域表124のうち、最も使用されていないと考えられる変換済命令格納アドレスが指すメモリアドレスに変換した命令列を格納すると共に、命令格納領域表123の命令アドレスにPCを格納する。さらに、変換済み命令実行処理540によりPCに対応する変換済み命令を実行する。エミュレーション終了242により、変換済命令検索処理500から変換済命令実行処理540までをエミュレーションが終了するまで繰り返し実行する。
【産業上の利用可能性】
【００２９】
本発明によれば、命令キャッシュ競合判定処理を行なうことにより、従来、エミュレーションプログラムのうち高頻度実行プログラムと命令キャッシュで競合を起こしていた変換済命令格納領域が変換済命令格納領域対応表に登録されなくなるため、競合による命令キャッシュミスに伴なう性能低下を起こす確率が低くすることができる。
【図面の簡単な説明】
【００３０】
【図１】本発明の一実施例である計算機システムの構成を示すブロック図。
【図２】上記実施例の命令キャッシュの構成を示すブロック図。
【図３】エミュレーションプログラムの構成を示す概念図。
【図４】高頻度実行アドレス表の内容を示す概念図。
【図５】命令キャッシュ構成表の内容を示す概念図。
【図６】変換済命令格納領域表の内容を示す概念図。
【図７】命令キャッシュ使用way表の内容を示す概念図。
【図８】エミュレーションプログラムのフローチャート。
【図９】初期化処理のフローチャート。
【図１０】高頻度実行アドレス取得処理のフローチャート。
【図１１】命令キャッシュ構成取得処理のフローチャート。
【図１２】命令キャッシュ使用way推定処理のフローチャート。
【図１３】変換済命令格納領域初期化処理のフローチャート。
【図１４】命令キャッシュアドレス変換処理のフローチャート。
【図１５】命令キャッシュ競合判定処理のフローチャート。
【図１６】変換実行処理のフローチャート。
【符号の説明】
【００３１】
３６１  メモリ取得
３８１  命令キャッシュアドレス変換処理
４００  命令キャッシュ競合判定処理
３６３  変換命令格納領域判定表に登録。
【図１】
0004701611.tif 000002
【図２】
0004701611.tif 000003
【図３】
0004701611.tif 000004
【図４】
0004701611.tif 000005
【図５】
0004701611.tif 000006
【図６】
0004701611.tif 000007
【図７】
0004701611.tif 000008
【図８】
0004701611.tif 000009
【図９】
0004701611.tif 000010
【図１０】
0004701611.tif 000011
【図１１】
0004701611.tif 000012
【図１２】
0004701611.tif 000013
【図１３】
0004701611.tif 000014
【図１４】
0004701611.tif 000015
【図１５】
0004701611.tif 000016
【図１６】
0004701611.tif 000017