(57)【要約】【課題】メモリ上の制御情報が改変されたときに、改変された情報を修復する方法および改変された情報の修復が可能な装置を提供する。【解決手段】記憶部は、第１のタスクに係る第１の情報および第２のタスクに係る第２の情報を格納する第１のメモリ領域を含む。記録部は、タスク処理部の処理対象が第２のタスクから他のタスクに変更されるときに第２の情報を第１のメモリ領域に格納し、第２の情報を第２のメモリ領域にも格納する。比較部は、第２のタスクをタスク処理部の処理対象とするときに、第１のメモリ領域に格納されている第２の情報と第２のメモリ領域に格納されている第２の情報を比較する。データ修復部は、比較の結果、不一致が検出されると、第２のメモリ領域に格納されている第２の情報を第３のメモリ領域に複写し、タスク処理部のアクセス先として第３のメモリ領域を指定する。【選択図】図４
2010224908.tif 000002
【特許請求の範囲】
【請求項１】
第１のタスクに係る第１の情報および第２のタスクに係る第２の情報を格納する第１のメモリ領域を含む記憶部と、
タスク処理部の処理対象が前記第２のタスクから他のタスクに変更されるときに前記第２の情報を前記第１のメモリ領域に格納し、前記第２の情報を第２のメモリ領域にも格納する記録部と、
前記第２のタスクを前記タスク処理部の処理対象とするときに、前記第１のメモリ領域に格納されている第２の情報と前記第２のメモリ領域に格納されている第２の情報を比較する比較部と、
前記比較の結果、不一致が検出されると、前記第２のメモリ領域に格納されている前記第２の情報を第３のメモリ領域に複写し、前記タスク処理部のアクセス先として前記第３のメモリ領域を指定するデータ修復部を備える
ことを特徴とする情報処理装置。
【請求項２】
前記データ修復部は、前記第２の情報の格納領域のアドレスを前記第１のメモリ領域のアドレスから前記第３のメモリ領域のアドレスに変更する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記データ修復部は、前記第２の情報が格納される領域として前記タスク処理部がアクセスする領域を、前記第１のメモリ領域から前記第３のメモリ領域に変更することにより、前記第１のメモリ領域のうちの前記第２の情報が格納されていた領域を開放する
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記第２の情報は前記タスク処理部が前記第２のタスクを処理する際に用いるレジスタ情報であり、
前記比較部は、前記第１および第２のメモリ領域に記録された前記レジスタ情報が一致するかを確認し、
前記データ修復部は、前記第１および第２のメモリ領域に記録された前記レジスタ情報が一致しないとき、前記第２のメモリ領域に記録されたレジスタ情報を前記第３のメモリ領域に複写して、前記第３のメモリ領域に記録されたレジスタ情報を前記タスク処理部が用いるレジスタに記録する
ことを特徴とする請求項２に記載の情報処理装置。
【請求項５】
コンピュータを
第１のタスクに係る第１の情報および第２のタスクに係る第２の情報を格納する第１のメモリ領域に、タスク処理部の処理対象が前記第２のタスクから他のタスクに変更されるときに前記第２の情報を格納し、前記第２の情報を第２のメモリ領域にも格納する記録手段、
前記第２のタスクを前記タスク処理部の処理対象とするときに、前記第１のメモリ領域に格納されている第２の情報と前記第２のメモリ領域に格納されている第２の情報を比較する比較手段、
前記比較の結果、不一致が検出されると、前記第２のメモリ領域に格納されている前記第２の情報を第３のメモリ領域に複写し、前記タスク処理部のアクセス先として前記第３のメモリ領域を指定するデータ修復手段
として機能させることを特徴とするデータ修復プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ上で制御情報が改変されたときにオペレーティングシステムで行われるデータの修復処理に関わり、例えば、リアルタイム・オペレーティング・システム（リアルタイムＯＳ）に適用可能な技術である。
【背景技術】
【０００２】
オペレーティングシステム（ＯＳ）上でアプリケーションが動作するシステムにおいて、プログラムの不具合や悪意あるプログラムの実行などにより、メモリ上に格納されている制御情報が破壊されることや改変されることがある。メモリに格納される制御情報には、例えば、プロセッサの処理に用いられるスタックポインタ値やリターンポインタ値などのスタック領域上に格納される情報も含まれ、これらの情報が改変されるとシステムの暴走などを引き起こす恐れがある。このため、スタック領域に格納されている情報が改変されても、改変された情報を修復できるシステムが求められる。また、スタック領域に限らず、メモリ上の制御情報が改変された場合でも、制御情報が改変される前の情報に修復できることが望ましい。
【０００３】
関連する技術として、プログラムの実行によりリターンアドレスが書き換えられた場合にエラー出力をし、エラー出力によって改ざんを検知すると、予め保存された値で改ざんされたリターンアドレスを書き直す方法が知られている（特許文献１）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】再公表特許  ＷＯ２００５／０２４６３０号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
メモリ上の制御情報が改変されると、前述のとおり、システムの暴走などの予期しない動作が発生する恐れがある。上述した関連技術では、データの改変が検出されると、改変されたデータに予め保存された値を上書きすることにより改変部分のデータが修正される。しかし、例えば、タスクＡのオーバーフローによりタスクＢの制御情報が改変された場合には、タスクＢについて保存されていた値を上書きすることによってオーバーフローした領域に記録されていたタスクＡに関する情報を破壊してしまうことがある。つまり、関連技術として知られている方法では、改変された制御情報を修復するときに他の制御情報を書き換えることにより、システムを誤動作させる恐れがある。そこで、システムの誤動作を起こす可能性が低い修復方法が求められる。
【０００６】
本発明は、メモリ上の制御情報が改変されたときに、改変された情報を修復する方法や改変された情報の修復が可能な装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の１つの態様によると、第１のタスクに係る第１の情報および第２のタスクに係る第２の情報を格納する第１のメモリ領域を含む記憶部と、タスク処理部の処理対象が前記第２のタスクから他のタスクに変更されるときに前記第２の情報を前記第１のメモリ領域に格納し、前記第２の情報を第２のメモリ領域にも格納する記録部と、前記第２のタスクを前記タスク処理部の処理対象とするときに、前記第１のメモリ領域に格納されている第２の情報と前記第２のメモリ領域に格納されている第２の情報を比較する比較部と、前記比較の結果、不一致が検出されると、前記第２のメモリ領域に格納されている前記第２の情報を第３のメモリ領域に複写し、前記タスク処理部のアクセス先として前記第３のメモリ領域を指定するデータ修復部を備える情報処理装置が提供される。
【発明の効果】
【０００８】
メモリ上の制御情報が改変されても、改変された制御情報を修復することができる。
【図面の簡単な説明】
【０００９】
【図１】実施形態に係る情報処理システムの構成の一例を説明する図である。
【図２】実施形態（１）に係る修復方法を説明するフローチャートである。
【図３】実施形態（２）に係る修復方法を説明する図である。
【図４】実施形態（２）の修復方法で用いられるデータの格納方法の一例を示した図である。
【図５】ディスパッチの際にデータの改変を修復する場合の例を説明するフローチャートである。
【図６】データの修復方法の一例を説明するフローチャートである。
【図７】スタック情報を保持するスタック情報テーブルの一例である。
【図８】実施形態（３）で割り込みハンドラが行う動作を説明するフローチャートである。
【発明を実施するための形態】
【００１０】
図１は、実施形態に係る情報処理システムの構成の一例を説明する図である。図１に示すシステムでは、プロセッサ１、入力部２、モニタ３、及びメモリ４がバス５で接続されている。
【００１１】
プロセッサ１は、例えば、メモリ４に格納されたＯＳ等を実行することにより、後述するタスク処理部、記録部、比較部、データ修復部、ディスパッチャ、割り込みハンドラなどとしての処理を行う。プロセッサ１は、プロセッサ１の処理に用いる情報を格納する内蔵メモリ（図示せず）を備え、その内蔵メモリに例えば、タスクの処理に用いるスタック情報などを格納することができる。スタック情報には、プログラムカウンタ（ＰＣ）、スタックポインタ（ＰＳ）、リターンポインタ（ＲＰ）、汎用レジスタに格納されている値などが例として挙げられる。内蔵メモリはプロセッサ１に内蔵されているため、プロセッサ１は、メモリ４に記憶されている情報へのアクセスにかかる時間よりも短時間で、内蔵メモリに格納されている情報へアクセスできる。ここで、内蔵メモリに格納される情報は、スタック情報に限られず、実装に応じて、その他の任意の情報とすることができる。なお、プロセッサ１は、組み込みシステムに用いられるマイクロコンピュータのプロセッサとすることができ、また、パーソナルコンピュータに搭載されるＣＰＵ（Central Processing Unit）などの任意のプロセッサとすることもできる。
【００１２】
入力部２は、データの入力に用いられ、キーボード、マウスなど、任意の入力デバイスとすることができる。モニタ３は、入力部２から入力される情報や、プロセッサ１からの出力結果などを視覚化する際に用いられ、任意の表示装置を用いることができる。
【００１３】
メモリ４は、プロセッサ１がアクセスできるメモリ領域であり、プロセッサ１の処理対象となるプログラムなどを格納する。また、メモリ４には、ＯＳやアプリケーションで指定される処理に用いるデータも格納され、例えば、スタック情報を記録することもできる。プロセッサ１がマイクロコンピュータである場合には、メモリ４を、マイクロコンピュータのメモリとすることができるが、ＯＳを用いる他の任意のシステムで用いられるメモリとすることもできる。
【００１４】
図２は、実施形態（１）に係る修復方法を説明するフローチャートである。図２では、タスクがディスパッチされるときと、タスクの割り込みが行われるときについて、改変された制御情報を修復する方法が記載されている。ここでは、改変されている制御情報は、スタック領域に格納されているスタック情報であるとする。また、複数のタスクの区別を容易にするために、実施形態（１）では、ディスパッチや割り込み処理が行われるときにプロセッサ１が処理対象としているタスクを「第１のタスク」（タスク１）とする。一方、第１のタスクからディスパッチもしくは割り込みによって新たに処理対象にされるタスクを「第２のタスク」（タスク２）とする。さらに、以下の説明では、第１のタスクや第２のタスクなどのタスクは、プロセッサ１によって実現されるタスク処理部が、各々のタスクの設定に応じて、処理しているものとする。
【００１５】
タスク処理部が第１のタスクを処理しているときに、ディスパッチが発生してディスパッチャが呼ばれると、ディスパッチャは、第１のタスクの処理に用いる情報をスタック領域に格納するなど、第１のタスクの退避処理を行う（ステップＳ１）。また、ディスパッチャは、第１のタスクの処理に用いる情報をバッファリングする（ステップＳ２）。ここで、第１のタスクの処理に用いる情報を、システム時刻等と関連づけてバッファリングすることもできる。なお、以下では、スタック領域に格納される情報を「スタック情報」と呼ぶことがある。
【００１６】
次に、比較部は、タスク処理の中断の前後でスタック情報の改変がないかをチェックする（ステップＳ５）。ここで、ディスパッチによりタスク処理部の処理対象となる第２のタスクについて、その第２のタスクが中断されていた間にスタック情報が改変されているかがチェックされる。タスク処理部が第２のタスクを実行したことがある場合には、第２のタスクから他のタスクに処理対象が変更されるときに第２のタスクの処理に用いる情報がスタック領域に記録されると共に、メモリ４にもバッファリングされている。そこで、比較部は、第２のタスクのスタック情報について、スタック領域上の情報と、退避処理後にメモリ４にバッファリングされた情報を比較する。スタック情報の比較については、後で詳しく述べる。
【００１７】
ステップＳ５において両者が不一致であることが検出された場合は、第２のタスクが退避されてから、ステップＳ１の処理で復帰されるまでの間にスタック領域上のスタック情報が改変されたことになる。そこで、データ修復部は、バッファリングされている第２のタスクについてのスタック情報をスタック領域にコピーし、第２のタスクのタスクコントロールブロック中のスタック情報に関する設定を変更する（ステップＳ６）。その後、ディスパッチャは、ステップＳ６で行われた設定に従って改変されていない第２のタスクのスタック情報を読み込んでディスパッチする。
【００１８】
また、割り込みが発生した場合にも、同様の処理が可能である。割り込みが発生して割り込みハンドラが起動されると、割り込みハンドラは、第１のタスクの処理に用いるスタック情報をバッファリングする（ステップＳ３、４）。割り込みによる第２のタスクの処理が終わると、第１のタスクについて、割り込み処理の前後でスタック情報の改変が起こっていないかが確認され、適宜、改変されたスタック情報が修復される（ステップＳ５、６）。すなわち、割り込みハンドラがバッファリングした情報と、スタック領域上の第１のタスクのスタック情報が一致しないときには、バッファリングされた情報を第１のタスクのスタック情報とする。
【００１９】
このように、ディスパッチや割り込み処理においてレジスタ情報の改変の有無をモニタして、いつのどのディスパッチ（もしくは割り込み）によってスタック破壊が生じたかを正確に解析した上で、破壊された情報を修復することができる。
【００２０】
図３は、実施形態（２）に係る修復方法を説明する図である。また、図４は、実施形態（２）の修復方法で用いられるデータの格納方法の一例を示した図である。図３、図４では、説明のために、内蔵メモリのうちのスタック情報が格納されている領域をスタック領域４０としてプロセッサ１から分けて図示する。スタック領域４０は内蔵メモリに設けられているため、前述のとおり、プロセッサ１は、スタック領域４０に格納されている情報に短時間でアクセスできる。しかし、内蔵メモリはメモリ４に比べて容量が小さいため、スタック領域４０の大きさや各タスクに割り当てられる領域も限られており、あるタスクについてスタックオーバーフローが発生すると、他のタスクのスタック情報が改変されることがある。さらに、スタック領域４０の情報は、悪意のプログラム等による改変や破壊の対象とされやすい。従って、スタック領域４０ではデータの改変が起こる可能性がある。一方、メモリ４は、スタック領域４０に比べてデータのオーバーフローが起こる可能性や、悪意のプログラム等による攻撃を受ける可能性が低いため、メモリ４にバッファリングされたデータが改変される可能性は低いといえる。
【００２１】
ここでは、図３、図４を参照しながら、第１のタスクの処理中にスタックオーバーフローが発生して、第２のタスクのスタック領域上の情報が破壊された場合に行われる修復処理の例について述べる。以下の例では、タスク処理部の処理対象が、第２のタスクから第１のタスクにディスパッチされた後、第１のタスクから第２のタスクに再びディスパッチされるものとする。また、メモリ４に記録もしくはバッファリングされた情報は改変されないものとする。つまり、メモリ４にバッファリングされた第２のタスクのスタック情報は、第１のタスクへのディスパッチや第１のタスクの処理によっても改変されないので、ディスパッチ前のスタック情報と同じ値となる。従って、メモリ４にバッファリングされている第２のタスクのスタック情報は、第２のタスクのディスパッチ前のスタック情報ということができる。
【００２２】
なお、以下の説明では、ディスパッチまたは割込みに際してプロセッサ１からスタック領域に退避される情報は、レジスタ情報であるものとする。
（１）第２のタスクから第１のタスクにディスパッチされるとき、ディスパッチャは、第２のタスクの処理に用いられている情報（レジスタ情報２）を、スタック領域４０に格納すると共に、メモリ４にもバッファリングする。図３および図４では、スタック領域４０に格納される情報をスタック２ａ、メモリ４にバッファリングされる情報をスタック２ｂとする。このように、レジスタ情報２が、スタック２ａおよびスタック２ｂとして保持されるため、この時点でスタック２ａおよびスタック２ｂは互いに同じである。なお、スタック２ａが格納される領域は、スタック領域４０のうち、予めタスク２で指定されている領域である。
【００２３】
（２）ディスパッチャは、第１のタスクの復帰処理を行う。この復帰処理では、スタック領域４０に格納されている第１のタスクのスタック情報（スタック１ａ）に改変が加えられているかを、比較部が確認する。この確認方法については後で詳しく述べるが、ここでは、スタック１ａは改変されていなかったとする。すると、スタック領域４０上のスタック１ａを用いてタスク処理部が第１のタスクを処理しても問題は発生しない。そこで、ディスパッチャは、タスク処理部が短時間でアクセスできるスタック領域４０の情報を用いて、第２のタスクから第１のタスクへディスパッチを実行する。
【００２４】
（３）タスク処理部がスタック１ａを使用して第１のタスクを処理した結果、スタック領域４０でオーバーフローが発生したとする。この例では、オーバーフローによりスタック２ａの一部（図４の４１）のデータが上書きされて、図４に示すようにスタック２ａが破壊される。
【００２５】
（４）第１のタスクを中断してタスク処理部の処理対象が第２のタスクに戻るとき、ディスパッチャは、第１のタスクを退避させる。このとき、ディスパッチャは、手順（３）での処理後のレジスタ情報１をスタック領域４０（スタック１ａ）とメモリ４（スタック１ｂ）にそれぞれ保存する。
次に、第２のタスクを実行するためにスタック領域４０上のスタック情報を使用できるかを確認するために、比較部は、スタック領域４０のスタック２ａと、メモリ４にバッファリングされているスタック２ｂとを比較する。図４に示すように、スタック２ａは改変されているので、比較部は、この時点でスタック２ａおよびスタック２ｂが互いに一致していないことを検出する。
【００２６】
（５）スタック２ａおよびスタック２ｂが互いに一致しないことが検出されると、第２のタスクの処理に用いるスタック情報が修復される。データ修復部は、スタック２ｂをスタック領域４０の空き領域にコピーする（図４のスタック２ｃ）。前述のとおり、メモリ４では情報が改変されていないため、スタック２ｂは、第２のタスクが退避されたときのレジスタ情報２と同じである。従って、スタック２ｂをコピーすることにより得られるスタック２ｃは、改変されていないレジスタ情報２である。
【００２７】
（６）さらに、データ修復部は、第２のタスクのスタック情報を格納する領域として、スタック２ｃの格納領域を指定する。このアクセスアドレス変更では、例えば、図４に示すように、第２のタスクのタスクコントロールブロック（ＴＣＢ）で設定されているスタック領域の先頭位置のアドレスを書き換えることができる。スタック情報の修復とスタック領域の設定変更が終わると、ディスパッチャは、修復後のスタック情報を用いて、第１のタスクから第２のタスクにディスパッチを実行する。
【００２８】
（７）メモリ４からのコピーにより得られたスタック２ｃを利用して第２のタスクの復帰が行われる。すなわち、タスク処理部は、改変されていないスタック情報を用いて第２のタスクを処理する。また、第２のタスクを中断して他のタスクが実行される場合には、第２のタスクについてのレジスタ情報２は、スタック領域４０のスタック２ｃの領域に記録され、メモリ４にもバッファリングされる。
【００２９】
このような手順により、他のタスクの実行によるオーバーフローなどが原因でスタック情報が破壊された場合においても、スタック情報が破壊される前の情報に修復することができる。このため、改変されたスタック情報に基づいてタスクを実行することに起因するシステムの暴走も回避できる。本実施形態は、例えば、マルチタスクＯＳ、マルチタスクＯＳを用いた組込みシステムなどに適用することができる。
【００３０】
本実施形態に係るデータ修復装置やデータ修復方法では、改変されたスタック情報が改変前のスタック情報へと自律的に修復されるため、ＯＳなどの動作を停止させずにスタック情報を修復できる。従って、本実施形態は、動作を一時的にでも停止させることが望ましくないシステムに適用することができ、例えば、人工衛星や工場の生産ラインのＦＡシステム（factory automation system）などで用いられるＯＳ、組み込みシステムなどに適用できる。
【００３１】
さらに、本実施形態に係る装置では、オーバーフローでスタック情報が破壊された第２のタスクについては、スタック領域４０の別の領域（スタック２ｃが書き込まれる領域）にスタック情報を修復させるため、スタック情報の書き換えによる誤動作は発生しない。
【００３２】
また、本実施形態では手順（６）、（７）で説明したように、バッファリングしてあった改変前のスタック情報をコピーした領域（スタック２ｃが書き込まれる領域）を、スタック情報の修復後に第２のタスクのスタック情報を格納する領域とする。このため、スタック２ａが格納されていた領域は、スタック情報の修復とともに手順（６）の処理によって開放され、他のタスクが使用できる空き領域になる。従って、図４に示したケースでは、第１のタスクのためのスタックがオーバーフローしているデータ部分（４１）が、第２のタスクで用いられるスタック情報の修復によって発生した空き領域に格納されることになり、第１のタスクのスタック情報も変更されずに保存される。言い換えると、本実施形態では、各タスクについて確保されているスタック領域が小さすぎる場合でも、スタック破壊の修復により、各タスクの実行に十分なスタック領域の設定がＯＳなどによって自律的に行われるといえる。
【００３３】
図３と図４を参照しながら、記録部などがディスパッチャに含まれていない場合について述べたが、記録部、比較部、データ修復部の１つ以上をディスパッチャに含めることもできる。さらに、比較部は、ディスパッチャに読み込まれたスタック領域４０上のスタック２ａなどのデータをメモリ４にバッファリングした上で、メモリ４上にバッファリングしておいたデータと比較して差分を検出するように変形することもできる。また、上記の実施形態では、レジスタ情報が改変された場合について述べたが、改変される情報は、レジスタ情報に限られず、タスクの実行に係る任意の情報とすることができる。
【００３４】
図５は、ディスパッチの際にデータの改変を修復する場合の例を説明するフローチャートである。図５を参照しながら、記録部、比較部、データ修復部がディスパッチャに含まれている実施形態について述べる。また、ここでは、ディスパッチャが復帰させるタスクのレジスタ情報をメモリ４にバッファリングし、比較部が、メモリ４にバッファリングされたデータを用いてレジスタ情報が改変されているかを確認する場合について述べる。
【００３５】
第１のタスクからＯＳのシステムコールが呼び出されると、ディスパッチ処理が発生し、ディスパッチャが処理を開始する（ステップＳ１１）。ディスパッチャは、第１のタスクの実行に用いられたレジスタ情報をスタック１ａとして退避させ、さらに、スタック１ｂとしてバッファリングする（ステップＳ１２、１３）。
【００３６】
次に、スタック領域４０に格納されているレジスタ情報が改変されているかを確認するために、スタック領域４０に格納されている第２のタスクのレジスタ情報（スタック２ａ）をメモリ４にバッファリングする（ステップＳ１４）。比較部は、スタック領域４０からバッファリングされたスタック２ａと、第２のタスクの退避の際にバッファリングされていたスタック２ｂとを比較し、差分があるかを確認する。差分が検出された場合はデータ修復部が修復する（ステップＳ１５）。
【００３７】
図６は、データの修復方法の一例を説明するフローチャートである。図６を参照しながら、ステップＳ１５の処理を詳しく説明する。比較部は、第２のタスクを退避させたときにバッファリングしたレジスタ情報と、スタック領域４０に格納されているレジスタ情報を取得し、両者に差分があるかを確認する（ステップＳ２１、２２）。両者が一致しない場合には、スタック領域４０に空きメモリ領域を獲得し、第２のタスクの退避の際にバッファリングしておいたレジスタ情報をコピーする（ステップＳ２３、２４）。その後、第２のタスクのタスクコントロールブロックの設定を変更し、スタック領域の先頭アドレスを、ステップＳ２３で獲得した領域の先頭アドレスにする（ステップＳ２５）。一方、ステップＳ２２で、レジスタ情報が改変されていないことが確認されると修復処理を行わずに終了する。
このような処理を行うことにより、スタック領域上の情報が改変されても改変前の正しい情報を用いて第２のタスクを処理できる。
【００３８】
図３〜図６を参照しながら、ディスパッチの際に行われるスタック情報の修復について述べたが、割り込み処理の際にも同様に情報の修復ができる。また、記録部、比較部、データ修復部の１つ以上を割り込みハンドラに含めることもできる。割り込み処理の際に行われるスタック情報の修復でも、比較部は、メモリ４上にバッファリングされたスタック情報を比較することによって差分を検出することができ、また、バッファリングされたスタック情報をテーブルに保持することもできる。図７は、メモリ４にバッファリングされたスタック情報を保持するスタック情報テーブルの例である。「（ＬＥＡＶＥ）」で表されている値は、タスクの退避に際して保存されたスタック情報であり、「（ＥＮＴＥＲ）」で表されている値は、タスクの復帰に際して読み出されたスタック情報である。
【００３９】
実施形態（３）として、第１のタスクの処理中に第２のタスクが割り込む場合に割り込みハンドラが行う動作について、図７を参照しながら説明する。ここでは割り込みハンドラには、記録部、比較部、データ修復部が含まれるものとし、スタック領域４０上に格納されたレジスタ情報が改変された場合について述べる。
【００４０】
（１）割り込みハンドラは、第１のタスクの処理中に第２のタスクの割り込み処理を実行するために、第１のタスクのレジスタ情報をバッファリングする。このバッファリングでは、レジスタ情報は、スタック情報テーブルに記録される。また、第１のタスクのタスクＩＤを「１」として、プログラムカウンタ、スタックポインタ、リターンポインタの３種類のレジスタ情報についての退避値（ＬＥＡＶＥ）が、図７に示すとおりに記録されたとする。
【００４１】
（２）タスク処理部に第２のタスクを実行させるために、割り込みハンドラは、第２のタスクの復帰処理をする。
（３）タスク処理部が第２のタスクを実行する。ここでは、第２のタスクの実行によってスタックオーバーフローが発生し、スタック領域４０中で、第１のタスクのスタック情報が改変されたとする。
【００４２】
（４）第２のタスクの実行が終わると、割り込みハンドラは、第２のタスクの退避処理をする。
（５）割り込みハンドラは、スタック領域４０に格納されている第１のタスクのスタック情報をメモリ４にバッファリングして、スタック情報テーブルに格納する。ここでは、タスクＩＤ「１」のタスクのプログラムカウンタ、スタックポインタ、リターンポインタについての復帰値（ＥＮＴＥＲ）が、図７に示すとおりに記録されたとする。
【００４３】
（６）比較部は、メモリ４のスタック情報テーブルを参照して、タスクＩＤ「１」の退避値（ＬＥＡＶＥ）と復帰値（ＥＮＴＥＲ）を比較し、第１のタスクのスタック情報が改変されているかチェックする。タスクＩＤが「１」のタスクでは、プログラムカウンタ値が一致していないため、比較部は、スタック情報が改変されていることを検出する。
【００４４】
（７）第１のタスクについてスタック情報が改変されているので、データ修復部は、スタック領域４０に空き領域を獲得して、スタック情報テーブルに記録されている退避値（ＬＥＡＶＥ）をコピーする。さらに、第１のタスクのスタック情報を格納する領域を、退避値をコピーした領域に設定し、コピーされた退避値をスタック情報として割り込みハンドラに読み込ませる。これらの処理により、割り込みハンドラは、改変される前のスタック情報を取得した上で、第１のタスクの復帰処理をすることができる。
【００４５】
以上の処理により、割り込みの前後でスタック情報が改変されても、改変前のスタック情報を用いて第１のタスクの処理を継続できる。
【００４６】
図８は、実施形態（３）で割り込みハンドラが行う動作を説明するフローチャートである。なお、図８は、スタック領域にレジスタ情報が格納されているときの例である。
割り込みが発生すると、第１のタスクのレジスタ情報がスタック領域４０に記録される。また、割り込みハンドラが起動されると、割り込みハンドラはメモリ４へ第１のタスク（タスク１）のレジスタ情報をバッファリングする（ステップＳ３１、３２）。
【００４７】
割り込みのタスクの実行が終わると、割り込みハンドラは、割り込みで処理したタスクの退避などの処理を行う（ステップＳ３３）。スタック領域４０に格納されている第１のタスクのレジスタ情報がメモリ４にバッファリングされると、比較部は、ステップＳ３２でバッファリングしてあったレジスタ情報と比較する（ステップＳ３４、３５）。比較の結果、スタック領域４０に格納されているレジスタ情報の改変が検出されると、データ修復部がレジスタ情報を修復する（ステップＳ３５）。ステップＳ３５の処理は、ディスパッチ処理の際の修復について、図６を参照しながら説明した修復方法と同様である。
【００４８】
比較部は、割り込み前後のレジスタ情報に差分があるかを確認し、差分がある場合には、データ修復部が、スタック領域４０に空きメモリ領域を獲得して割り込み処理前のレジスタ情報をコピーする（ステップＳ２１〜２４）。その後、データ修復部は、第１のタスクで用いるスタック領域のアドレスを変更する（ステップＳ２５）。一方、ステップＳ２２で、割り込みの前後でレジスタ情報に変化がないことが確認されると修復処理を行わない。
【００４９】
このような手順により、割り込み処理のために第１のタスクを退避させている間に第１のタスクのスタック情報が破壊された場合においても、スタック情報を修復できる。このため、割り込み処理の際に、スタックのオーバーフローや悪意のあるプログラムによるスタック情報の書き換えなどが起こっても、スタック情報の改変に起因したシステムの暴走などを防止できる。
【００５０】
本実施形態も他の形態と同様に、任意のＯＳに適用できる。また、自律的にデータ修復することが可能であるため、動作を停止させることが望ましくないシステムに適用することができる。また、本実施形態でも、他の実施形態と同様に、スタック情報が改変されたタスクは、改変前のスタック情報をコピーした領域を修復後に使用する領域とするため、改変されたデータが格納されていた領域は、他のタスクなどに開放される。従って、システムの設計時に各タスクについて確保されているスタック領域が小さすぎるなどの問題がある場合でも、スタック破壊に伴うデータ修復を繰り返すことにより、スタック領域の設定がＯＳによって自律的に行われるといえる。
【００５１】
なお、本発明は上記の実施形態に限られるものではなく、様々に変形可能である。以下にその例をいくつか述べる。
以上の説明で、実施形態（１）〜（３）に分けて説明しているのは、理解を助けるためである。従って、例えば、いずれの実施形態においても、スタック情報テーブルを用いて情報の改変を検出することもできる。
【００５２】
以上の実施形態では、改変される情報をスタック情報として説明したが、実施形態（１）〜（３）に係るデータ修復を適用することができる情報は、スタック領域に格納されている情報に限られない。実装に応じてヒープ領域など他の任意のメモリ領域に格納される情報に適用することができる。また、上記の実施形態では、レジスタ情報が改変された場合について述べたが、改変される情報は、レジスタ情報に限られない。すなわち、実施形態（１）〜（３）のいずれにおいても、データ修復の対象は、タスクに係わる任意の情報とすることができる。
【００５３】
また、いずれの実施形態でも、スタック情報などの情報の一部をデータ修復の対象とすることもできる。例えば、プログラムカウンタ値についての改変をモニタして、改変が起こったときにデータ修復をすることもできる。いずれの実施形態においても、実装に応じて、スタック情報などの情報を、システム時刻などの他の任意の情報とともにバッファリングすることもできる。
【００５４】
実施形態（３）では、スタック情報テーブルがメモリ４にある場合について述べたが、実装に応じて、スタック領域４０に格納することもできる。この場合には、比較部での比較や差分検出が早くなる。
【００５５】
いずれの実施形態でも、比較部やデータ修復部での処理が終わった後に、ディスパッチャなどが、スタック情報を取得する場合について述べたが、スタック情報の取得は、差分検出の前にすることもできる。この場合には、比較部やデータ修復部での処理によってデータが修復された後で、ディスパッチャなどが再度スタック情報を読み込んで、ディスパッチャが読み込んでいる情報に、改変される前のスタック情報（スタック２ｃ）を上書きする。
【００５６】
情報の改変の検出と情報の修復は、ソフトウェアによる処理によって行うことができ、また、その一部をハードウェアによる処理に変更することもできる。ソフトウェアを用いる場合は、プロセッサ１を動作させるためのソフトウェアは、メモリ４に記録することができ、また、記憶媒体に記録されているソフトウェアを読み込むこともできる。ソフトウェアによって情報の改変の検出と情報の修復が行われる場合は、プロセッサ１、入力部２、モニタ３、メモリ４などを、例えば、コンピュータの一部として実現することもできる。
【００５７】
上述の各実施形態に対し、さらに以下の付記を開示する。
（付記１）
第１のタスクに係る第１の情報および第２のタスクに係る第２の情報を格納する第１のメモリ領域を含む記憶部と、
タスク処理部の処理対象が前記第２のタスクから他のタスクに変更されるときに前記第２の情報を前記第１のメモリ領域に格納し、前記第２の情報を第２のメモリ領域にも格納する記録部と、
前記第２のタスクを前記タスク処理部の処理対象とするときに、前記第１のメモリ領域に格納されている第２の情報と前記第２のメモリ領域に格納されている第２の情報を比較する比較部と、
前記比較の結果、不一致が検出されると、前記第２のメモリ領域に格納されている前記第２の情報を第３のメモリ領域に複写し、前記タスク処理部のアクセス先として前記第３のメモリ領域を指定するデータ修復部を備える
ことを特徴とする情報処理装置。
（付記２）
前記記憶部は、前記第３のメモリ領域を含むことを特徴とする付記１に記載の情報処理装置。
（付記３）
前記データ修復部は、前記第２の情報の格納領域のアドレスを前記第１のメモリ領域のアドレスから前記第３のメモリ領域のアドレスに変更する
ことを特徴とする付記１に記載の情報処理装置。
（付記４）
前記データ修復部は、前記第２の情報が格納される領域として前記タスク処理部がアクセスする領域を、前記第１のメモリ領域から前記第３のメモリ領域に変更することにより、前記第１のメモリ領域のうちの前記第２の情報が格納されていた領域を開放する
ことを特徴とする付記３に記載の情報処理装置。
（付記５）
前記第２の情報は前記タスク処理部が前記第２のタスクを処理する際に用いるレジスタ情報であり、
前記比較部は、前記第１および第２のメモリ領域に記録された前記レジスタ情報が一致するかを確認し、
前記データ修復部は、前記第１および第２のメモリ領域に記録された前記レジスタ情報が一致しないとき、前記第２のメモリ領域に記録されたレジスタ情報を前記第３のメモリ領域に複写して、前記第３のメモリ領域に記録されたレジスタ情報を前記タスク処理部が用いるレジスタに記録する
ことを特徴とする付記３に記載の情報処理装置。
（付記６）
ディスパッチの要求に応じて前記タスク処理部の処理対象が第２のタスクに変更される場合に、前記比較部は、前記第２のメモリ領域に記録された前記レジスタ情報と前記第１のメモリ領域に記録された前記レジスタ情報を比較する
ことを特徴とする付記５に記載の情報処理装置。
（付記７）
前記タスク処理部への割り込み処理が要求されたことにより、前記タスク処理部の処理対象が前記第１のタスクから前記第２のタスクに変更された場合に、前記比較部は、前記第２のメモリ領域に記録された前記レジスタ情報と前記第１のメモリ領域に記録された前記レジスタ情報を比較する
ことを特徴とする付記５に記載の情報処理装置。
（付記８）
コンピュータを
第１のタスクに係る第１の情報および第２のタスクに係る第２の情報を格納する第１のメモリ領域に、タスク処理部の処理対象が前記第２のタスクから他のタスクに変更されるときに前記第２の情報を格納し、前記第２の情報を第２のメモリ領域にも格納する記録手段、
前記第２のタスクを前記タスク処理部の処理対象とするときに、前記第１のメモリ領域に格納されている第２の情報と前記第２のメモリ領域に格納されている第２の情報を比較する比較手段、
前記比較の結果、不一致が検出されると、前記第２のメモリ領域に格納されている前記第２の情報を第３のメモリ領域に複写し、前記タスク処理部のアクセス先として前記第３のメモリ領域を指定するデータ修復手段
として機能させることを特徴とするデータ修復プログラム。
（付記９）
第１のタスクに係わる第１の情報および第２のタスクに係わる第２の情報を格納する第１のメモリ領域に、タスク処理部の処理対象が前記第２のタスクから他のタスクに変更されるときに前記第２の情報を格納し、前記第２の情報を第２のメモリ領域にも格納し、
前記第２のタスクを前記タスク処理部の処理対象とするときに、前記第１のメモリ領域に格納されている第２の情報と前記第２のメモリ領域に格納されている第２の情報を比較し、
前記比較の結果、不一致が検出されると、前記第２のメモリ領域に格納されている前記第２の情報を第３のメモリ領域に複写し、
前記タスク処理部のアクセス先として、前記第３のメモリ領域を指定する
ことを特徴とするデータ修復方法。
【符号の説明】
【００５８】
１  プロセッサ
２  入力部
３  モニタ
４  メモリ
５  バス
４０  スタック領域
４１  データが破壊されたスタック領域
【図１】
2010224908.tif 000003
【図２】
2010224908.tif 000004
【図３】
2010224908.tif 000005
【図５】
2010224908.tif 000006
【図６】
2010224908.tif 000007
【図７】
2010224908.tif 000008
【図８】
2010224908.tif 000009
【図４】
2010224908.tif 000010