(57)【特許請求の範囲】
【請求項１】
ソースプログラムの解析結果に基づいて演算処理装置で実行可能なコードを生成する生成部と、
前記生成部により生成されたコードを予約領域を含めて所定の大きさ以下のブロックに分割し、スレッドスケジューラの呼び出し命令を前記予約領域に挿入する分割部と
を有することを特徴とする情報処理装置。
【請求項２】
前記呼び出し命令へのショート分岐命令に他のアドレスへのショート分岐命令を置き換えるとともに、該他のアドレスに分岐する分岐命令を前記予約領域に前記呼び出し命令の次の命令として挿入するパッチ部をさらに有することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記分割部がコードをブロックに分割する所定の大きさは、ブロック内のショ−ト分岐命令が前後の予約領域のいずれかに到達できる大きさであることを特徴とする請求項１又は２に記載の情報処理装置。
【請求項４】
ソースプログラムの解析結果に基づいて演算処理装置で実行可能なコードを生成して出力するコンパイル方法において、
前記コードを生成し、
生成したコードを予約領域を含めて所定の大きさ以下のブロックに分割し、スレッドスケジューラの呼び出し命令を前記予約領域に挿入する
ことを特徴とするコンパイル方法。
【請求項５】
ソースプログラムの解析結果に基づいて演算処理装置で実行可能なコードを生成して出力するコンパイラにおいて、
前記コードを生成し、
生成したコードを予約領域を含めて所定の大きさ以下のブロックに分割し、スレッドスケジューラの呼び出し命令を前記予約領域に挿入する
処理をコンピュータに実行させることを特徴とするコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、コンパイル方法及びコンパイラに関する。
【背景技術】
【０００２】
分岐命令として相対ショート分岐命令と相対分岐命令の２種類の命令を有するＣＰＵ（Central  Processing  Unit）がある。相対ショート分岐命令は、相対ショート分岐命令が格納されたアドレスから例えば−１２８〜＋１２７バイトの範囲のアドレスに分岐する命令であり、１バイトの命令コードと１バイトの相対アドレスの合計２バイトから構成され、命令長が短くて済む。
【０００３】
一方、相対分岐命令は、相対分岐命令が格納されたアドレスから−１２８〜＋１２７バイトを超える範囲のアドレスに分岐する命令であり、１バイトの命令コードと例えば４バイトの相対アドレスの合計５バイトから構成され、命令長が長くなる。このため、相対ショート分岐命令で到達可能な範囲では、コンパイラは、分岐命令として相対ショート分岐命令を出力する。
【０００４】
なお、分岐命令の分岐先の相対番地が分岐可能範囲外にある場合に、空き領域にロングブランチ命令を生成し、元の分岐命令の分岐先をロングブランチ命令のアドレスに変更することで、分岐可能範囲外への分岐を実現する技術がある。
【０００５】
また、パッチエリアへの分岐命令のサイズが修正エリアより大きい場合、修正エリアの直前又は直後に破壊エリアを探し、修正エリアと破壊エリアに分岐命令を挿入し、パッチエリアに破壊された命令を含めることで、パッチエリアへの分岐を可能とする技術がある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平８−２２７３６３号公報
【特許文献２】特開平７−４４３７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ロードされた動作中のソフトウェアの動作をパッチで修正する場合、修正コードを格納するパッチエリアへの被パッチ個所からの分岐は、相対ショート分岐命令で到達可能な範囲ではないため、パッチエリアへの分岐には相対分岐命令が用いられる。しかしながら、被パッチ個所の語長が相対分岐命令の語長よりも短い場合に、被パッチ個所に相対分岐命令を挿入することができないという課題がある。
【０００８】
図１０は、相対ショート分岐命令にパッチをあてる際の課題を説明するための図である。図１０は、ｘｘｘへジャンプする２バイトの相対ショート分岐命令（ｊｍｐ  ｘｘｘ）をｙｙｙへ分岐する５バイトの相対分岐命令（ｊｍｐ  ｙｙｙ）で置き換える場合を示す。ｊｍｐは分岐命令を示す。
【０００９】
図１０において、０ｘは１６進数を表し、相対ショート分岐命令の命令コードが０ｘｅｂであり、相対分岐命令の命令コードが０ｘｅ９であるとする。０ｘ９３は、相対ショート分岐命令のオフセットであり、０ｘ３ｂ  ０ｘｆｆ  ０ｘｆｆ  ０ｘｆｆは、相対分岐命令のオフセットである。また、？は０〜ｆのいずれかの数字である。
【００１０】
図１０に示すように、パッチをあてるために、ｘｘｘへジャンプする２バイトの相対ショート分岐命令をｙｙｙへ分岐する５バイトの相対分岐命令で置き換えると、相対ショート分岐命令に続く３バイトが上書きされてしまう。相対ショート分岐命令に続く３バイトが上書きされると、相対ショート分岐命令に続くバイトにジャンプする命令がある場合には、プログラムが正しく実行されないことになる。
【００１１】
本発明は、１つの側面では、被パッチ個所の語長が相対分岐命令の語長よりも短い場合にもパッチエリアへの分岐を可能とすることを目的とする。
【課題を解決するための手段】
【００１２】
本願の開示する情報処理装置は、１つの態様において、ソースプログラムの解析結果に基づいて演算処理装置で実行可能なコードを生成して出力するコンパイル部を有する。前記コンパイル部は、生成部と分割部とを有する。前記生成部は、前記コードを生成する。前記分割部は、前記生成部により生成されたコードを予約領域を含めて所定の大きさ以下のブロックに分割し、スレッドスケジューラの呼び出し命令を前記予約領域に挿入する。
【発明の効果】
【００１３】
１実施態様によれば、パッチエリアへの分岐を行うことができる。
【図面の簡単な説明】
【００１４】
【図１】図１は、実施例に係るコードの分割生成を説明するための図である。
【図２】図２は、実施例に係るパッチ適用を説明するための図である。
【図３】図３は、実施例に係る情報処理装置の構成を示す図である。
【図４】図４は、コード変換部による処理のフローを示すフローチャートである。
【図５】図５は、アドレス調整処理のフローを示すフローチャートである。
【図６】図６は、予約領域生成処理のフローを示すフローチャートである。
【図７】図７は、コンパイル部によるスレッドスケジューラへの分岐命令の挿入を説明するための図である。
【図８】図８は、制御をスレッドスケジューラに移すためのパッチ適用を説明するための図である。
【図９】図９は、実施例に係るコンパイラ及びパッチプログラムを実行する情報処理装置のハードウェア構成を示す図である。
【図１０】図１０は、相対ショート分岐命令にパッチをあてる際の課題を説明するための図である。
【発明を実施するための形態】
【００１５】
以下に、本願の開示する情報処理装置、コンパイル方法及びコンパイラの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００１６】
まず、実施例に係るコードの分割生成及びパッチ適用について図１及び図２を用いて説明する。図１は、実施例に係るコードの分割生成を説明するための図であり、図２は、実施例に係るパッチ適用を説明するための図である。
【００１７】
図１に示すように、実施例に係るコンパイルでは、連続するコードが予約領域１１を含めて２５６Ｂ（バイト）以下のブロックに分割されてコードが出力される。そして、予約領域１１を含むコードの実行中のパッチにおいて、図２に示すように、被パッチ個所１２が前後のどちらの予約領域１１の先頭アドレスに近いかが判定される（１）。
【００１８】
そして、近い方の予約領域１１の先頭アドレスと被パッチ個所１２の先頭アドレスとのオフセットが算出される（２）。図２では、被パッチ個所１２の前の予約領域１１が被パッチ個所１２に近いと判定され、−０ｘ２０が算出されたオフセットである。そして、近い方の予約領域１１にパッチ本体１３へ分岐する相対分岐命令が書き込まれる（３）。
【００１９】
そして、算出されたオフセットを用いて被パッチ個所１２に予約領域１１への相対ショート分岐命令が書き込まれる（４）。このように、実施例に係るパッチ適用では、予約領域１１を介することによって、被パッチ個所１２の語長が相対分岐命令の語長よりも短い場合にもパッチ本体１３への分岐が可能となる。
【００２０】
なお、被パッチ個所１２が相対ショート分岐命令であった場合には、オフセットだけの書き込みで済むため、パッチ適用はアトミックに行われる。ここで、パッチ適用がアトミックに行われるとは、パッチ適用の際に整合のとれない状態が発生しないことをいう。２バイト以上の書き込みが行われる場合には、メモリへの書き込み単位の境界にまたがる可能性があり、メモリへの書き込みが２回に分けて行われると、１回目の書き込みが行われて２回目の書き込みが行われるまでの間に整合のとれない状態が発生する。
【００２１】
次に、実施例に係る情報処理装置の構成について説明する。図３は、実施例に係る情報処理装置の構成を示す図である。図３に示すように、情報処理装置１は、ソースファイル２と、コンパイル部３と、コードファイル４と、コード読込部５と、コード記憶部６と、パッチ適用部７とを有する。
【００２２】
ソースファイル２は、ソースプログラムを記憶するファイルである。コンパイル部３は、ソースファイル２からソースプログラムを読み込み、ＣＰＵにより実行されるコードを生成する。コンパイル部３は、字句解析部３１と、構文解析部３２と、意味解析部３３と、中間コード生成部３４と、コード変換部３５とを有する。
【００２３】
字句解析部３１は、ソースプログラムの字句解析を行う。構文解析部３２は、字句解析結果を入力して構文解析を行う。意味解析部３３は、構文解析結果に対して、意味的な解析を行う。中間コード生成部３４は、意味解析結果に基づいて中間コードを生成する。コード変換部３５は、中間コードをＣＰＵにより実行されるコードに変換する。
【００２４】
コード変換部３５は、生成部３６と、分割部３７とを有する。生成部３６は、中間コードからＣＰＵにより実行されるコードを生成する。分割部３７は、生成部３６により生成されたコードをブロックに分割し、分割されたブロックに予約領域１１を挿入する。分割部３７は、予約領域１１を含めて２５６Ｂ以下のブロックにコードを分割し、予約領域１１が挿入されたコードをコードファイル４に書き込む。
【００２５】
コードファイル４は、予約領域１１が挿入されたコードを記憶するファイルである。コード読込部５は、実行するためにコードファイル４からコードをコード記憶部６に読み込む。コード記憶部６は、メモリの領域であり、コード読込部５によりコードファイル４から読み込まれたコードを記憶する。
【００２６】
パッチ適用部７は、コード記憶部６に記憶された動作中のコードにパッチを適用する。すなわち、パッチ適用部７は、コード記憶部６の未使用領域にパッチ本体１３を書き込む。そして、パッチ適用部７は、被パッチ個所１２が前後のどちらの予約領域１１の先頭アドレスに近いかを判定し、近い方の予約領域１１の先頭アドレスと被パッチ個所１２の先頭アドレスとの差をオフセットとして算出する。
【００２７】
そして、パッチ適用部７は、パッチ本体１３への相対分岐命令を近い方の予約領域１１の先頭から書き込む。そして、パッチ適用部７は、算出したオフセットを用いて被パッチ個所１２に近い方の予約領域１１への相対ショート分岐命令を書き込む。なお、被パッチ個所１２に相対ショート分岐命令が記憶されている場合には、パッチ適用部７は、算出したオフセットだけを書き込む。
【００２８】
次に、コード変換部３５による処理のフローについて説明する。図４は、コード変換部３５による処理のフローを示すフローチャートである。図４に示すように、コード変換部３５は、中間コードをＣＰＵで実行可能なコードに変換する（ステップＳ１）。
【００２９】
そして、コード変換部３５は、２５６Ｂ以下のブロックからなるようにコードを配置するため、ブロック分割による前回のコードの切れ目＋２５６−自身のコード長−予約領域１１の大きさより、配置するアドレスは大きいか否かを判定する（ステップＳ２）。その結果、配置するアドレスが大きくない場合には、コード変換部３５は、現在のブロック内にコードを配置できるので、生成したコードを配置する（ステップＳ３）。
【００３０】
一方、配置するアドレスが大きい場合には、コード変換部３５は、相対ショート分岐命令では到達できない分岐先アドレスの相対ショート分岐命令を相対分岐命令に変換するアドレス調整処理を行う（ステップＳ４）。そして、コード変換部３５は、ブロック内に予約領域１１を生成する予約領域生成処理を行う（ステップＳ５）。
【００３１】
図５は、アドレス調整処理のフローを示すフローチャートである。図５に示すように、コード変換部３５は、ブロック内の全ての２Ｂ分岐命令を確認したか否かを判定し（ステップＳ１１）、確認した場合には、処理を終了する。ここで、２Ｂ分岐命令とは、相対ショート分岐命令である。
【００３２】
一方、確認していない２Ｂ分岐命令がある場合には、コード変換部３５は、ブロック内の２Ｂ分岐命令の前方ジャンプ先アドレスを確認し（ステップＳ１２）、前方ジャンプ先アドレスが１２７Ｂ以上であるか否かを判定する（ステップＳ１３）。その結果、前方ジャンプ先アドレスが１２７Ｂ以上でない場合には、コード変換部３５は、ステップＳ１１に戻る。
【００３３】
一方、前方ジャンプ先アドレスが１２７Ｂ以上である場合には、コード変換部３５は、２Ｂ分岐命令を５Ｂ分岐命令に変換し、後続の命令をずらす（ステップＳ１４）。ここで、５Ｂ分岐命令とは、相対分岐命令である。そして、コード変換部３５は、ブロックの終端を確認し、予約領域１１に食い込む命令は後続のブロックへ移動する（ステップＳ１５）。そして、コード変換部３５は、ステップＳ１１に戻る。
【００３４】
図６は、予約領域生成処理のフローを示すフローチャートである。図６に示すように、コード変換部３５は、ブロックを跨ぐ分岐命令を生成する（ステップＳ２１）。そして、コード変換部３５は、予約領域１１としてｎｏｐ命令を生成する（ステップＳ２２）。ここで、ｎｏｐ命令とは、何も実行しない命令である。
【００３５】
このように、コード変換部３５が予約領域１１を含めて大きさが２５６Ｂ以下のブロックに分割されたコードを生成することで、パッチ適用部７は、被パッチ個所１２の大きさが２Ｂの場合にも相対分岐命令によるパッチ本体１３への分岐命令をコードに挿入することができる。
【００３６】
上述してきたように、実施例では、生成部３６が、中間コード生成部３４により生成された中間コードからＣＰＵで実行可能なコードを生成する。そして、分割部３７が、生成部３６により生成されたコードをブロックに分割し、分割されたブロックに予約領域１１を挿入する。分割部３７は、予約領域１１を含めて２５６Ｂ以下のブロックにコードを分割し、予約領域１１が挿入されたコードをコードファイル４に書き込む。
【００３７】
したがって、パッチ適用部７は、予約領域１１へ分岐する相対ショート分岐命令を被パッチ個所１２に書き込み、予約領域１１を利用してパッチ本体１３への分岐を行う相対分岐命令を書き込むことができる。このため、被パッチ個所１２の語長が相対分岐命令の語長よりも短い場合にも、パッチが適用されるプログラムはパッチ本体１３への分岐を行うことができる。
【００３８】
ところで、上記実施例では、予約領域１１を用いてパッチ本体１３への分岐を行う場合について説明したが、予約領域１１を特定のルーチンの呼び出しに用いることもできる。そこで、予約領域１１を例えばスレッドスケジューラの呼び出しに用いる場合について説明する。
【００３９】
スレッド制御においては、あるスレッドから他のスレッドに切り替えたい場合がある。ここで、スレッドとは、プログラムの並列実行の単位である。スレッドは、プロセスと比較して、コンテキスト情報が少なくて済むため、切り替えが速い。
【００４０】
あるスレッドから他のスレッドに切り替える従来の方法には、２つの方法がある。１つは、スレッドが自ら実行権を放棄するまで待つ方法である。この方法は、スレッドの切り替えがユーザ空間の中での動作だけで済むので切り替えコストは低い（切り替え時間が短い）が、ユーザが実行権を放棄しない限り切り替えが行われることはなく、システム側から強制的に切り替えを行うことはできない。
【００４１】
他の１つは、ＯＳ（Operating  System）がタイマ等の割り込みにより制御を奪い、スレッドを切り替える方法である。この方法は、システム側から切り替えを行うことができるが、切り替えコストが高い（切り替え時間が長い）。
【００４２】
そこで、実施例に係る情報処理装置１は、予約領域１１を利用してスレッドスケジューラを呼び出すことにより、高速なスレッド切り替えを実現する。図７は、コンパイル部３によるスレッドスケジューラへの分岐命令の挿入を説明するための図であり、図８は、制御をスレッドスケジューラに移すためのパッチ適用を説明するための図である。
【００４３】
図７に示すように、コンパイル部３は、連続するコードを予約領域１１を含めて２５６Ｂ以下のコードに分割し、予約領域１１にスレッドスケジューラへの相対分岐命令を書き込む。図７において、ｃａｌｌ  ｓｃｈｅｄは、スレッドスケジューラへの相対分岐命令を表す。
【００４４】
そして、パッチ適用部７は、予約領域１１にスレッドスケジューラへの相対分岐命令が書き込まれたコードの実行中に、スタックを覗き現在動作しているモジュールを特定する。そして、パッチ適用部７は、図８に示すように、モジュールの中の相対ショート分岐命令１４に対して前後のどちらの予約領域１１の先頭アドレスに近いかを判定する（１）。
【００４５】
そして、パッチ適用部７は、近い方の予約領域１１の先頭アドレスと相対ショート分岐命令１４の先頭アドレスとのオフセットを算出する（２）。図８では、相対ショート分岐命令１４の前の予約領域１１が相対ショート分岐命令１４に近いと判定され、−０ｘ２０が算出されたオフセットである。
【００４６】
そして、パッチ適用部７は、近い方の予約領域１１に書き込まれたｃａｌｌ  ｓｃｈｅｄの次に、相対ショート分岐命令１４により本来ジャンプすべきアドレスへのジャンプ命令を書き込む。すなわち、パッチ適用部７は、スレッドスケジューラ１５から制御が戻ったときの戻りアドレスへのジャンプ命令を書き込む（３）。なお、スレッドスケジューラ１５は、パッチ適用部７がパッチを行うプログラムとは別のＣＰＵで動作する。
【００４７】
そして、パッチ適用部７は、算出したオフセットを相対ショート分岐命令１４の２バイト目に書き込む（４）。このように、パッチ適用部７は、予約領域１１に書き込まれたｃａｌｌ  ｓｃｈｅｄを利用してスレッドスケジューラ１５を呼び出すことによって、被パッチプログラムは高速に他のスレッドへ制御を移すことができる。
【００４８】
なお、実施例では、スレッドスケジューラ１５を呼び出す場合について説明したが、本発明はこれに限定されるものではなく、他のルーチンを呼び出す場合にも同様に適用することができる。
【００４９】
また、実施例では、コンパイル部３及びパッチ適用部７について説明したが、コンパイル部３及びパッチ適用部７の機能をソフトウェアによって実現することで、同様の機能を有するコンパイラ及びパッチプログラムを得ることができる。そこで、コンパイラ及びパッチプログラムを実行する情報処理装置１のハードウェア構成について説明する。
【００５０】
図９は、実施例に係るコンパイラ及びパッチプログラムを実行する情報処理装置１のハードウェア構成を示す図である。図９に示すように、情報処理装置１は、メインメモリ６１と、ＣＰＵ６２と、ＬＡＮ（Local  Area  Network）インタフェース６３と、ＨＤＤ（Hard  Disk  Drive）６４とを有する。また、情報処理装置１は、スーパーＩＯ（Input  Output）６５と、ＤＶＩ（Digital  Visual  Interface）６６と、ＯＤＤ（Optical  Disk  Drive）６７とを有する。
【００５１】
メインメモリ６１は、プログラムやプログラムの実行途中結果などを記憶するメモリである。パッチ適用部７は、メインメモリ６１に記憶されたコードに対してパッチを適用する。ＣＰＵ６２は、メインメモリ６１からプログラムを読出して実行する中央処理装置である。ＣＰＵ６２は、メモリコントローラを有するチップセットを含む。
【００５２】
ＬＡＮインタフェース６３は、情報処理装置１をＬＡＮ経由で他の情報処理装置に接続するためのインタフェースである。ＨＤＤ６４は、プログラムやデータを格納するディスク装置である。ソースファイル２及びコードファイル４は、ＨＤＤ６４に記憶される。
【００５３】
スーパーＩＯ６５は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。ＤＶＩ６６は、液晶表示装置を接続するインタフェースであり、ＯＤＤ６７は、ＤＶＤの読み書きを行う装置である。
【００５４】
ＬＡＮインタフェース６３は、ＰＣＩエクスプレス（ＰＣＩｅ）によりＣＰＵ６２に接続され、ＨＤＤ６４及びＯＤＤ６７は、ＳＡＴＡ（Serial  Advanced  Technology  Attachment）によりＣＰＵ６２に接続される。スーパーＩＯ６５は、ＬＰＣ（Low  Pin  Count）によりＣＰＵ６２に接続される。
【００５５】
そして、情報処理装置１において実行されるコンパイラ及びパッチプログラムは、ＤＶＤに記憶され、ＯＤＤ６７によってＤＶＤから読出されて情報処理装置１にインストールされる。あるいは、コンパイラ及びパッチプログラムは、ＬＡＮインタフェース６３を介して接続された他の情報処理装置のデータベースなどに記憶され、これらのデータベースから読出されて情報処理装置１にインストールされる。そして、インストールされたコンパイラ及びパッチプログラムは、ＨＤＤ６４に記憶され、メインメモリ６１に読み出されてＣＰＵ６２によって実行される。
【００５６】
また、実施例では、コンパイル部３とパッチ適用部７が同じ情報処理装置１で動作する場合について説明したが、本発明はこれに限定されるものではなく、コンパイル部３とパッチ適用部７が別の情報処理装置で動作する場合にも同様に適用することができる。すなわち、本発明は、コンパイル部が別の情報処理装置で実行されるコードをクロスコンパイルにより生成する場合にも同様に適用することができる。
【００５７】
また、実施例では、コードがＣＰＵで実行される場合について説明したが、本発明はこれに限定されるものではなく、コードがＭＰＵ（Micro  Processing  Unit）等の他の演算処理装置で実行される場合にも同様に適用することができる。
【符号の説明】
【００５８】
１    情報処理装置
２    ソースファイル
３    コンパイル部
４    コードファイル
５    コード読込部
６    コード記憶部
７    パッチ適用部
１１    予約領域
１２    被パッチ個所
１３    パッチ本体
１４    相対ショート分岐命令
１５    スレッドスケジューラ
３１    字句解析部
３２    構文解析部
３３    意味解析部
３４    中間コード生成部
３５    コード変換部
３６    生成部
３７    分割部
６１    メインメモリ
６２    ＣＰＵ
６３    ＬＡＮインタフェース
６４    ＨＤＤ
６５    スーパーＩＯ
６６    ＤＶＩ
６７    ＯＤＤ
【図１】
0006668638.tif 000002
【図２】
0006668638.tif 000003
【図３】
0006668638.tif 000004
【図４】
0006668638.tif 000005
【図５】
0006668638.tif 000006
【図６】
0006668638.tif 000007
【図７】
0006668638.tif 000008
【図８】
0006668638.tif 000009
【図９】
0006668638.tif 000010
【図１０】
0006668638.tif 000011