JP2004303114A - インタープリタおよびネイティブコード実行方法 - Google Patents
インタープリタおよびネイティブコード実行方法 Download PDFInfo
- Publication number
- JP2004303114A JP2004303114A JP2003097574A JP2003097574A JP2004303114A JP 2004303114 A JP2004303114 A JP 2004303114A JP 2003097574 A JP2003097574 A JP 2003097574A JP 2003097574 A JP2003097574 A JP 2003097574A JP 2004303114 A JP2004303114 A JP 2004303114A
- Authority
- JP
- Japan
- Prior art keywords
- interpreter
- native code
- execution
- code
- native
- 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.)
- Withdrawn
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; 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/45508—Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
【課題】ネイティブコードの呼び出し機能を備える従来のインタープリタ型システムでは、ネイティブコードの実行に関してインタープリタの制御が及ばないため、ネイティブコード部分からの不正アクセスが可能であった。また、ネイティブコード部分の実行状態を退避・回復することも困難であった。
【解決手段】上記課題を解決するため、インタープリタから呼び出されるネイティブコードを、実ハードウェアのエミュレーションを行うエミュレーションレイヤによって行う。エミュレーションレイヤによって不正参照のチェックや、退避・回復に必要となる実行状態の管理を行うことにより、上記課題が解決される。
【選択図】 図1
【解決手段】上記課題を解決するため、インタープリタから呼び出されるネイティブコードを、実ハードウェアのエミュレーションを行うエミュレーションレイヤによって行う。エミュレーションレイヤによって不正参照のチェックや、退避・回復に必要となる実行状態の管理を行うことにより、上記課題が解決される。
【選択図】 図1
Description
【0001】
【発明の属する技術分野】
本発明はネイティブコードの呼び出し機能を持つインタープリタ型の実行を行うプログラミング言語におけるプログラムの実行方法に関する。
【0002】
【従来の技術】
プログラミング言語の実行方法として、コンパイラと呼ばれるプログラムによってソースプログラムを実行対象計算機の機械語コードに変換する方法と、ソースプログラム、あるいは、それを中間表現に変換したプログラムを、インタープリタと呼ばれるプログラムによって、解釈実行する方式がよく知られている。
【0003】
インタープリタは、別のプログラムを解釈実行するプログラムの総称であり、プログラムの可搬性を高めるためにインタープリタによる実行方式が採用されることが多い。インタープリタ型の言語では、プログラムの実行がインタープリタと呼ばれるプログラムによって行われるため、インタープリタ実行されるプログラムで発生した不正メモリ参照などの問題を検出することが容易である。このようなプログラミング言語の代表として、Java(R)(非特許文献1: J. Gosling他, Java Language Specification, Sun Microsystems, 2000.)を挙げることができる。Javaで記述されたアプリケーションは、一旦バイトコードと呼ばれる中間表現に変換されJava仮想マシンと呼ばれるソフトウェアによってバイトコードが解釈実行される。
【0004】
Javaでは、配列外メモリ参照、nullポインタ参照などを実行時に検出する機能を持ち、不正なメモリ破壊が生じ得ないことを特徴としている。一方、C言語やC++などネイティブコード実行を行うプログラムでは、言語の機能としてメモリを保護する機能を備えていないため、OSが保護を行っている領域外のメモリを不正に参照することができる。
【0005】
こういった、Javaなどのインタープリタ型言語では、一般にI/Oなど低レベルのライブラリ機能をそれ自身で記述することが難しい。そこで、こういった低レベル機能に関しては、C言語やC++などによって記述されたネイティブコードを利用して実装する方式が広く用いられている。例えば、Javaではユーザがプログラム中から呼び出したいメソッドをネイティブコードによって記述するためのJNI(非特許文献2:S. Liang, Java Native Interface: Programmer’s Guide and Specification, Sun Microsystems, 1999.)と呼ばれる仕様を定めている。JNIでは、Javaからネイティブコードの呼び出しだけではなく、ネイティブコードからJavaプログラムを呼び出すための仕様も定めている。
【0006】
一方、このようなプログラムの実行において、プログラムそのものやハードウェアの保守・管理などの目的で、実行中のアプリケーションプログラムを一時的に中断してファイル上に退避しておき後ほど実行したい場合がある(checkpoint/restart)。また、同様の目的で、あるハードウェア上で実行しているアプリケーションを別のハードウェアに移動して実行継続したいというケース(migration)がある。このようなケースでは、プログラムの実行中の状態を取り出して、退避・回復できる必要がある。
【0007】
Javaにおいてこのようなプログラムの実行状態の退避・回復を実現するための方式として、バイトコードを解析し、退避を行いたいプログラム点に関して、スタック上の値などの情報を取得するためのコードをバイトコード列に挿入し、プログラム実行状態の回復を行う場合は、退避したプログラム状態を再構成するようにバイトコードを変換する方式が知られている(非特許文献3: E. Truyen他、Portable Support for Transparent Thread Migration in Java, In Proceedings of International Symposium on Agent Systems and Applications/Mobile Agents,2000)。
【0008】
【非特許文献1】J. Gosling他, Java Language Specification, Sun Microsystems, 2000
【非特許文献2】S. Liang, Java Native Interface: Programmer’s Guide and Specification, Sun Microsystems, 1999
【非特許文献3】E. Truyen他、Portable Support for Transparent Thread Migration in Java, In Proceedings of International Symposium on Agent Systems and Applications/Mobile Agents,2000
【0009】
【発明が解決しようとする課題】
ネイティブコードによってプログラムの一部を実装する機能は、インタープリタのみで実装できない機能を実現するために必須であるが、次のような問題がある。
(1) 安全性の保障が不十分
ネイティブコード部分のプログラムからは、インタープリタ内のメモリを自由に参照可能である。よって、インタープリタ部分で不正メモリ参照の検査を行っているとしても、ネイティブコード部分のプログラムに誤りがあった場合、プログラムの安定性/安全性が保証できなくなる。
(2) 状態の退避・回復が困難
インタープリタ実行を行っている部分に関しては、インタープリタがプログラムの実行途中の状態(メモリ上のデータ値、実行中の命令アドレスなど)を管理しているため、実行状態を退避・回復することは容易である。一方、インタープリタから呼び出されたネイティブコード実行部分に関しては、インタープリタの管理外で実行が行われているため、実行状態を退避・回復することが困難である。
【0010】
例えば、上記の従来技術では、プログラムの実行状態の退避・回復は純粋なJava実行を行っているアプリケーションのみに限られている。一般には、Javaのライブラリ中にはネイティブコードとして実現されている部分が多数存在するため、プログラム実行状態の退避・回復を行う上での大きな制約となる。
【0011】
【課題を解決するための手段】
上記の問題は、ネイティブコード部分の実行がインタープリタの制御とは無関係に行なわれることによる。そこで、本発明ではインタープリタから呼び出されるネイティブコード部分に関しては、ハードウェアで直接実行を行うのではなく、ハードウェアの機能のエミュレーション実行を行うエミュレータにより実行するようにした。こうすることでネイティブコードの処理をインタープリタによりコントロールすることが可能になる。
【0012】
このエミュレータにより、ネイティブコード部分でのメモリ参照のチェックを行うことにより、ネイティブコード実行における不正メモリ参照の発生を検出することが可能となる。
【0013】
同様に、ネイティブコード部分のプログラム実行状態に関し、エミュレーショタによって状態変化を記録しておくことで、実行状態の退避・回復を行うことが可能となる。
【0014】
【発明の実施の形態】
以下、本発明の一実施例を図面を参照しながら説明する。
【0015】
図11は本実施例でインタープリタを実行するシステムのハードウェア構成例を示す。改良されたインタープリタは、ディスク装置1103から主記憶装置1103上に読み込まれ、プロセッサ1101上で実行される。インタープリタが実行するアプリケーションに関しても同様にディスク装置1103に格納され、主記憶1103に読み込まれ、プロセッサ 1101上で動作するインタープリタにより実行が行なわれる。インタープリタはFDやCD−R等の記憶媒体に格納されて取引され、実行前に図示していない媒体読取装置から読み込まれてディスク装置1103に格納されているものとする。
【0016】
図2は従来のインタープリタシステムの例である。アプリケーションプログラム101は、インタープリタコード102と、ネイティブコード103から構成される。インタープリタコード102はプロセッサ106上でインタープリタ104により解釈実行される。
【0017】
図1は本発明を適用したインタープリタシステムを模式的に示した図である。アプリケーションプログラム101は、インタープリタコード102と、ネイティブコード103から構成される。インタープリタコード102はプロセッサ106上でインタープリタ104により従来から行われている方法で解釈実行される。一方、ネイティブコード103は、ネイティブコードエミュレータ105を介して実行される。ネイティブコードをエミュレータにより実行する場合は、プロセッサ上で直接実行する場合と比較して、実行速度が低下する可能性があるが、エミュレーションを高速に行うための技術として、実行時に動的に機械語コードの生成を行うバイナリトランスレーションなどの技術を利用することにより、性能の低下を低く押えることも可能である。以下の実施例ではインタープリタがネイティブコードエミュレータを備えた例で説明するが、インタープリタにはネイティブコードエミュレータの呼び出し機能だけを備えさせて、インタープリタとネイティブコードエミュレータがそれぞれ独立したプログラムとしてもよい。
【0018】
図3に本実施例のインタープリタによるプログラム実行処理のフローを示す。プログラム実行が処理301で開始されると、処理302で実行対象のコードがインタープリタコードであるか、ネイティブコードであるかの判定を行う。インタープリタコードである場合は、処理303に制御を移し、処理対象のコードをメモリから読み込む。次に、処理304において読み込んだインタープリタコードを実行し、処理305でプログラムの実行が完了したかどうかを判定する。プログラムの実行が完了であれば、処理306に制御を移し、プログラムの実行を終了する。完了で無い場合は、処理302に戻り次のコードの実行を行う。
【0019】
処理302における判定において、当該コードがネイティブコードである場合は、処理307に制御を移し、ネイティブコードでのメモリ領域参照の可/不可の情報を表す領域表を作成する。次に、処理308に制御を移す。処理308では、ネイティブコードをメモリから読み出し、上記307で作成した領域表を参照してメモリ参照の可/不可などの検査を付加的に行う。検査の結果参照エラーがなければ処理309において、処理308で読み出したネイティブコードの実行を行う。続いて、処理310においてプログラムの実行が完了したか否かを判定し、処理が完了していれば処理306に制御を移してプログラムの実行を終了する。処理が完了していなければ、処理302に戻って次のコードを実行する。
【0020】
なお、図3のフローでは、領域表の生成はネイティブコードの実行前に行うこととしたが、プログラムの起動時に初期設定しておき、プログラムの実行に伴ってネイティブコードから参照可能な領域が変化する毎に更新する方式にしてもよい。
【0021】
ここで、領域表の生成をネイティブコードの実行前に行う方式は、領域表に利用するメモリをネイティブコードの呼び出しを行わない場合は必要としないという利点があるが、一回あたりのネイティブコード呼び出しのオーバヘッドが大きくなる。逆に、プログラムの実行に伴って領域表を構築する後者の方式では、一回あたりのネイティブコード呼び出しオーバヘッドは低くなるが、領域表のデータをプログラム実行中に保持しておかなくてはならない。
【0022】
また、図3のフローでは、各インタープリタコードおよびネイティブコードに関して、次の実行対象コードがいずれに属するかを各命令の実行毎に確認している例を示したが、インタープリタ実行とネイティブコード実行の間の遷移が特定の命令で実施される場合など、次の対象命令の種別が特定可能な場合には、これを省略することが可能である。例えば、Javaではインタープリタからネイティブコードへの遷移はネイティブメソッド呼び出しに限定されるので、ネイティブメソッド呼び出しが発生するまでは、インタープリタ実行であることを仮定し、処理302の検査を省略できる。
【0023】
本実施例の特徴的な機能である、ネイティブコード実行部分におけるネイティブプログラム実行時の安全性の保障、プログラム実行状態の退避・回復のための状態の記録は主に処理308において実施される。
【0024】
図4は図3の処理308のネイティブコード命令読み出し処理で不正なメモリ参照や破壊の検出処理を実施する例の詳細を示す。まず、処理401で処理を開始し、処理402において変数Iに実行対象の命令を求める。次に、実行対象の命令Iがメモリ参照命令であるか否かを確認する。メモリ参照命令でない場合は、処理410に制御を移して処理を完了する(即ち、ステップ308の処理を終えステップ309に移ってネイティブコードの実行を行う)。メモリ参照命令の場合は、処理404に制御を移し、変数Aに命令Iが参照するアドレスを、変数Tに参照可能なメモリ領域の情報を表す領域表を求める。次に、処理405で領域表が空か否かを確認する。空の場合は、対応するアドレスが登録されていないので、処理408に制御を移して参照エラーを報告する。空でない場合は、処理406に制御を移し、領域表Tからエントリを1つ取り出し、変数Rに格納する。次に、領域情報Rに関して、アドレスAがRに含まれるか否かを確認する。参照しなければ処理405に制御を移し、次の領域の検査を継続する。参照を行う場合は、処理408に制御を移し、アドレスAの参照が不正か否かを確認する。参照が不正であれば、処理408に制御を移し処理を終了する。不正でなければ処理410に制御を移して処理を完了する。
【0025】
上記処理で利用するメモリ領域に関する情報を定義する領域表は、インタープリタの実行状態から定義される。Javaインタープリタの場合であれば、ネイティブコード実行部分においては、インタープリタ管理下にあるメモリ領域に対する読み書きを行う事は基本的にできない。ただし、JNI関数を介した場合には、読み書き可能である。
【0026】
図5に領域表の例を示す。表の各エントリは、開始アドレス501、終了アドレス502、参照可能モード503の3つのエントリからなる。なお、図5の参照モードにおいて、「r」は読み出し可、「w」は書き込み可を表すものとする。従って「−−」は読み出しも書き込みも不可を表す。例えば、ストア命令がアドレス00310000に対して書き込みを行う場合を考える。この場合、図4の処理405〜407によって、図5の領域表のエントリ504〜506が順に検査され、エントリ506でアドレス00310000の所属する領域が書き込み不可なので、処理408でエラーが報告される。また、次に、ロード命令がアドレス00220000から読出しを行う場合を考える。先の例と同様に、図4の処理405〜407によって、図5の領域表のエントリ504〜506が順に検査され、領域が読み出し可能であるので処理409で正常に処理が終了する。
【0027】
この検査は、すべてのメモリ参照に関して行う必要は無く、不正参照でないことが自明であるケースあるいは冗長な検査を除くことも可能である。
【0028】
このような不正参照を行うJavaプログラムの例を図6に示す。図6(a)のJavaプログラムでは、ネイティブメソッドfooにオブジェクトのリファレンス(アドレス)を受け渡している。図6(b)のnativeメソッドでは、受け渡されたオブジェクトのアドレスをint型のポインタにキャストし、(1)においてオブジェクトへ不正なオブジェクトへの書き込みを行っている。書き込み対象のオブジェクトはインタープリタの管理下にあるため、上記のようにネイティブコード部分からは参照できない。よって、ネイティブコード実行部分においてエラー検出が行なわれる。
【0029】
次に、プログラム実行状態の退避・回復の実施例について説明する。
【0030】
図7は状態退避の処理を示している。状態退避では、処理701で処理を開始する。次に、処理702でインタープリタの実行状態の退避を行ない、処理703でネイティブ実行部分の実行状態を退避し、処理704で退避処理を完了する。図8は退避した状態の回復処理を表している。回復処理も退避処理と同様の手順であり、まず処理801で処理を開始、次に処理802でインタープリタの実行状態の退避を行ない、続いて処理803でネイティブ実行部分の実行状態を回復し、処理705で処理を終了する。
【0031】
図12に処理703で退避するための情報を記録する命令エミュレーション処理を示す。命令エミュレーション処理は、処理1201で処理を開始し、続いて処理1202で実行対象の命令を変数Iに求める。次に、処理1203では命令Iが更新する状態集合を変数Tに求める。一般に、命令Iが更新する状態集合はエミュレーション対象のプロセッサの命令仕様により定義される。次に、処理1204により命令Iをエミュレーション実行する。これにより、処理1203で求めた状態集合が更新される。命令の実行後、処理1205で状態集合Tが空か否かを確かめ、空であれば処理1206に制御を移し処理を完了する。Tが空でなければ、処理1207に制御を移し、状態集合Tから状態を1つ取り出す。続いて、処理1208で取り出した状態の更新値を状態表に記録する。これにより、ネイティブコード実行により変更される状態の最新地が状態表に記録されることになる。続いて、処理1205に制御を移し、次の状態の処理を継続する。なお、図12に示した例では、状態表への保存を1命令の実行毎に行っているが、状態表への記録は最終値のみでよいので、複数命令を一括して処理してもよい。
【0032】
次に、処理703の状態の退避処理の詳細を図13に示す。図13に示す処理は、処理1301で処理を開始し、処理1302で状態表を変数Tに求める。次に、処理1303で状態表がからかい中を確認する。空であれば処理1306に制御を移して処理を完了する。空でなければ、処理1304に制御を移し、状態表Tからエントリを1つ取り出し、変数rに格納する。続いて、処理1305で状態の識別子と状態表に格納されたその最新値を退避する。次に、処理1303に制御を移して次の状態を処理する。
【0033】
図8の処理803の状態の回復処理では、この逆に、退避した状態表を読み出して、状態識別子の示す状態の最新値とすればよい。
【0034】
以上の処理により、ネイティブコード実行時の最新状態を状態表に記憶できるようになり、ネイティブコード実行部分に関しても状態の退避・回復が可能となる。
【0035】
図9に退避/回復の対象とするJavaプログラムの例を示す。この例では、図9(a)のJavaプログラムから図9(b)のネイティブコードを呼び出している。ここで、Javaコードのループの3度目、ネイティブコード部分のループの10度目の繰返しの開始時点でプログラムの実行状態を退避/回復することを考える。
【0036】
この時退避される情報の例を図10に示す。なお、この例では簡単のため変数の値のみを示しているが、実際にはプログラムの実行アドレスなど種々の情報を付加する必要がある。ここで、従来の方式では、インタープリタ部分の変数の値に関しては停止時点での値を検出することが可能であるが、ネイティブコード部分に関しては、状態が不明であった。ネイティブコード部分の実行をエミュレータによって実施することにより、図10に示すような状態値を退避することが可能となる。プログラムの状態回復を行う場合は、図10の値を適宜読み込んで状態の回復を行えば良い。
【0037】
【発明の効果】
本発明によれば、インタープリタ実行されるプログラムから呼び出されるネイティブコードによって生じる不正メモリ参照を検出できる。またネイティブコードの呼び出しを伴うプログラムの実行状態を退避・回復することが可能となる。
【図面の簡単な説明】
【図1】本発明を適用したインタープリタシステムを模式的に示した図。
【図2】従来のインタープリタシステムを模式的に示した図。
【図3】本実施例のインタープリタによるプログラム実行処理のフローを示す図。
【図4】図3の処理308の詳細を示すフローチャート。
【図5】領域表の例を示す図。
【図6】プログラム例を示す図。
【図7】状態退避の処理を示すフローチャート。
【図8】退避した状態の回復処理を示すフローチャート
【図9】退避/回復の対象とするJavaプログラムの例を示す図。
【図10】退避された情報の例を示す図。
【図11】インタープリタを実行するシステムのハードウェア構成を示す図。
【図12】命令エミュレーション時の状態退避処理を示すフローチャート。
【図13】図7の処理703の詳細を示すフローチャート。
【符号の説明】
101…アプリケーションプログラム、102…インタープリタコード、103…ネイティブコード、
104…インタープリタ、106…プロセッサ。
【発明の属する技術分野】
本発明はネイティブコードの呼び出し機能を持つインタープリタ型の実行を行うプログラミング言語におけるプログラムの実行方法に関する。
【0002】
【従来の技術】
プログラミング言語の実行方法として、コンパイラと呼ばれるプログラムによってソースプログラムを実行対象計算機の機械語コードに変換する方法と、ソースプログラム、あるいは、それを中間表現に変換したプログラムを、インタープリタと呼ばれるプログラムによって、解釈実行する方式がよく知られている。
【0003】
インタープリタは、別のプログラムを解釈実行するプログラムの総称であり、プログラムの可搬性を高めるためにインタープリタによる実行方式が採用されることが多い。インタープリタ型の言語では、プログラムの実行がインタープリタと呼ばれるプログラムによって行われるため、インタープリタ実行されるプログラムで発生した不正メモリ参照などの問題を検出することが容易である。このようなプログラミング言語の代表として、Java(R)(非特許文献1: J. Gosling他, Java Language Specification, Sun Microsystems, 2000.)を挙げることができる。Javaで記述されたアプリケーションは、一旦バイトコードと呼ばれる中間表現に変換されJava仮想マシンと呼ばれるソフトウェアによってバイトコードが解釈実行される。
【0004】
Javaでは、配列外メモリ参照、nullポインタ参照などを実行時に検出する機能を持ち、不正なメモリ破壊が生じ得ないことを特徴としている。一方、C言語やC++などネイティブコード実行を行うプログラムでは、言語の機能としてメモリを保護する機能を備えていないため、OSが保護を行っている領域外のメモリを不正に参照することができる。
【0005】
こういった、Javaなどのインタープリタ型言語では、一般にI/Oなど低レベルのライブラリ機能をそれ自身で記述することが難しい。そこで、こういった低レベル機能に関しては、C言語やC++などによって記述されたネイティブコードを利用して実装する方式が広く用いられている。例えば、Javaではユーザがプログラム中から呼び出したいメソッドをネイティブコードによって記述するためのJNI(非特許文献2:S. Liang, Java Native Interface: Programmer’s Guide and Specification, Sun Microsystems, 1999.)と呼ばれる仕様を定めている。JNIでは、Javaからネイティブコードの呼び出しだけではなく、ネイティブコードからJavaプログラムを呼び出すための仕様も定めている。
【0006】
一方、このようなプログラムの実行において、プログラムそのものやハードウェアの保守・管理などの目的で、実行中のアプリケーションプログラムを一時的に中断してファイル上に退避しておき後ほど実行したい場合がある(checkpoint/restart)。また、同様の目的で、あるハードウェア上で実行しているアプリケーションを別のハードウェアに移動して実行継続したいというケース(migration)がある。このようなケースでは、プログラムの実行中の状態を取り出して、退避・回復できる必要がある。
【0007】
Javaにおいてこのようなプログラムの実行状態の退避・回復を実現するための方式として、バイトコードを解析し、退避を行いたいプログラム点に関して、スタック上の値などの情報を取得するためのコードをバイトコード列に挿入し、プログラム実行状態の回復を行う場合は、退避したプログラム状態を再構成するようにバイトコードを変換する方式が知られている(非特許文献3: E. Truyen他、Portable Support for Transparent Thread Migration in Java, In Proceedings of International Symposium on Agent Systems and Applications/Mobile Agents,2000)。
【0008】
【非特許文献1】J. Gosling他, Java Language Specification, Sun Microsystems, 2000
【非特許文献2】S. Liang, Java Native Interface: Programmer’s Guide and Specification, Sun Microsystems, 1999
【非特許文献3】E. Truyen他、Portable Support for Transparent Thread Migration in Java, In Proceedings of International Symposium on Agent Systems and Applications/Mobile Agents,2000
【0009】
【発明が解決しようとする課題】
ネイティブコードによってプログラムの一部を実装する機能は、インタープリタのみで実装できない機能を実現するために必須であるが、次のような問題がある。
(1) 安全性の保障が不十分
ネイティブコード部分のプログラムからは、インタープリタ内のメモリを自由に参照可能である。よって、インタープリタ部分で不正メモリ参照の検査を行っているとしても、ネイティブコード部分のプログラムに誤りがあった場合、プログラムの安定性/安全性が保証できなくなる。
(2) 状態の退避・回復が困難
インタープリタ実行を行っている部分に関しては、インタープリタがプログラムの実行途中の状態(メモリ上のデータ値、実行中の命令アドレスなど)を管理しているため、実行状態を退避・回復することは容易である。一方、インタープリタから呼び出されたネイティブコード実行部分に関しては、インタープリタの管理外で実行が行われているため、実行状態を退避・回復することが困難である。
【0010】
例えば、上記の従来技術では、プログラムの実行状態の退避・回復は純粋なJava実行を行っているアプリケーションのみに限られている。一般には、Javaのライブラリ中にはネイティブコードとして実現されている部分が多数存在するため、プログラム実行状態の退避・回復を行う上での大きな制約となる。
【0011】
【課題を解決するための手段】
上記の問題は、ネイティブコード部分の実行がインタープリタの制御とは無関係に行なわれることによる。そこで、本発明ではインタープリタから呼び出されるネイティブコード部分に関しては、ハードウェアで直接実行を行うのではなく、ハードウェアの機能のエミュレーション実行を行うエミュレータにより実行するようにした。こうすることでネイティブコードの処理をインタープリタによりコントロールすることが可能になる。
【0012】
このエミュレータにより、ネイティブコード部分でのメモリ参照のチェックを行うことにより、ネイティブコード実行における不正メモリ参照の発生を検出することが可能となる。
【0013】
同様に、ネイティブコード部分のプログラム実行状態に関し、エミュレーショタによって状態変化を記録しておくことで、実行状態の退避・回復を行うことが可能となる。
【0014】
【発明の実施の形態】
以下、本発明の一実施例を図面を参照しながら説明する。
【0015】
図11は本実施例でインタープリタを実行するシステムのハードウェア構成例を示す。改良されたインタープリタは、ディスク装置1103から主記憶装置1103上に読み込まれ、プロセッサ1101上で実行される。インタープリタが実行するアプリケーションに関しても同様にディスク装置1103に格納され、主記憶1103に読み込まれ、プロセッサ 1101上で動作するインタープリタにより実行が行なわれる。インタープリタはFDやCD−R等の記憶媒体に格納されて取引され、実行前に図示していない媒体読取装置から読み込まれてディスク装置1103に格納されているものとする。
【0016】
図2は従来のインタープリタシステムの例である。アプリケーションプログラム101は、インタープリタコード102と、ネイティブコード103から構成される。インタープリタコード102はプロセッサ106上でインタープリタ104により解釈実行される。
【0017】
図1は本発明を適用したインタープリタシステムを模式的に示した図である。アプリケーションプログラム101は、インタープリタコード102と、ネイティブコード103から構成される。インタープリタコード102はプロセッサ106上でインタープリタ104により従来から行われている方法で解釈実行される。一方、ネイティブコード103は、ネイティブコードエミュレータ105を介して実行される。ネイティブコードをエミュレータにより実行する場合は、プロセッサ上で直接実行する場合と比較して、実行速度が低下する可能性があるが、エミュレーションを高速に行うための技術として、実行時に動的に機械語コードの生成を行うバイナリトランスレーションなどの技術を利用することにより、性能の低下を低く押えることも可能である。以下の実施例ではインタープリタがネイティブコードエミュレータを備えた例で説明するが、インタープリタにはネイティブコードエミュレータの呼び出し機能だけを備えさせて、インタープリタとネイティブコードエミュレータがそれぞれ独立したプログラムとしてもよい。
【0018】
図3に本実施例のインタープリタによるプログラム実行処理のフローを示す。プログラム実行が処理301で開始されると、処理302で実行対象のコードがインタープリタコードであるか、ネイティブコードであるかの判定を行う。インタープリタコードである場合は、処理303に制御を移し、処理対象のコードをメモリから読み込む。次に、処理304において読み込んだインタープリタコードを実行し、処理305でプログラムの実行が完了したかどうかを判定する。プログラムの実行が完了であれば、処理306に制御を移し、プログラムの実行を終了する。完了で無い場合は、処理302に戻り次のコードの実行を行う。
【0019】
処理302における判定において、当該コードがネイティブコードである場合は、処理307に制御を移し、ネイティブコードでのメモリ領域参照の可/不可の情報を表す領域表を作成する。次に、処理308に制御を移す。処理308では、ネイティブコードをメモリから読み出し、上記307で作成した領域表を参照してメモリ参照の可/不可などの検査を付加的に行う。検査の結果参照エラーがなければ処理309において、処理308で読み出したネイティブコードの実行を行う。続いて、処理310においてプログラムの実行が完了したか否かを判定し、処理が完了していれば処理306に制御を移してプログラムの実行を終了する。処理が完了していなければ、処理302に戻って次のコードを実行する。
【0020】
なお、図3のフローでは、領域表の生成はネイティブコードの実行前に行うこととしたが、プログラムの起動時に初期設定しておき、プログラムの実行に伴ってネイティブコードから参照可能な領域が変化する毎に更新する方式にしてもよい。
【0021】
ここで、領域表の生成をネイティブコードの実行前に行う方式は、領域表に利用するメモリをネイティブコードの呼び出しを行わない場合は必要としないという利点があるが、一回あたりのネイティブコード呼び出しのオーバヘッドが大きくなる。逆に、プログラムの実行に伴って領域表を構築する後者の方式では、一回あたりのネイティブコード呼び出しオーバヘッドは低くなるが、領域表のデータをプログラム実行中に保持しておかなくてはならない。
【0022】
また、図3のフローでは、各インタープリタコードおよびネイティブコードに関して、次の実行対象コードがいずれに属するかを各命令の実行毎に確認している例を示したが、インタープリタ実行とネイティブコード実行の間の遷移が特定の命令で実施される場合など、次の対象命令の種別が特定可能な場合には、これを省略することが可能である。例えば、Javaではインタープリタからネイティブコードへの遷移はネイティブメソッド呼び出しに限定されるので、ネイティブメソッド呼び出しが発生するまでは、インタープリタ実行であることを仮定し、処理302の検査を省略できる。
【0023】
本実施例の特徴的な機能である、ネイティブコード実行部分におけるネイティブプログラム実行時の安全性の保障、プログラム実行状態の退避・回復のための状態の記録は主に処理308において実施される。
【0024】
図4は図3の処理308のネイティブコード命令読み出し処理で不正なメモリ参照や破壊の検出処理を実施する例の詳細を示す。まず、処理401で処理を開始し、処理402において変数Iに実行対象の命令を求める。次に、実行対象の命令Iがメモリ参照命令であるか否かを確認する。メモリ参照命令でない場合は、処理410に制御を移して処理を完了する(即ち、ステップ308の処理を終えステップ309に移ってネイティブコードの実行を行う)。メモリ参照命令の場合は、処理404に制御を移し、変数Aに命令Iが参照するアドレスを、変数Tに参照可能なメモリ領域の情報を表す領域表を求める。次に、処理405で領域表が空か否かを確認する。空の場合は、対応するアドレスが登録されていないので、処理408に制御を移して参照エラーを報告する。空でない場合は、処理406に制御を移し、領域表Tからエントリを1つ取り出し、変数Rに格納する。次に、領域情報Rに関して、アドレスAがRに含まれるか否かを確認する。参照しなければ処理405に制御を移し、次の領域の検査を継続する。参照を行う場合は、処理408に制御を移し、アドレスAの参照が不正か否かを確認する。参照が不正であれば、処理408に制御を移し処理を終了する。不正でなければ処理410に制御を移して処理を完了する。
【0025】
上記処理で利用するメモリ領域に関する情報を定義する領域表は、インタープリタの実行状態から定義される。Javaインタープリタの場合であれば、ネイティブコード実行部分においては、インタープリタ管理下にあるメモリ領域に対する読み書きを行う事は基本的にできない。ただし、JNI関数を介した場合には、読み書き可能である。
【0026】
図5に領域表の例を示す。表の各エントリは、開始アドレス501、終了アドレス502、参照可能モード503の3つのエントリからなる。なお、図5の参照モードにおいて、「r」は読み出し可、「w」は書き込み可を表すものとする。従って「−−」は読み出しも書き込みも不可を表す。例えば、ストア命令がアドレス00310000に対して書き込みを行う場合を考える。この場合、図4の処理405〜407によって、図5の領域表のエントリ504〜506が順に検査され、エントリ506でアドレス00310000の所属する領域が書き込み不可なので、処理408でエラーが報告される。また、次に、ロード命令がアドレス00220000から読出しを行う場合を考える。先の例と同様に、図4の処理405〜407によって、図5の領域表のエントリ504〜506が順に検査され、領域が読み出し可能であるので処理409で正常に処理が終了する。
【0027】
この検査は、すべてのメモリ参照に関して行う必要は無く、不正参照でないことが自明であるケースあるいは冗長な検査を除くことも可能である。
【0028】
このような不正参照を行うJavaプログラムの例を図6に示す。図6(a)のJavaプログラムでは、ネイティブメソッドfooにオブジェクトのリファレンス(アドレス)を受け渡している。図6(b)のnativeメソッドでは、受け渡されたオブジェクトのアドレスをint型のポインタにキャストし、(1)においてオブジェクトへ不正なオブジェクトへの書き込みを行っている。書き込み対象のオブジェクトはインタープリタの管理下にあるため、上記のようにネイティブコード部分からは参照できない。よって、ネイティブコード実行部分においてエラー検出が行なわれる。
【0029】
次に、プログラム実行状態の退避・回復の実施例について説明する。
【0030】
図7は状態退避の処理を示している。状態退避では、処理701で処理を開始する。次に、処理702でインタープリタの実行状態の退避を行ない、処理703でネイティブ実行部分の実行状態を退避し、処理704で退避処理を完了する。図8は退避した状態の回復処理を表している。回復処理も退避処理と同様の手順であり、まず処理801で処理を開始、次に処理802でインタープリタの実行状態の退避を行ない、続いて処理803でネイティブ実行部分の実行状態を回復し、処理705で処理を終了する。
【0031】
図12に処理703で退避するための情報を記録する命令エミュレーション処理を示す。命令エミュレーション処理は、処理1201で処理を開始し、続いて処理1202で実行対象の命令を変数Iに求める。次に、処理1203では命令Iが更新する状態集合を変数Tに求める。一般に、命令Iが更新する状態集合はエミュレーション対象のプロセッサの命令仕様により定義される。次に、処理1204により命令Iをエミュレーション実行する。これにより、処理1203で求めた状態集合が更新される。命令の実行後、処理1205で状態集合Tが空か否かを確かめ、空であれば処理1206に制御を移し処理を完了する。Tが空でなければ、処理1207に制御を移し、状態集合Tから状態を1つ取り出す。続いて、処理1208で取り出した状態の更新値を状態表に記録する。これにより、ネイティブコード実行により変更される状態の最新地が状態表に記録されることになる。続いて、処理1205に制御を移し、次の状態の処理を継続する。なお、図12に示した例では、状態表への保存を1命令の実行毎に行っているが、状態表への記録は最終値のみでよいので、複数命令を一括して処理してもよい。
【0032】
次に、処理703の状態の退避処理の詳細を図13に示す。図13に示す処理は、処理1301で処理を開始し、処理1302で状態表を変数Tに求める。次に、処理1303で状態表がからかい中を確認する。空であれば処理1306に制御を移して処理を完了する。空でなければ、処理1304に制御を移し、状態表Tからエントリを1つ取り出し、変数rに格納する。続いて、処理1305で状態の識別子と状態表に格納されたその最新値を退避する。次に、処理1303に制御を移して次の状態を処理する。
【0033】
図8の処理803の状態の回復処理では、この逆に、退避した状態表を読み出して、状態識別子の示す状態の最新値とすればよい。
【0034】
以上の処理により、ネイティブコード実行時の最新状態を状態表に記憶できるようになり、ネイティブコード実行部分に関しても状態の退避・回復が可能となる。
【0035】
図9に退避/回復の対象とするJavaプログラムの例を示す。この例では、図9(a)のJavaプログラムから図9(b)のネイティブコードを呼び出している。ここで、Javaコードのループの3度目、ネイティブコード部分のループの10度目の繰返しの開始時点でプログラムの実行状態を退避/回復することを考える。
【0036】
この時退避される情報の例を図10に示す。なお、この例では簡単のため変数の値のみを示しているが、実際にはプログラムの実行アドレスなど種々の情報を付加する必要がある。ここで、従来の方式では、インタープリタ部分の変数の値に関しては停止時点での値を検出することが可能であるが、ネイティブコード部分に関しては、状態が不明であった。ネイティブコード部分の実行をエミュレータによって実施することにより、図10に示すような状態値を退避することが可能となる。プログラムの状態回復を行う場合は、図10の値を適宜読み込んで状態の回復を行えば良い。
【0037】
【発明の効果】
本発明によれば、インタープリタ実行されるプログラムから呼び出されるネイティブコードによって生じる不正メモリ参照を検出できる。またネイティブコードの呼び出しを伴うプログラムの実行状態を退避・回復することが可能となる。
【図面の簡単な説明】
【図1】本発明を適用したインタープリタシステムを模式的に示した図。
【図2】従来のインタープリタシステムを模式的に示した図。
【図3】本実施例のインタープリタによるプログラム実行処理のフローを示す図。
【図4】図3の処理308の詳細を示すフローチャート。
【図5】領域表の例を示す図。
【図6】プログラム例を示す図。
【図7】状態退避の処理を示すフローチャート。
【図8】退避した状態の回復処理を示すフローチャート
【図9】退避/回復の対象とするJavaプログラムの例を示す図。
【図10】退避された情報の例を示す図。
【図11】インタープリタを実行するシステムのハードウェア構成を示す図。
【図12】命令エミュレーション時の状態退避処理を示すフローチャート。
【図13】図7の処理703の詳細を示すフローチャート。
【符号の説明】
101…アプリケーションプログラム、102…インタープリタコード、103…ネイティブコード、
104…インタープリタ、106…プロセッサ。
Claims (11)
- ネイティブコードの呼び出し機能を備え、処理装置と協働してプログラミング言語の実行を行うインタープリタであって、ネイティブコードをネイティブコードエミュレータによるハードウェアエミュレーションによって実行することを特徴とするインタープリタ。
- 請求項1において、前記ネイティブコードによるメモリ参照命令の監視を行うことを特徴とするインタープリタ。
- 請求項2において、前記メモリ参照命令の監視は、当該インタープリタの管理するメモリ領域に関して、ネイティブコードからの読み出し/書き込み/実行の可/不可の表を記録しておき、前記ネイティブコードエミュレータによるネイティブコードの実行時に前記表を参照して命令実行における不正参照検出を実施することを特徴とするインタープリタ。
- 請求項1において、プログラムの実行対象コードが、インタープリタコードとネイティブコードのいずれに属するかを判定し、前記実行対象コードがネイティブコードであると判定された場合にエミュレータにて処理を行うことを特徴とするインタープリタ。
- 請求項4において、ネイティブメソッド呼び出しにてインタープリタコードの実行とネイティブコードの実行の遷移が行われる場合に、ネイティブメソッド呼び出しが発生するまでは前記判定処理を実行しないことを特徴とするインタープリタ。
- ネイティブコードの呼び出し機能を備え、処理装置と協働してプログラミング言語の実行を行うインタープリタであって、ネイティブコードによるメモリ参照命令の監視処理を行うことを特徴とするインタープリタ。
- 請求項6において、前記メモリ参照命令の監視は、当該インタープリタの管理するメモリ領域に関して、ネイティブコードからの読み出し/書き込み/実行の可/不可の表を記録しておき、前記ネイティブコードエミュレータによるネイティブコードの実行時に前記表を参照して命令実行における不正参照検出を実施することを特徴とするインタープリタ。
- ネイティブコードの呼び出し機能を備え、処理装置と協働してプログラミング言語の実行を行うインタープリタにおいて、ネイティブコード部分をハードウェアで直接実行するのではなく、ネイティブコードエミュレータによるハードウェアエミュレーションによって実行することを特徴とするネイティブコード実行方法。
- 請求項8において、インタープリタからネイティブコードの呼出を実施する際に、インタープリタの管理する各々のメモリ領域に関して、ネイティブコードからの読み出し/書き込み/実行の可/不可の表を記録しておき、前記ネイティブコードエミュレータによってネイティブコードの実行を行う際に、前記表を参照して、命令実行における不正参照検出を実施するネイティブコード実行方法。
- 請求項1のインタープリタにおいて、前記ネイティブコード部分の実行状態をネイティブコードエミュレータ内部に記憶しておき、プログラムの実行状態の退避を行う際に、インタープリタの内部状態と共にネイティブコード部分の実行状態を退避することを特徴とするインタープリタ。
- 請求項10のインタープリタにおいて、退避したプログラムの実行状態を読み出し、プログラムの停止点からプログラム実行を再開することを特徴とするインタープリタ。
Priority Applications (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2003097574A JP2004303114A (ja) | 2003-04-01 | 2003-04-01 | インタープリタおよびネイティブコード実行方法 |
| US10/696,280 US20040243986A1 (en) | 2003-04-01 | 2003-10-29 | Interpreter and native code execution method |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2003097574A JP2004303114A (ja) | 2003-04-01 | 2003-04-01 | インタープリタおよびネイティブコード実行方法 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JP2004303114A true JP2004303114A (ja) | 2004-10-28 |
Family
ID=33409320
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2003097574A Withdrawn JP2004303114A (ja) | 2003-04-01 | 2003-04-01 | インタープリタおよびネイティブコード実行方法 |
Country Status (2)
| Country | Link |
|---|---|
| US (1) | US20040243986A1 (ja) |
| JP (1) | JP2004303114A (ja) |
Cited By (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2017107540A (ja) * | 2015-09-30 | 2017-06-15 | エーオー カスペルスキー ラボAO Kaspersky Lab | エミュレータを組み合わせることにより、悪意のある実行ファイルであってインタープリタを有する実行ファイルを検出するためのシステム及び方法 |
| JP2019516167A (ja) * | 2016-03-23 | 2019-06-13 | フォグホーン システムズ, インコーポレイテッドFoghorn Systems, Inc. | リアルタイムデータフロープログラミング言語のためのツールおよび方法 |
| JP2021005250A (ja) * | 2019-06-26 | 2021-01-14 | コネクトフリー株式会社 | 実行コード提供方法およびソフトウェア開発システム |
Families Citing this family (13)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| GB2426840A (en) * | 2005-06-04 | 2006-12-06 | Transitive Ltd | Method of executing program code where a portion of the target code calls a native code portion which then calls a second target code portion. |
| DE102008040721A1 (de) * | 2008-07-25 | 2010-01-28 | Robert Bosch Gmbh | Emulationssystem und -verfahren für einen nicht mehr lieferbaren Mikrocontroller |
| US9697021B2 (en) * | 2010-04-30 | 2017-07-04 | Microsoft Technology Licensing, Llc | Modifiable high-level intermediate representation of source code |
| US8782434B1 (en) | 2010-07-15 | 2014-07-15 | The Research Foundation For The State University Of New York | System and method for validating program execution at run-time |
| US8646050B2 (en) * | 2011-01-18 | 2014-02-04 | Apple Inc. | System and method for supporting JIT in a secure system with randomly allocated memory ranges |
| EP2573403B1 (en) * | 2011-09-20 | 2017-12-06 | Grundfos Holding A/S | Pump |
| US9063760B2 (en) * | 2011-10-13 | 2015-06-23 | International Business Machines Corporation | Employing native routines instead of emulated routines in an application being emulated |
| JP5953867B2 (ja) * | 2012-03-26 | 2016-07-20 | 富士ゼロックス株式会社 | プログラム、及びプログラム保護装置 |
| US9063721B2 (en) | 2012-09-14 | 2015-06-23 | The Research Foundation For The State University Of New York | Continuous run-time validation of program execution: a practical approach |
| US9069782B2 (en) | 2012-10-01 | 2015-06-30 | The Research Foundation For The State University Of New York | System and method for security and privacy aware virtual machine checkpointing |
| GB2508433A (en) * | 2012-12-03 | 2014-06-04 | Ibm | Migration of processes in heterogeneous computing environments using emulating and compiling source code on target system |
| CN108052370B (zh) * | 2017-10-09 | 2021-06-08 | 华南理工大学 | 一种基于伴随程序组的共享内存对程序执行时间影响的评估方法 |
| US11200378B2 (en) * | 2018-10-11 | 2021-12-14 | International Business Machines Corporation | Methods and systems for processing language with standardization of source data |
Family Cites Families (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US5613063A (en) * | 1994-07-01 | 1997-03-18 | Digital Equipment Corporation | Method and apparatus for checking validity of memory operations |
| US6907519B2 (en) * | 2001-11-29 | 2005-06-14 | Hewlett-Packard Development Company, L.P. | Systems and methods for integrating emulated and native code |
-
2003
- 2003-04-01 JP JP2003097574A patent/JP2004303114A/ja not_active Withdrawn
- 2003-10-29 US US10/696,280 patent/US20040243986A1/en not_active Abandoned
Cited By (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2017107540A (ja) * | 2015-09-30 | 2017-06-15 | エーオー カスペルスキー ラボAO Kaspersky Lab | エミュレータを組み合わせることにより、悪意のある実行ファイルであってインタープリタを有する実行ファイルを検出するためのシステム及び方法 |
| JP2019516167A (ja) * | 2016-03-23 | 2019-06-13 | フォグホーン システムズ, インコーポレイテッドFoghorn Systems, Inc. | リアルタイムデータフロープログラミング言語のためのツールおよび方法 |
| JP2021005250A (ja) * | 2019-06-26 | 2021-01-14 | コネクトフリー株式会社 | 実行コード提供方法およびソフトウェア開発システム |
Also Published As
| Publication number | Publication date |
|---|---|
| US20040243986A1 (en) | 2004-12-02 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US7191441B2 (en) | Method and apparatus for suspending a software virtual machine | |
| US9875173B2 (en) | Time travel debugging in managed runtime | |
| KR101740604B1 (ko) | 멀웨어 검출을 위한 애플리케이션들의 제네릭 언패킹 | |
| US7774636B2 (en) | Method and system for kernel panic recovery | |
| US6678883B1 (en) | Apparatus and method for creating a trace file for a trace of a computer program based on loaded module information | |
| US6662362B1 (en) | Method and system for improving performance of applications that employ a cross-language interface | |
| US6698016B1 (en) | Method for injecting code into another process | |
| JP2004303114A (ja) | インタープリタおよびネイティブコード実行方法 | |
| WO2005024630A1 (ja) | 不正コード実行の防止方法および防止プログラム | |
| US8312202B1 (en) | Kernel acceleration technology for virtual machine optimization | |
| CN109255235B (zh) | 基于用户态沙箱的移动应用第三方库隔离方法 | |
| US8380660B2 (en) | Database system, database update method, database, and database update program | |
| CN104598823A (zh) | 一种安卓系统中内核级rootkit检测方法及其系统 | |
| US9256496B1 (en) | System and method for hybrid kernel—and user-space incremental and full checkpointing | |
| US7406684B2 (en) | Compiler, dynamic compiler, and replay compiler | |
| CN107450964B (zh) | 一种用于发现虚拟机自省系统中是否存在漏洞的方法 | |
| CN105683985A (zh) | 虚拟机内省 | |
| US10628272B1 (en) | System and method for hybrid kernel- and user-space incremental and full checkpointing | |
| Chow et al. | Multi-stage replay with crosscut | |
| US8327342B2 (en) | Method of reducing logging code in a computing system | |
| Stone et al. | No linux, no problem: Fast and correct windows binary fuzzing via target-embedded snapshotting | |
| US20020023224A1 (en) | Computer software installation | |
| CN113176926B (zh) | 一种基于虚拟机自省技术的api动态监控方法及系统 | |
| US20220308991A1 (en) | Test processing method and information processing apparatus | |
| Bapat et al. | Dapper: A lightweight and extensible framework for live program state rewriting |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20050916 |
|
| RD01 | Notification of change of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7421 Effective date: 20060420 |
|
| A761 | Written withdrawal of application |
Free format text: JAPANESE INTERMEDIATE CODE: A761 Effective date: 20071214 |