JP6905190B2 - 情報処理装置およびスタック破壊検出プログラム - Google Patents

情報処理装置およびスタック破壊検出プログラム Download PDF

Info

Publication number
JP6905190B2
JP6905190B2 JP2017168720A JP2017168720A JP6905190B2 JP 6905190 B2 JP6905190 B2 JP 6905190B2 JP 2017168720 A JP2017168720 A JP 2017168720A JP 2017168720 A JP2017168720 A JP 2017168720A JP 6905190 B2 JP6905190 B2 JP 6905190B2
Authority
JP
Japan
Prior art keywords
error detection
detection code
stack
program
execution
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.)
Active
Application number
JP2017168720A
Other languages
English (en)
Other versions
JP2019046164A (ja
Inventor
能久 森住
能久 森住
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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2017168720A priority Critical patent/JP6905190B2/ja
Priority to US16/111,694 priority patent/US10586039B2/en
Publication of JP2019046164A publication Critical patent/JP2019046164A/ja
Application granted granted Critical
Publication of JP6905190B2 publication Critical patent/JP6905190B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M13/00Coding, decoding or code conversion, for error detection or error correction; Coding theory basic assumptions; Coding bounds; Error probability evaluation methods; Channel models; Simulation or testing of codes
    • H03M13/29Coding, decoding or code conversion, for error detection or error correction; Coding theory basic assumptions; Coding bounds; Error probability evaluation methods; Channel models; Simulation or testing of codes combining two or more codes or code structures, e.g. product codes, generalised product codes, concatenated codes, inner and outer codes
    • H03M13/2906Coding, decoding or code conversion, for error detection or error correction; Coding theory basic assumptions; Coding bounds; Error probability evaluation methods; Channel models; Simulation or testing of codes combining two or more codes or code structures, e.g. product codes, generalised product codes, concatenated codes, inner and outer codes using block codes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/08Error detection or correction by redundancy in data representation, e.g. by using checking codes
    • G06F11/10Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's
    • G06F11/1004Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's to protect a block of data words, e.g. CRC or checksum
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/16Protection against loss of memory contents
    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M13/00Coding, decoding or code conversion, for error detection or error correction; Coding theory basic assumptions; Coding bounds; Error probability evaluation methods; Channel models; Simulation or testing of codes
    • H03M13/03Error detection or forward error correction by redundancy in data representation, i.e. code words containing more digits than the source words
    • H03M13/05Error detection or forward error correction by redundancy in data representation, i.e. code words containing more digits than the source words using block codes, i.e. a predetermined number of check bits joined to a predetermined number of information bits
    • H03M13/09Error detection only, e.g. using cyclic redundancy check [CRC] codes or single parity bit

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Probability & Statistics with Applications (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Quality & Reliability (AREA)
  • Computer Hardware Design (AREA)
  • Memory System (AREA)
  • Detection And Correction Of Errors (AREA)
  • Debugging And Monitoring (AREA)

Description

本発明は情報処理装置およびスタック破壊検出プログラムに関する。
コンピュータなどの情報処理装置によるプログラムの実行のために、メモリ上にスタックと呼ばれる領域が設けられる。スタックの記憶領域は、例えば、プログラムの手続き(例えば、関数)の呼び出し時に手続き毎に割り当てられる。1つの手続きに割り当てられたスタックの部分的な記憶領域は、スタックフレームと呼ばれることがある。スタックフレームには、例えば、手続きの実行に用いられる引数や局所変数などが格納される。
スタックに格納されたデータが他のプログラムやメモリ故障などによって破壊されることがある。スタックに格納されたデータの破壊は、プログラムやプログラムを実行する情報処理装置などの動作異常の要因になる。そこで、スタック領域に記憶したデータの異常を検出することが考えられている。
例えば、スタック領域に記憶するデータのハッシュ値を当該スタック領域に同時に保存しておき、データの異常の検出に用いるコンピュータの提案がある。この提案では、プログラムの実施時、スタック領域内のデータから再計算したハッシュ値と、保存したハッシュ値とを比較して両者が異なるときにスタック領域のデータの異常をユーザに通知する。
また、関数のリターン処理において、スタックのプレヴィアス・フレームポインタと配列との間に格納されたガード変数の有効性を確認することで、スタック上のバッファオーバーフローを原因とするスタックスマッシング攻撃を防止する提案もある。
特開2010−198147号公報 特開2001−216161号公報
情報処理装置では、あるプログラムの実行を中断した後に当該プログラムの実行を再開することがある(例えば、実行対象のプログラムを切り替える場合)。中断されたプログラムの中断時のスタック領域のデータは、再開時まで維持される。しかし、中断から再開までの間に、他のプログラムなどによってスタック領域のデータが破壊されることもある。そこで、再開時にスタック領域の破壊の有無を判定可能にすることが考えられる。
例えば、プログラムの実行中断時に、当該プログラムのスタック領域の全体に対する誤り検出用の符号を、情報処理装置により生成して保存することが考えられる。情報処理装置は、当該プログラムの実行再開時に該当のスタック領域の全体の符号を再生成し、保存した符号と照合することでスタック領域の破壊の有無を判定し得る。しかし、これらの検査用の処理は、プログラムの実行中断や実行再開のときのオーバーヘッドの要因になる。
1つの側面では、本発明は、スタック破壊の検査のための処理量を減らすことを目的とする。
1つの態様では、情報処理装置が提供される。情報処理装置は、記憶部と処理部とを有する。記憶部は、プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第1の誤り検出符号列を記憶する。処理部は、プログラムの実行中断時に、スタック領域のうち、第1の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、プログラムの実行再開時に、記憶部に記憶された第1の誤り検出符号列に差分の誤り検出符号列を反映させた第2の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第3の誤り検出符号列との照合に応じて、スタック破壊を検出する。
1つの側面では、スタック破壊の検査のための処理量を減らすことができる。
第1の実施の形態の情報処理装置を示す図である。 第2の実施の形態のサーバのハードウェア例を示す図である。 プロセッサにおけるレジスタの例を示す図である。 RAMの記憶領域の例を示す図である。 タスク切り替えの例を示す図である。 サーバの機能例を示す図である。 プログラム処理の流れに対するスタック使用量の変化の例を示す図である。 スタック領域の検査対象範囲の例を示す図である。 フレームポインタの例を示す図である。 誤り検出符号保存テーブルの例を示す図である。 スタック破壊の検査例を示すフローチャートである。 差分の誤り検出符号生成の例を示すフローチャートである。 誤り検出符号保存テーブルの更新例(その1)を示す図である。 誤り検出符号保存テーブルの更新例(その2)を示す図である。 誤り検出符号の照合の例を示す図である。 検査対象の範囲の例を示す図である。
以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。情報処理装置1は、プログラムを実行するサーバコンピュータやクライアントコンピュータなどのコンピュータである。情報処理装置1は、あるプログラムの実行を中断し、その後、当該プログラムの実行を再開することがある。例えば、情報処理装置1は、あるプログラムの実行を中断している間に別のプログラムを実行する。情報処理装置1は、プログラムの実行中断時から当該プログラムの実行再開時の間において生じたスタック破壊の有無を検査する機能を提供する。「スタック破壊」は、プログラムに割り当てられたスタックに格納されたデータが他のプログラムやRAMのビット故障などにより改変されることを示す。
情報処理装置1は、記憶部1aおよび処理部1bを有する。記憶部1aは、RAM(Random Access Memory)などの揮発性記憶装置でもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置でもよい。処理部1bは、CPU(Central Processing Unit)やマイクロプロセッサなどのプログラムを実行するプロセッサである。「プロセッサ」には、複数のプロセッサの集合(マルチプロセッサ)が含まれ得る。
記憶部1aは、スタック領域2を有する。スタック領域2は、実行対象のプログラムに対して割り当てられたスタックに相当する記憶領域である。例えば、情報処理装置1では、複数のプログラムが実行される。スタック領域2は、プログラム毎に設けられる。
記憶部1aは、スタック領域に対して生成された誤り検出符号列を記憶する。誤り検出符号列は、1つ以上の誤り検出符号の集合である。誤り検出符号は、スタック領域の所定領域の誤り検出に用いられる符号である。誤り検出符号として、例えば、ハッシュ値や巡回冗長検査(CRC:Cyclic Redundancy Check)値などを用いることができる。
ここで、誤り検出符号は、スタック領域2のうち、使用済の部分領域に対して処理部1bにより生成される。スタック領域2の部分領域は、スタック領域2の一部分である。スタック領域2の部分領域は、プログラムの手続き(例えば、サブルーチン、関数またはメソッドなど)が呼び出されるたびに、手続き毎に割り当てられる。使用済の部分領域は、スタック領域2の一部分であって、ある手続きに割り当て済の領域である。使用済の部分領域は、スタックフレームと呼ばれてもよい。
例えば、時刻T1において、スタック領域2は、使用済の部分領域2a,2b,2cおよび未使用領域2yを有する。なお、「時刻」は、時計が示す時刻を含む、ある程度の幅をもつ時間範囲と考えてもよい。記憶部1aは、時刻T1のスタック領域2に対して生成された第1の誤り検出符号列3を記憶する。第1の誤り検出符号列3は、誤り検出符号C1,C2,C3(図1中、“符号C1”のように略記している)を含む。誤り検出符号C1は、時刻T1の部分領域2aに対して生成された誤り検出符号である。誤り検出符号C2は、時刻T1の部分領域2bに対して生成された誤り検出符号である。誤り検出符号C3は、時刻T1の部分領域2cに対して生成された誤り検出符号である。第1の誤り検出符号列3は、未使用領域2yに対応する誤り検出符号を含まない(未使用領域2yに対して誤り検出符号は生成されない)。検査用に保存しておく誤り検出符号列は、プログラムの実行中断時に生成される。
例えば、時刻T1は、スタック領域2を用いるプログラムが実行中断された時刻である。この場合、第1の誤り検出符号列3は、(後述する時刻T2に対して)プログラムの前回の実行中断時にスタック領域2の使用済の部分領域に対して取得された誤り検出符号列であるといえる。そして、時刻T1の後、後述する時刻T2の前に、スタック領域2を用いるプログラムは実行再開されたことになる。ただし、時刻T1は、実行中断時以外のタイミングでもよい。例えば、時刻T1は、該当のプログラムが最初に実行開始されたタイミングでもよい。すなわち、処理部1bは、該当のプログラムを最初に実行開始したタイミングで、第1の誤り検出符号列3を取得して記憶部1aに格納しておいてもよい。
処理部1bは、プログラムの実行中断時から実行再開時の間において生じたスタック破壊の有無を検査する。具体的には、まず、処理部1bは、プログラムの実行中断時に、スタック領域2のうち、第1の誤り検出符号列3の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成する。
例えば、時刻T2において、スタック領域2を用いるプログラムの実行が中断される場合を考える。時刻T2は、時刻T1で中断されたプログラムの実行が再開された時刻よりも後の時刻である。
時刻T2において、スタック領域2は、使用済の部分領域2a,2b,2c,2dおよび未使用領域2zを有する。処理部1bは、時刻T2のスタック領域2に対して差分の誤り検出符号列4を生成し、記憶部1aに格納する。差分の誤り検出符号列4は、第1の誤り検出符号列3の取得時(時刻T1)での使用済の部分領域2a,2b,2c、および、当該プログラムの今回の実行中断時(時刻T2)での使用済の部分領域2a,2b,2c,2dの差分に対して生成される。なお、処理部1bは、時刻T1で該当のプログラムが実行中断されたとすると、当該プログラムの時刻T1後、時刻T2前の実行再開時にも第1の誤り検出符号列3を用いたスタック破壊の検査を行える(スタック破壊が検出されなかったので、プログラムは正常に実行再開されたことになる)。この場合、当該部分領域の差分は、前回の検査時に対する差分であるともいえる。
例えば、部分領域2dは、時刻T1では未使用領域2yの一部であった領域であり、時刻T1での使用済の部分領域2a,2b,2c、および、時刻T2での使用済の部分領域2a,2b,2c,2dの差分に相当する。また、時刻T2の部分領域2cに格納されているデータは、時刻T1の部分領域2cに格納されているデータとは異なっている。したがって、時刻T2の部分領域2cは、時刻T1での使用済の部分領域2a,2b,2c、および、時刻T2での使用済の部分領域2a,2b,2c,2dの差分に相当する。一方、時刻T1での使用済の部分領域2a,2bと時刻T2での使用済の部分領域2a,2bとは格納されているデータが同じである。したがって、時刻T2の部分領域2a,2bは、時刻T1での使用済の部分領域2a,2b,2c、および、時刻T2での使用済の部分領域2a,2b,2c,2dの差分に相当しない。
なお、処理部1bは、時刻T1,T2の間の部分領域毎のデータの相違を、例えば、時刻T1における誤り検出符号と時刻T2における誤り検出符号が異なるか否かにより判定することができる。時刻T2で生成した誤り検出符号と時刻T1における誤り検出符号との相違は、データの相違を意味する。時刻T2で生成した誤り検出符号と時刻T1における誤り検出符号との一致は、データの一致を意味する。
この場合、記憶部1aのアドレスに対するスタックの使用済領域の成長方向およびLIFO(Last In / First Out)の特性により、処理部1bは、全ての部分領域に対して誤り検出符号を生成しなくても、時刻T1,T2の間の部分領域毎のデータの相違を判定可能である。具体的には、スタックは、割り当てられたアドレス範囲のうち、最大アドレスから最小アドレスに向かって成長する。また、使用済の部分領域は、プログラムに含まれる手続き間の呼出し関係のネスト(入れ子)構造によって、新しい方から順に解放される。ここで、スタック領域2のうち、使用済領域の先頭のアドレスは、スタックポインタと呼ばれるレジスタにより示される。また、例えば、使用済の部分領域の所定位置には、直前の部分領域内の所定のアドレス(例えば、直前の部分領域の先頭アドレス)を示すポインタが含まれる。処理部1bは、これらのポインタに基づいて、記憶部1aにおける各部分領域を特定する。
処理部1bは、時刻T2において、アドレスが小さい方の部分領域から1つずつ順番に誤り検出符号を生成して、時刻T1における誤り検出符号と、部分領域毎に照合する。処理部1bは、時刻T2で生成した誤り検出符号と時刻T1における誤り検出符号とが最初に一致した部分領域のアドレスよりも大きなアドレスが割り当てられた部分領域に関しては、上記スタックの特性により、時刻T1,T2でのデータが一致するとみなせる。
図1の例でいえば、部分領域2a,2b,2c,2dと順にアドレスは小さくなる。この場合、例えば、処理部1bは、部分領域2cに対する誤り検出符号C3aを生成し、誤り検出符号C3と比較する。両者は相違するので、処理部1bは、部分領域2cを差分の部分領域と判断する。次に、処理部1bは、部分領域2bに対する誤り検出符号を生成し、誤り検出符号C2と比較する。両者は一致するので、処理部1bは、部分領域2bを差分の部分領域としない。この場合、処理部1bは、部分領域2aも差分の部分領域としない。処理部1bは、時刻T2において部分領域2aに対する誤り検出符号の生成を省略できる。処理部1bは、部分領域2dに対して誤り検出符号C4を生成する。処理部1bは、誤り検出符号C3a,C4を差分の誤り検出符号列4とする。
なお、上記の例では、誤り検出符号を用いて部分領域の差分を判定する方法を例示したが、他の判定方法も考えられる。例えば、記憶部1aは、更新の有無を示すフラグを部分領域毎に記憶してもよい。フラグは、例えば、前回中断時(または前回再開時)の値を“FALSE”とし、プログラムの実行中に該当の部分領域の更新があると当該プログラムにより“TRUE”に変更される。処理部1bは、記憶部1aに記憶された当該フラグを基に、時刻T2において部分領域の差分を判定してもよい。この場合、処理部1bは、時刻T2において、部分領域2a,2bの両方に対する誤り検出符号の生成を省略できる。
処理部1bは、記憶部1aに記憶された第1の誤り検出符号列3に、差分の誤り検出符号列4を反映させた第2の誤り検出符号列5を取得し、記憶部1aに格納する。処理部1bは、第1の誤り検出符号列3に対して、差分の誤り検出符号列4を適用する(例えば、更新された部分を更新し、追加された部分を追加する)ことで、第2の誤り検出符号列5を得ることができる。
第2の誤り検出符号列5は、誤り検出符号C1,C2,C3a,C4を含む。誤り検出符号C1は、時刻T2(および時刻T1)の部分領域2aに対応する誤り検出符号である。誤り検出符号C2は、時刻T2(および時刻T1)の部分領域2bに対応する誤り検出符号である。誤り検出符号C3aは、時刻T2の部分領域2cに対応する誤り検出符号である。誤り検出符号C4は、時刻T2の部分領域2dに対応する誤り検出符号である。第2の誤り検出符号列5は、未使用領域2zに対応する誤り検出符号を含まない。
処理部1bは、プログラムの実行再開時に、第2の誤り検出符号列5と、実行再開時において使用済の部分領域に対して新たに生成された第3の誤り検出符号列6との照合に応じて、スタック破壊を検出する。
例えば、時刻T3において、時刻T2で中断されたプログラムの実行が再開される場合(実行の再開を試みる場合)を考える。時刻T3は、時刻T2よりも後の時刻である。時刻T3は時刻T2で中断されたプログラムの実行再開の直前ともいえる。
時刻T3において、スタック領域2は、使用済の部分領域2a,2b,2c,2dおよび未使用領域2zを有する。処理部1bは、時刻T3のスタック領域2に対して第3の誤り検出符号列6を生成し、記憶部1aに格納する。第3の誤り検出符号列6は、誤り検出符号C1a,C2a,C3b,C4aを含む。誤り検出符号C1aは、時刻T3の部分領域2aに対して生成された誤り検出符号である。誤り検出符号C2aは、時刻T3の部分領域2bに対して生成された誤り検出符号である。誤り検出符号C3bは、時刻T3の部分領域2cに対して生成された誤り検出符号である。誤り検出符号C4aは、時刻T3の部分領域2dに対して生成された誤り検出符号である。第3の誤り検出符号列6は、未使用領域2zに対応する誤り検出符号を含まない。
処理部1bは、第2の誤り検出符号列5と第3の誤り検出符号列6とを照合する。ここで、処理部1bは、時刻T3よりも前に第2の誤り検出符号列5を取得しておいてもよいし、時刻T3における照合の直前に第2の誤り検出符号列5の取得を行ってもよい。
例えば、処理部1bは、時刻T2(および時刻T1)の部分領域2aに対応する誤り検出符号C1と、時刻T3の部分領域2aに対応する誤り検出符号C1aとを照合する。誤り検出符号C1,C1aは一致するとする。この場合、処理部1bは、部分領域2aにはスタック破壊が発生していないと判断する。
処理部1bは、時刻T2(および時刻T1)の部分領域2bに対応する誤り検出符号C2と、時刻T3の部分領域2bに対応する誤り検出符号C2aとを照合する。誤り検出符号C2,C2aは一致するとする。この場合、処理部1bは、部分領域2bにはスタック破壊が発生していないと判断する。
処理部1bは、時刻T2の部分領域2cに対応する誤り検出符号C3aと、時刻T3の部分領域2cに対応する誤り検出符号C3bとを照合する。誤り検出符号C3a,C3bは異なるとする。この場合、処理部1bは、部分領域2cにスタック破壊が発生していると判断する。
処理部1bは、時刻T2の部分領域2dに対応する誤り検出符号C4と、時刻T3の部分領域2dに対応する誤り検出符号C4aとを照合する。誤り検出符号C4,C4aは一致するとする。この場合、処理部1bは、部分領域2dにはスタック破壊が発生していないと判断する。
上記の例では、処理部1bは、部分領域2cについてスタック破壊を検出したので、スタック破壊が発生した旨をユーザに通知する(プログラムの実行再開を保留する)。処理部1bは、スタック破壊が検出された部分領域2cに関する情報(例えば、アドレスなど)をユーザに通知してもよい。これによって、スタック破壊が生じた状態で、プログラムを再開することで、当該プログラムや情報処理装置1の動作に不具合が生じることを防げる。
なお、処理部1bは、部分領域2a,2b,2c,2dに対してスタック破壊を検出しない場合には、該当のプログラムの実行を再開する。
情報処理装置1によれば、スタック破壊の検査のための処理量を減らすことができる。具体的には、処理部1bは、時刻T3において、スタック領域2のうち、使用済の部分領域2a,2b,2c,2dをスタック破壊の検査対象とし、未使用領域2zをスタック破壊の検査対象としない。このため、スタック領域2の全体に対して誤り検出符号を生成して照合を行うよりも、誤り検出符号の生成や照合のための処理量を減らせる。
特に、処理部1bは、プログラムの実行中断時(時刻T2)に、前回検査対象となった部分領域(誤り検出符号を生成済の部分領域2a,2b,2c)に対する差分の部分領域2c,2dに対して差分の誤り検出符号列4を生成する。そして、処理部1bは、既存の第1の誤り検出符号列3に差分の誤り検出符号列4を反映して第2の誤り検出符号列5を得る。このとき、処理部1bは、部分領域2a,2bの両方または部分領域2aの誤り検出符号の生成を省略することができる。したがって、時刻T2において、使用済の部分領域2a,2b,2c,2dの全てに対して誤り検出符号を生成するよりも、誤り検出符号を生成するための処理量を減らせる。
こうして、情報処理装置1は、プログラムの実行中断時および実行再開時にスタック破壊の検査のために行われる誤り検出符号の生成や照合の処理量を減らすことができる。その結果、プログラムの実行中断や実行再開におけるオーバーヘッド(処理負荷)を低減でき、実行中断や実行再開を高速化できる。したがって、例えば、情報処理装置1における実行対象のプログラムの切り替えを高速化できる。
以下では、情報処理装置1の一例として、具体的なサーバコンピュータ(以下、単にサーバと称する)を示して、情報処理装置1の機能を更に詳細に説明する。
[第2の実施の形態]
図2は、第2の実施の形態のサーバのハードウェア例を示す図である。サーバ100は、プロセッサ101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106およびNIC(Network Interface Card)107を有する。各ハードウェアはサーバ100のバスに接続されている。
プロセッサ101は、サーバ100の情報処理を制御するハードウェアである。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPUやマイクロプロセッサなどである。
RAM102は、サーバ100の主記憶装置(メインメモリ)である。RAM102は、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、RAM102は、プロセッサ101による処理に用いる各種データを記憶する。
HDD103は、サーバ100の補助記憶装置である。HDD103は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD103は、OSのプログラム、アプリケーションプログラム、および各種データを記憶する。サーバ100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
画像信号処理部104は、プロセッサ101からの命令に従って、サーバ100に接続されたディスプレイ11に画像を出力する。ディスプレイ11として、CRT(Cathode Ray Tube)ディスプレイや液晶ディスプレイなどを用いることができる。
入力信号処理部105は、サーバ100に接続された入力デバイス12から入力信号を取得し、プロセッサ101に出力する。入力デバイス12として、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
媒体リーダ106は、記録媒体13に記録されたプログラムやデータを読み取る装置である。記録媒体13として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)を使用できる。また、記録媒体13として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ106は、例えば、プロセッサ101からの命令に従って、記録媒体13から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
NIC107は、ネットワーク14を介して他の装置と通信を行う。NIC107は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
ここで、サーバ100のOSは、プログラムの実行単位をタスクと呼ばれる単位で管理する。タスクは、プロセスと呼ばれることもある。サーバ100のOSは、マルチタスクOSである。サーバ100は、OSの機能により、複数のタスクそれぞれをコンテキストスイッチにより切り替えて実行する。切り替えのタイミングは、OSにより制御される。
図3は、プロセッサにおけるレジスタの例を示す図である。プロセッサ101は、汎用レジスタ111およびスタックポインタ112を有する。汎用レジスタ111は、アキュムレータ、ベースレジスタ、カウントレジスタおよびデータレジスタといった汎用的に利用可能なレジスタである。スタックポインタ112は、RAM102のスタックの使用済の領域のうち、先頭のアドレスを示すレジスタである。プロセッサ101は、これらのレジスタ以外にも、種々のレジスタを有する。
図4は、RAMの記憶領域の例を示す図である。RAM102は、スタック120、動的確保領域130、大域変数140、誤り検出符号保存テーブル150およびプログラム実行コード160を有する。
スタック120は、タスクにおける関数の引数や局所変数などを記憶する。スタック120は、実行対象のタスク毎に割り当てられる。また、スタック120の部分領域は、呼び出された関数毎に割り当てられる。1つの関数に割り当てられた部分領域は、スタックフレームと呼ばれる。
動的確保領域130は、プログラムの処理に用いられる各種のデータを格納するために動的に確保可能な領域である。
大域変数140は、全ての関数からアクセス可能なグローバル変数である。
誤り検出符号保存テーブル150は、スタック破壊の検査に用いられる誤り検出符号を格納するテーブルである。誤り検出符号は、例えばハッシュ値やCRC値などである。
プログラム実行コード160は、各種のプログラムの実行イメージである。
RAM102には、図4で例示した以外にも種々のデータが格納され得る。
図5は、タスク切り替えの例を示す図である。図5では、一例として、2つのタスクA,Bを切り替えて順に実行する場合を示す。ただし、サーバ100は、3以上のタスクを切り替えて実行することもできる。ここで、スタック120は、タスクAに対して割り当てられたRAM102上のスタックであるとする。スタック121は、タスクBに対して割り当てられたRAM102上のスタックであるとする。
まず、プロセッサ101は、タスクAを実行している。タスクAからタスクBへの切り替えタイミングにおいて、プロセッサ101は、タスクAのコンテキストを保存する。タスクAのコンテキストは、タスクAの切り替え直前におけるプロセッサ101のレジスタの情報である。プロセッサ101は、タスクAのコンテキストを、タスクA情報171としてRAM102に格納する(ステップS1)。
プロセッサ101は、RAM102に記憶されたタスクB情報172に基づいて、タスクBのコンテキストを復元する(ステップS2)。
プロセッサ101は、復元したコンテキストに基づいて、タスクBの実行を再開する(ステップS3)。
タスクBからタスクAへの切り替えタイミングにおいて、プロセッサ101は、タスクBのコンテキストを、タスクB情報172としてRAM102に格納する(ステップS4)。
プロセッサ101は、RAM102に記憶されたタスクA情報171に基づいて、タスクAのコンテキストを復元する(ステップS5)。
そして、プロセッサ101は、復元したコンテキストに基づいて、タスクAの実行を再開する(そして、タスクAの次回中断時にはステップS1に戻る)。こうして、プロセッサ101は、コンテキストの保存および復元を繰り返すことで、タスクA,Bを切り替えて実行する。このような切り替え手法は、コンテキストスイッチと呼ばれることがある。
図6は、サーバの機能例を示す図である。サーバ100は、OS180を有する。OS180は、タスク切り替え部190を有する。タスク切り替え部190は、タスク実行のスケジューリングおよびタスクの切り替えを行う。タスク切り替え部190は、スタック破壊の有無の検査機能を有する。具体的には、タスク切り替え部190は、符号保存部191、符号照合部192、検査対象選択部193および差分選択部194を有する。
符号保存部191、符号照合部192、検査対象選択部193および差分選択部194は、プロセッサ101がRAM102に記憶された所定のプログラム(スタック破壊検出プログラム)を実行することで実現される。以下では、各部について、主にタスクAを例示して説明するが、タスクBを含む他のタスクについても同様の処理を行う。
符号保存部191は、タスクAの実行中断時に、タスクAに対するスタック120の使用済領域に対する誤り検出符号を生成し、誤り検出符号保存テーブル150に格納する。
符号照合部192は、タスクAの実行再開時に、タスクAに対するスタック120の使用済領域に対する誤り検出符号を生成し、誤り検出符号保存テーブル150に格納されている誤り検出符号と照合することで、スタック破壊を検出する。
検査対象選択部193は、タスクAの実行中断時において、スタックポインタ112に基づき、スタック120の使用済領域の先頭アドレスを符号保存部191に提供する。検査対象選択部193は、タスクAの実行再開時において、スタックポインタ112に基づき、スタック120の使用済領域の先頭アドレスを符号照合部192に提供する。
差分選択部194は、タスクAの実行中断時において、スタック120の記憶領域のうち、前回のスタック破壊の検査時からの差分の領域を符号保存部191に提供する。当該差分の領域は、符号保存部191における誤り検出符号の生成対象になる。
図7は、プログラム処理の流れに対するスタック使用量の変化の例を示す図である。例えば、タスクAは、関数func1,func2,func3を含む。ここで、図中、関数を“func1()”のように表記する。例えば、関数func1は、関数func2を呼び出す。関数func2は、関数func3を呼び出す。
まず、サーバ100は、関数func1を実行する(ステップST1)。関数func1には、スタックフレームF1が割り当てられる。サーバ100は、スタック120のスタックポインタ112(図ではSP(Stack Pointer)と略記)に基づいて、スタックフレームF1をスタック120に追加する。ここで、図中、“スタックフレームF1”を、単に“フレームF1”のように略記する。また、図中、スタック120の先頭アドレスを上側に、最終アドレスを下側に表記する。この場合、スタックの伸長(成長)方向(スタックフレームが追加されていく方向)は、図の下側から上側に向かう方向である。スタックフレームF1を追加した後のスタックポインタ112は、スタックフレームF1の先頭アドレスを示す。スタック120のうち、スタックポインタ112よりも小さいアドレスで表される領域は、未使用の領域である。
次に、サーバ100は、関数func1から関数func2を呼出し、関数func2を実行する(ステップST2)。関数func2には、スタックフレームF2が割り当てられる。サーバ100は、スタックポインタ112に基づいて、スタックフレームF2をスタック120に追加する。スタックフレームF2を追加した後のスタックポインタ112は、スタックフレームF2の先頭アドレスを示す。
次に、サーバ100は、関数func2から関数func3を呼出し、関数func3を実行する(ステップST3)。関数func3には、スタックフレームF3が割り当てられる。サーバ100は、スタックポインタ112に基づいて、スタックフレームF3をスタック120に追加する。スタックフレームF3を追加した後のスタックポインタ112は、スタックフレームF3の先頭アドレスを示す。
更に、サーバ100は、関数func3から復帰し、関数func2の実行を再開する(ステップST4)。サーバ100は、スタックポインタ112に基づいて、関数func3に割り当てられていたスタックフレームF3をスタック120から除去する。スタックフレームF3を除去した後のスタックポインタ112は、スタックフレームF2の先頭アドレスを示す。
このように、スタック120には、LIFOの手順により、関数の呼出しに応じて、スタックフレームがプッシュされたり、ポップされたりする。
検査対象選択部193は、スタック120のうち、使用済の領域(使用済領域)をスタック破壊の検査対象とし、未使用の領域(未使用領域)をスタック破壊の検査対象としない。未使用領域をスタック破壊の検査対象にすると、余計な検査処理によるオーバーヘッドが増すからである。検査対象選択部193は、スタックポインタ112に基づいて、スタック120のうち、スタック破壊の検査対象のアドレス範囲を特定する。
図8は、スタック領域の検査対象範囲の例を示す図である。前述のように、スタックポインタ112は、スタック120に存在しているスタックフレームのうち、最後に追加されたスタックフレームの先頭アドレスを示す。したがって、検査対象選択部193は、スタック120のうち、スタックポインタ112よりも小さなアドレスで表される範囲を未使用領域と判断して、スタック破壊の検査対象外とする。また、検査対象選択部193は、スタック120のうち、スタックポインタ112およびスタックポインタ112よりも大きなアドレスで表される範囲を使用済領域と判断して、スタック破壊の検査対象とする。
図9は、フレームポインタの例を示す図である。例えば、スタック120は、最終アドレスから先頭アドレスに向かって、スタックフレームF1,F2,F3,・・・,Fn(nは自然数)を含む。スタック120のうち、スタックフレームF1,F2,F3,・・・,Fn以外の領域は、未使用領域である。スタックフレームF1,F2,F3,・・・,Fnそれぞれのアドレスは、フレームポインタFP1,FP2,FP3,・・・,FPnにより示される。例えば、フレームポインタFP1は、スタックフレームF1の先頭アドレスを示す。例えば、フレームポインタFP2は、スタックフレームF2の先頭アドレスを示す。例えば、フレームポインタFP3は、スタックフレームF3の先頭アドレスを示す。例えば、フレームポインタFPnは、スタックフレームFnの先頭アドレスを示す。この場合、フレームポインタFPnは、スタックポインタ112で示されるアドレスに相当する。
例えば、スタックフレームは、直前のスタックフレームを示すフレームポインタを所定の位置に格納している。具体的には、スタックフレームF2は、フレームポインタFP1を含む。スタックフレームF3は、フレームポインタFP2を含む。スタックフレームFnは、スタックフレームF(n−1)を示すフレームポインタFP(n−1)を含む。
図10は、誤り検出符号保存テーブルの例を示す図である。誤り検出符号保存テーブル150は、RAM102に格納されている。誤り検出符号保存テーブル150は、タスクAに関する情報を保持する。タスクBを含む他のタスクについても、タスク毎に、誤り検出符号保存テーブル150が設けられる。誤り検出符号保存テーブル150は、エントリ番号、誤り検出符号およびフレームポインタの項目を含む。
エントリ番号の項目には、誤り検出符号保存テーブル150のレコード(エントリと称する)の識別番号が登録される。誤り検出符号の項目には、スタックフレームに対して計算された誤り検出符号が登録される。フレームポインタの項目には、該当のスタックフレームを示すフレームポインタが登録される。
ここで、誤り検出符号保存テーブル150において、エントリ番号が大きいエントリを上位エントリと呼ぶこととする。エントリ番号が大きいエントリほど、フレームポインタが示す値(アドレス)は小さい。また、誤り検出符号保存テーブル150において、エントリ番号が小さいエントリを下位エントリと呼ぶこととする。エントリ番号が小さいエントリほど、フレームポインタが示す値(アドレス)は大きい。
例えば、誤り検出符号保存テーブル150には、エントリ番号が“n”、誤り検出符号が“code(n)”、フレームポインタが“FPn”というエントリを含む。このエントリは、エントリ番号“n”であり、フレームポインタFPnのスタックフレームFnに対して取得された誤り検出符号が“code(n)”であることを示す。
誤り検出符号保存テーブル150には、スタック120における他のスタックフレームについても同様に、誤り検出符号が登録される。
次に、サーバ100によるスタック破壊の検査の手順を説明する。タスク切り替え部190は、コンテキストスイッチを実行するタイミングで、下記の手順を開始する。
図11は、スタック破壊の検査例を示すフローチャートである。以下、図11に示す処理をステップ番号に沿って説明する。
(S11)タスク切り替え部190は、実行中断するタスク(ここでは、一例としてタスクAとする)のコンテキストを保存する。
(S12)符号保存部191は、実行中断する該当のタスクAの誤り検出符号の生成が初回であるか否かを判定する。初回である場合、符号保存部191は、ステップS13に処理を進める。初回でない場合、符号保存部191は、ステップS15に処理を進める。例えば、符号保存部191は、タスクAに対する誤り検出符号保存テーブル150を生成済でなければ、タスクAについて初回の誤り検出符号の生成であり、生成済であれば、タスクAについて初回の誤り検出符号の生成ではないと判定する。
(S13)検査対象選択部193は、スタックポインタ112により示されるアドレスを符号保存部191に通知する。符号保存部191は、スタックポインタ112および各フレームポインタに基づいて、スタック120に存在する全てのスタックフレームに対し、スタックフレーム毎に、誤り検出符号を生成する。すなわち、符号保存部191は、スタック120の使用済領域の全域に対して、スタックフレーム毎に生成された誤り検出符号を含む誤り検出符号列を生成する。
(S14)符号保存部191は、スタックフレームのフレームポインタに対応付けて、当該スタックフレームに対して生成された誤り検出符号を、RAM102に格納する。具体的には、符号保存部191は、タスクAに対する誤り検出符号保存テーブル150を生成し、誤り検出符号保存テーブル150に、スタックフレームのフレームポインタと、当該スタックフレームの誤り検出符号とを登録する。そして、符号保存部191は、ステップS16に処理を進める。
(S15)符号保存部191は、差分の誤り検出符号の生成を行う。差分の誤り検出符号の生成手順の詳細は、後述される。そして、符号保存部191は、ステップS16に処理を進める。
(S16)検査対象選択部193は、再開するタスク(ここでは、一例としてタスクBとする)のスタックポインタにより示されるアドレスを符号照合部192に通知する。符号照合部192は、検査対象選択部193により通知されたアドレスおよび再開するタスクBの誤り検出符号保存テーブルに基づいて、タスクBのスタック121の使用済領域に関して誤り検出符号を照合する。符号照合部192は、誤り検出符号の照合を、スタックフレーム毎に実行する。具体的には、符号照合部192は、スタック121のスタックフレーム毎に誤り検出符号を生成し、誤り検出符号保存テーブルに記憶された誤り検出符号と比較し、一致するか否かを判定する。符号照合部192は、スタック121の全てのスタックフレームについて、誤り検出符号が一致すれば、照合成功であり、スタック121に関してスタック破壊は生じていないと判断する。符号照合部192は、スタック121の少なくとも1つのスタックフレームについて、誤り検出符号が一致していなければ、照合失敗であり、スタック121に関してスタック破壊が生じていると判断する。
(S17)符号照合部192は、照合に成功したか否かを判定する。照合に成功した場合、符号照合部192は、ステップS18に処理を進める。照合に失敗した場合、符号照合部192は、ステップS20に処理を進める。
(S18)タスク切り替え部190は、再開するタスクBのコンテキストを復元する。
(S19)タスク切り替え部190は、復元したコンテキストに基づいて、再開するタスクBの実行を再開する。そして、タスク切り替え部190は、処理を終了する。
(S20)タスク切り替え部190は、スタック破壊をユーザに通知する。例えば、タスク切り替え部190は、スタック破壊が発生した旨のメッセージを、ディスプレイ11に表示することで、スタック破壊を通知してもよい。あるいは、タスク切り替え部190は、スタック破壊が発生した旨のメッセージを、ネットワーク14を介して他のコンピュータに送信することで、スタック破壊を通知してもよい。このとき、タスク切り替え部190は、スタック121のうち、スタック破壊が検出されたスタックフレームを示す情報(例えば、当該スタックフレームのアドレスなど)を当該通知に含めてもよい。そして、タスク切り替え部190は、処理を終了する。
図12は、差分の誤り検出符号生成の例を示すフローチャートである。以下、図12に示す処理をステップ番号に沿って説明する。以下に示す手順は、図11のステップS15に相当する。
(S101)差分選択部194は、誤り検出符号保存テーブル150の最上位エントリFPnと、スタック120の最上位フレームのアドレスSPとを比較する。ここで、FPnは、誤り検出符号保存テーブル150における、最上位エントリのフレームポインタで示されるアドレスである。アドレスSPは、スタックポインタ112で示されるアドレスである。なお、スタック120のうち、アドレスが小さい方のスタックフレームを「上位フレーム」と呼び、アドレスが大きい方のスタックフレームを「下位フレーム」と呼ぶことがある。
(S102)差分選択部194は、SP≦FPnであるか否かを判定する。SP≦FPnである場合、差分選択部194は、ステップS103に処理を進める。SP>FPnである場合、差分選択部194は、ステップS104に処理を進める。
(S103)差分選択部194は、スタック120の最上位フレームを比較フレームとする。ここで、「最上位フレーム」は、スタック120のスタックポインタ112で示されるスタックフレームである。そして、差分選択部194は、ステップS105に処理を進める。
(S104)差分選択部194は、誤り検出符号保存テーブル150の最上位エントリに対応するスタック120のスタックフレームを比較フレームとする。ここで、差分選択部194は、「最上位エントリに対応するスタック120のスタックフレーム」を次のようにして特定する。まず、差分選択部194は、誤り検出符号保存テーブル150のエントリ数k(kは1以上の整数)を求める。そして、差分選択部194は、スタック120の最下位フレームから上位へ向かって数えてk番目のスタックフレームを、ステップS104における「最上位エントリに対応するスタック120のスタックフレーム」と特定し、比較フレームとする。そして、差分選択部194は、ステップS105に処理を進める。
(S105)差分選択部194は、比較フレームに対応する誤り検出符号保存テーブル150のエントリを比較エントリとする。ここで、差分選択部194は、「比較フレームに対応する誤り検出符号保存テーブル150のエントリ」を次のようにして特定する。まず、差分選択部194は、スタック120のフレームポインタを辿ることで、比較フレームよりも下位のスタックフレームの個数m(mは0以上の整数)を求める。そして、差分選択部194は、誤り検出符号保存テーブル150の最下位エントリから上位へ向かって数えてm+1番目のエントリを、ステップS105における「比較フレームに対応する誤り検出符号保存テーブル150のエントリ」と特定し、比較エントリとする。
(S106)差分選択部194は、比較フレームのフレームポインタFPxと比較エントリのフレームポインタFPyとを比較する。
(S107)差分選択部194は、FPx=FPyであるか否かを判定する。FPx=FPyである場合、差分選択部194は、ステップS108に処理を進める。FPx=FPyでない場合、差分選択部194は、ステップS110に処理を進める。
(S108)差分選択部194は、比較フレームの誤り検出符号code(x)を生成し、比較エントリの誤り検出符号code(y)と比較する。
(S109)差分選択部194は、code(x)=code(y)であるか否かを判定する。code(x)=code(y)である場合、差分選択部194は、ステップS111に処理を進める。code(x)=code(y)でない場合、差分選択部194は、ステップS110に処理を進める。
(S110)差分選択部194は、比較フレームを1つ下位のスタックフレーム(現比較フレームよりもアドレスが大きい方のスタックフレーム)に変更する。そして、差分選択部194は、ステップS105に処理を進める。
(S111)差分選択部194は、比較フレームより上位のスタックフレームに対して誤り検出符号を生成するように、符号保存部191に通知する。符号保存部191は、差分選択部194からの通知に応じて、比較エントリより上位の誤り検出符号保存テーブル150のエントリを、スタック120の最上位フレーム(最上位のスタックフレーム)から比較フレームまでの情報で更新する。すなわち、符号保存部191は、スタック120の最上位フレームから比較フレームの1つ上位のスタックフレームまでについて、スタックフレーム毎に誤り検出符号を生成し、誤り検出符号保存テーブル150の該当のエントリを生成した誤り検出符号で更新する。すなわち、符号保存部191は、スタック120の使用済領域の一部(前回との差分の領域)について、スタックフレーム毎に生成された誤り検出符号を含む誤り検出符号列を生成する。なお、符号保存部191は、ステップS108を実行することで既に誤り検出符号を生成済のスタックフレームに対しては、ステップS111での誤り検出符号の生成を省略し、ステップS108で生成された誤り検出符号を用いることができる。そして、符号保存部191は、処理を終了する。
このように、差分選択部194は、タスクAの前回の実行中断時に取得された第1の誤り検出符号列に含まれるスタックフレーム(部分領域)毎の第1の誤り検出符号と、タスクAの今回の実行中断時におけるスタックフレーム毎の第2の誤り検出符号とを、スタックフレームのアドレスの小さい方から順に、スタックフレーム毎に照合する。差分選択部194は、第1の誤り検出符号と第2の誤り検出符号とが最初に一致したスタックフレームのアドレスよりも小さいアドレスに対応するスタックフレームを、前回と今回とでのスタックフレームの差分と特定する。これにより、前回から内容が変更されたスタックフレームを適切に特定することができる。そして、スタック120の全てのスタックフレームについて変更有無の判定を行わずに済み、差分のスタックフレームを特定する処理を高速化できる。
また、差分選択部194は、第1の誤り検出符号列の一部の符号に関する差分の誤り検出符号列に含まれる符号への置き換え、および、第1の誤り検出符号列に対する差分の誤り検出符号列に含まれる符号の追加の少なくとも一方を行うことで、現在のスタック120の使用済領域に対する第2の誤り検出符号列を取得する。これにより、スタック120に対する最新の誤り検出符号列を生成するために、スタック120の全スタックフレームに対する誤り検出符号列を生成するよりも、当該最新の誤り検出符号列の生成処理を高速化できる。
更に、差分選択部194は、スタックポインタ112に基づいてスタック120に属する使用済の部分領域のうちの第1のアドレスに対応する第1の部分領域を特定する。差分選択部194は、特定した第1の部分領域に含まれるフレームポインタに基づいて、第1のアドレスよりも大きな第2のアドレスに対応する使用済の第2の部分領域を特定する。これにより、スタック120を利用するために用いられるスタックポインタ112やフレームポインタに基づいて、スタック120のうち、誤り検出符号の生成対象の部分および誤り検出符号の照合対象の部分を効率的に特定することができる。
ここで、ステップS110において、スタック120の全てのスタックフレームを処理済の場合、比較フレームの1つ下位のスタックフレームが存在しないこともある。この場合、差分選択部194は、スタック120に存在する全てのスタックフレームについて誤り検出符号を生成するように、符号保存部191に通知する。そして、符号保存部191は、スタック120に存在する全てのスタックフレームについて、スタックフレーム毎に誤り検出符号を生成し、誤り検出符号保存テーブル150の各エントリを更新して、処理を終了する。ただし、この場合も、符号保存部191は、ステップS108で誤り検出符号を生成済のスタックフレームがある場合には、該当のスタックフレームに対する誤り検出符号の生成を省略し、ステップS108で生成された誤り検出符号を用いることができる。
また、ステップS107において、フレームポインタFPx,FPyの比較を行う理由は、比較フレームが前回検査時とは別の関数のスタックフレームに入れ替わっている場合、フレームポインタが変更されている可能性が高いからである。この場合、前回の誤り検出符号を流用することはできず、今回、再生成を要することになる。
次に、差分の誤り検出符号による既存の誤り検出符号の更新方法の具体例を説明する。
図13は、誤り検出符号保存テーブルの更新例(その1)を示す図である。タスクの切り替えに伴って、タスクAの実行を中断する場合を考える。例えば、タスクAの中断のタイミングにおいて、スタック120は、最終アドレスから先頭アドレスに向かう順に、スタックフレームF1,F2,F3,F4,F5,F6を含む。また、スタック120は、未使用領域を含む。誤り検出符号保存テーブル151は、タスクAに対応する更新前の誤り検出符号保存テーブルである。誤り検出符号保存テーブル152は、タスクAに対応する更新後の誤り検出符号保存テーブルである。
例えば、タスクAの中断のタイミングにおいて、誤り検出符号保存テーブル151は、エントリ#1,#2,#3,#4の4つのエントリを含む。
この場合、まず、差分選択部194は、誤り検出符号保存テーブル151の最上位エントリのアドレス(フレームポインタ)FPn=FP4と、スタック120の最上位フレームのアドレス(スタックポインタ)SP=FP6とを比較する。SP>FPnであるため(ステップS102 No)、差分選択部194は、誤り検出符号保存テーブル151の最上位エントリ#4に対応するスタック120のスタックフレームを比較フレームとする(ステップS104)。具体的には、誤り検出符号保存テーブル151のエントリ数k=4である。そして、差分選択部194は、スタック120の最下位フレーム(スタックフレームF1)から数えてk=4番目のスタックフレームF4を比較フレームとする。比較エントリは、誤り検出符号保存テーブル151のエントリ#4である。
そして、差分選択部194は、スタックフレームF4のフレームポインタ(FPx)と誤り検出符号保存テーブル151のエントリ#4のフレームポインタ(FPy)と、を比較する。両者は一致している(FPx=FPy)とする。また、差分選択部194は、誤り検出符号保存テーブル151のエントリ#4に記録された誤り検出符号と、スタックフレームF4を基に再生成した誤り検出符号とを照合する。これら2つの誤り検出符号は相違しているとする(ステップST11)。
次に、差分選択部194は、比較フレームを1つ下位のスタックフレームF3に変更する。比較エントリは、誤り検出符号保存テーブル151のエントリ#3である。
差分選択部194は、スタックフレームF3のフレームポインタ(FPx)と誤り検出符号保存テーブル151のエントリ#3のフレームポインタ(FPy)とを比較する。両者は一致している(FPx=FPy)とする。また、差分選択部194は、誤り検出符号保存テーブル151のエントリ#3に記録された誤り検出符号と、スタックフレームF3を基に再生成した誤り検出符号とを照合する。これら2つの誤り検出符号は一致しているとする(ステップST12)。
すると、符号保存部191は、比較エントリであるエントリ#3より上位の誤り検出符号保存テーブル151のエントリを、スタック120の最上位フレーム(スタックフレームF6)から比較フレームの1つ上位のスタックフレームF4までの情報で更新する。すなわち、符号保存部191は、スタックフレームF4,F5,F6それぞれに対して差分の誤り検出符号を生成し、誤り検出符号保存テーブル151を更新する(ステップST13)。その結果、誤り検出符号保存テーブル151のエントリ#4の誤り検出符号は更新され、誤り検出符号保存テーブル151にエントリ#5,#6のエントリが追加される。なお、符号保存部191は、スタックフレームF3に対して再生成された誤り検出符号と等しいと判定されたエントリ#3と、エントリ#3よりも下位のエントリ#2,#1については、誤り検出符号を作り直さずに再利用する(ステップST14)。
誤り検出符号保存テーブル152は、誤り検出符号保存テーブル151の更新後を示す。誤り検出符号保存テーブル152のエントリ#1,#2,#3は、再利用されたエントリである。誤り検出符号保存テーブル152のエントリ#4は、今回変更されたエントリである。誤り検出符号保存テーブル152のエントリ#5,#6は、今回追加されたエントリである。
こうして、符号保存部191は、差分の誤り検出符号を生成し、前回の誤り検出符号を再利用して、スタック120の使用済領域に対する最新の誤り検出符号列を得る。
図14は、誤り検出符号保存テーブルの更新例(その2)を示す図である。引き続き、タスクの切り替えに伴って、タスクAの実行を中断する場合を考える。例えば、タスクAの中断のタイミングにおいて、スタック120は、最終アドレスから先頭アドレスに向かう順に、スタックフレームF1,F2,F3,F4,F5を含む。また、スタック120は、未使用領域を含む。誤り検出符号保存テーブル153は、タスクAに対応する更新前の誤り検出符号保存テーブルである。誤り検出符号保存テーブル154は、タスクAに対応する更新後の誤り検出符号保存テーブルである。
例えば、タスクAの中断のタイミングにおいて、誤り検出符号保存テーブル153は、エントリ#1,#2,#3,#4,#5,#6の6つのエントリを含む。
この場合、まず、差分選択部194は、誤り検出符号保存テーブル153の最上位エントリのアドレスFPn=FP6と、スタック120の最上位フレームのアドレスSP=FP5とを比較する。SP≦FPnであるため(ステップS102 Yes)、差分選択部194は、スタック120の最上位のスタックフレームF5を比較フレームとする(ステップS103)。
差分選択部194は、フレームポインタを辿ることで、スタックフレームF5の下位に、スタックフレームF1,F2,F3,F4の4つのスタックフレームがあることを特定し、m=4とする。そして、差分選択部194は、誤り検出符号保存テーブル153の最下位エントリから数えてm+1=5番目のエントリ#5を、比較エントリとする(ステップS105)。
そして、差分選択部194は、スタックフレームF5のフレームポインタ(FPx)と誤り検出符号保存テーブル153のエントリ#5のフレームポインタ(FPy)とを比較する。両者は一致している(FPx=FPy)とする。また、差分選択部194は、誤り検出符号保存テーブル153のエントリ#5に記録された誤り検出符号と、スタックフレームF5を基に再生成した誤り検出符号とを照合する。これら2つの誤り検出符号は相違しているとする(ステップST21)。
次に、差分選択部194は、比較フレームを1つ下位のスタックフレームF4に変更する。比較エントリは、誤り検出符号保存テーブル153のエントリ#4である。
差分選択部194は、スタックフレームF4のフレームポインタ(FPx)と誤り検出符号保存テーブル153のエントリ#4のフレームポインタ(FPy)とを比較する。両者は一致している(FPx=FPy)とする。また、差分選択部194は、誤り検出符号保存テーブル153のエントリ#4に記録された誤り検出符号と、スタックフレームF4を基に再生成した誤り検出符号とを照合する。これら2つの誤り検出符号は相違しているとする(ステップST22)。
次に、差分選択部194は、比較フレームを1つ下位のスタックフレームF3に変更する。比較エントリは、誤り検出符号保存テーブル153のエントリ#3である。
差分選択部194は、スタックフレームF3のフレームポインタ(FPx)と誤り検出符号保存テーブル153のエントリ#3のフレームポインタ(FPy)とを比較する。両者は一致している(FPx=FPy)とする。また、差分選択部194は、誤り検出符号保存テーブル153のエントリ#3に記録された誤り検出符号と、スタックフレームF3を基に再生成した誤り検出符号とを照合する。これら2つの誤り検出符号は一致しているとする(ステップST23)。
すると、符号保存部191は、比較エントリであるエントリ#3より上位の誤り検出符号保存テーブル153のエントリを、スタック120の最上位フレーム(スタックフレームF5)から比較フレームの1つ上位のスタックフレームF4までの情報で更新する。すなわち、符号保存部191は、スタックフレームF4,F5それぞれに対して差分の誤り検出符号を生成し、誤り検出符号保存テーブル153を更新する(ステップST24)。その結果、誤り検出符号保存テーブル153のエントリ#4,#5の誤り検出符号は更新され、エントリ#6は削除される。
なお、符号保存部191は、スタックフレームF3に対して再生成された誤り検出符号と等しいと判定されたエントリ#3と、エントリ#3よりも下位のエントリ#2,#1については、誤り検出符号を作り直さずに再利用する(ステップST25)。
誤り検出符号保存テーブル154は、誤り検出符号保存テーブル153の更新後を示す。誤り検出符号保存テーブル154のエントリ#1,#2,#3は、再利用されたエントリである。誤り検出符号保存テーブル154のエントリ#4,#5は、今回変更されたエントリである。
こうして、符号保存部191は、差分の誤り検出符号を生成し、前回の誤り検出符号を再利用して、スタック120の使用済領域に対する最新の誤り検出符号列を得る。
図15は、誤り検出符号の照合の例を示す図である。タスクの切り替えに伴って、中断されていたタスクAの実行を再開する場合を考える。誤り検出符号保存テーブル155は、タスクAの前回の中断時の誤り検出符号列を記録したテーブルである。
符号照合部192は、検査対象選択部193からスタック120のうち、スタックフレームFnの先頭アドレス(スタックポインタ112)の通知を受け付ける。符号照合部192は、スタックフレームFnおよびスタックフレームFnよりも下位のスタックフレームを、使用済領域として認識する。符号照合部192は、スタックポインタ112およびフレームポインタで示されるアドレスを辿り、スタックフレームFnよりも下位の各スタックフレームF1,F2,F3,・・・を特定する。符号照合部192は、スタックフレームF1,F2,F3,・・・,Fnのそれぞれに対して、誤り検出符号(照合用の誤り検出符号列201)を生成する(ステップST31)。誤り検出符号列201は、誤り検出符号code(a1),code(a2),code(a3),・・・,code(an)を含む。誤り検出符号code(a1)は、スタックフレームF1を基に生成された誤り検出符号である。誤り検出符号code(a2)は、スタックフレームF2を基に生成された誤り検出符号である。誤り検出符号code(a3)は、スタックフレームF3を基に生成された誤り検出符号である。誤り検出符号code(an)は、スタックフレームFnを基に生成された誤り検出符号である。
符号照合部192は、再生成された誤り検出符号列201と誤り検出符号保存テーブル155に記録されている誤り検出符号列とを、スタックフレーム毎に照合する。例えば、符号照合部192は、スタックフレームF1について、再生成された誤り検出符号code(a1)と、誤り検出符号保存テーブル155に記録されている誤り検出符号code(1)とを照合する。同様に、符号照合部192は、スタックフレームF2,F3,・・・,Fnについても、再生成された誤り検出符号code(a2),code(a3),・・・,code(an)と、誤り検出符号保存テーブル155に記録されている誤り検出符号code(2),code(3),・・・,code(n)とを照合する。
符号照合部192は、照合により、全ての誤り検出符号の組が一致すれば、スタック破壊が生じていないと判断し、タスクAの実行を再開する。一方、符号照合部192は、照合により、少なくとも1つの誤り検出符号の組が一致しなければ、スタック破壊が生じていると判断し、タスクAの実行再開を中止して、スタック破壊が発生した旨をユーザに通知する。
そして、符号照合部192は、スタック120のうち検査対象の範囲を削減することで、スタック破壊の検査に伴う処理量を減らすことができる。具体的には次の通りである。
図16は、検査対象の範囲の例を示す図である。図16(A)は、スタック120のうち、使用済領域を検査対象とし、未使用領域を検査対象外とする例を示す。図16(B)は、スタック120のうち、全ての領域を検査対象とする例を示す。
図16(A)では、スタック120が領域R1,R2,R3に分割されている。領域R1は、使用済領域であり、かつ、前回の検査時(すなわち、前回のタスクAの中断時、または、タスクAの再開時)から格納されているデータに変更がない領域である。領域R1に属するスタックフレームについては、前回の検査時における誤り検出符号を今回の検査に再利用することができる。また、領域R1は、誤り検出符号の照合によるスタック破壊の検査対象である。
領域R2は、使用済領域であり、かつ、前回の検査時から格納されているデータの書き換えが発生した領域である。領域R2に属するスタックフレームについては、前回の検査時における誤り検出符号を再利用することができず、タスクAの中断時に誤り検出符号の生成を要する。また、領域R2は、誤り検出符号の照合によるスタック破壊の検査対象である。
領域R3は、未使用領域である。領域R3は、誤り検出符号の照合によるスタック破壊の検査対象外である。
すなわち、サーバ100は、タスクAの実行中断時に、スタック120のうちのスタックフレーム(使用済の部分領域)の差分以外の領域に対する誤り検出符号の更新を省略する。また、サーバ100は、タスクAの実行再開時に、スタック120のうちの未使用の領域に対する誤り検出符号の生成および照合を省略する。
例えば、スタック120の全体サイズに対する領域R1のサイズの比は、0.2であるとする。また、スタック120の全体サイズに対する領域R2のサイズの比は、0.4であるとする。更に、スタック120の全体サイズに対する領域R3のサイズの比は、0.4であるとする。
一方、図16(B)で示されるように、常に、スタック120の領域全体をスタック破壊の検査対象とすることも考えられる。ここで、スタック120の全体サイズを1とし、処理対象となる領域のサイズに処理量が比例すると考えると、図16(A)の場合と、図16(B)の場合とで、おおよその処理量を比較することができる。
例えば、図16(A)の場合では、符号保存部191は、タスクAの実行中断時に、領域R2に対する誤り検出符号の生成を行う(処理量0.4)。また、符号照合部192は、タスクAの実行再開時に、領域R2に対する誤り検出符号の生成および照合を行う(処理量0.4)。ただし、ここでは、タスクAの実行再開時における誤り検出符号の生成および照合を1つの処理と捉えて処理量を評価している。更に、符号照合部192は、タスクAの実行再開時に、領域R1に対する誤り検出符号の生成および照合を行う(処理量0.2)。図16(A)の場合、タスクAの実行中断および実行再開の1セットにおいて、スタック破壊の検査のために、0.4+0.4+0.2=1の処理量が生じる。
図16(B)の場合では、符号保存部191は、タスクAの実行時に、スタック120の全領域に対する誤り検出符号の生成を行う(処理量1)。また、符号照合部192は、タスクAの実行再開時に、スタック120の全領域に対する誤り検出符号の生成および照合を行う(処理量1)。したがって、図16(B)の場合、タスクAの実行中断および実行再開の1セットにおいて、スタック破壊の検査のために、1+1=2の処理量が生じる。
そして、図16(A)の場合の処理量1と、図16(B)の場合の処理量2とを比較すると、図16(A)の場合(使用済領域のみを検査対象とする場合)の方が、図16(B)の場合(スタック領域全体を検査対象とする場合)よりも処理量が小さい。
なお、上記の処理量の比較において、タスクAの実行再開時における誤り検出符号の生成および照合を別個の処理と捉えて処理量を評価することもできる。その場合、図16(A)の場合のスタック破壊の検査のための処理量は、領域R2,R3に対する実行再開時の処理量がそれぞれ、0.4+0.4=0.8、0.2+0.2=0.4と評価されることから、0.4+0.8+0.4=1.6である。また、図16(B)の場合のスタック破壊の検査のための処理量は、1+1+1=3である。このようにより厳密に処理量を評価した場合でも図16(A)の場合の方が、図16(B)の場合よりも処理量が小さい。
こうして、サーバ100は、スタック破壊検査のための処理量を減らすことができる。その結果、タスク切り替えに伴う処理負荷を低減でき、タスク切り替えを高速に行える。特に、サーバ100ではOS180の制御により、タスク切り替えが頻繁に行われる。このため、タスク切り替えの処理負荷の低減や高速化は、サーバ100の性能改善へ大きく貢献する。
なお、第1の実施の形態の情報処理は、処理部1bにプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、プロセッサ101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体13に記録できる。
例えば、プログラムを記録した記録媒体13を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体13に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。
以上の第1,第2の実施の形態を含む実施形態に関し、更に以下の付記を開示する。
(付記1) プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第1の誤り検出符号列を記憶する記憶部と、
前記プログラムの実行中断時に、前記スタック領域のうち、前記第1の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、前記プログラムの実行再開時に、前記記憶部に記憶された前記第1の誤り検出符号列に前記差分の誤り検出符号列を反映させた第2の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第3の誤り検出符号列との照合に応じて、スタック破壊を検出する処理部と、
を有する情報処理装置。
(付記2) 前記処理部は、前記第1の誤り検出符号列に含まれる使用済の部分領域毎の第1の誤り検出符号と、前記プログラムの今回の実行中断時における使用済の部分領域毎の第2の誤り検出符号とを、部分領域に対応するアドレスの小さい方から順に、部分領域毎に照合し、前記第1の誤り検出符号と前記第2の誤り検出符号とが最初に一致した部分領域のアドレスよりも小さいアドレスに対応する部分領域を、使用済の部分領域の前記差分と特定する、付記1記載の情報処理装置。
(付記3) 前記処理部は、前記第1の誤り検出符号列の一部の符号に関する前記差分の誤り検出符号列に含まれる符号への置き換え、および、前記第1の誤り検出符号列に対する前記差分の誤り検出符号列に含まれる符号の追加の少なくとも一方を行うことで前記第2の誤り検出符号列を取得する、付記1または2記載の情報処理装置。
(付記4) 前記処理部は、スタックポインタに基づいて前記スタック領域に属する使用済の部分領域のうちの第1のアドレスに対応する第1の部分領域を特定し、前記第1の部分領域に含まれるフレームポインタに基づいて、前記第1のアドレスよりも大きな第2のアドレスに対応する使用済の第2の部分領域を特定する、付記1乃至3の何れか1つに記載の情報処理装置。
(付記5) 前記処理部は、前記プログラムの実行中断時に、前記スタック領域のうちの使用済の部分領域の前記差分以外の領域に対する誤り検出符号の更新を省略し、前記プログラムの実行再開時に、前記スタック領域のうちの未使用の領域に対する誤り検出符号の生成および照合を省略する、付記1乃至4の何れか1つに記載の情報処理装置。
(付記6) 前記第1の誤り検出符号列は、前記プログラムの前回の実行中断時に前記スタック領域の使用済の部分領域に対して取得された誤り検出符号列である、付記1乃至5の何れか1つに記載の情報処理装置。
(付記7) 前記処理部は、実行対象を前記プログラムから他のプログラムに切り替える際に、前記プログラムの実行を中断する、付記1乃至6の何れか1つに記載の情報処理装置。
(付記8) プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第1の誤り検出符号列を取得し、
前記プログラムの実行中断時に、前記スタック領域のうち、前記第1の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、
前記プログラムの実行再開時に、前記第1の誤り検出符号列に前記差分の誤り検出符号列を反映させた第2の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第3の誤り検出符号列との照合に応じて、スタック破壊を検出する、
処理をコンピュータに実行させるスタック破壊検出プログラム。
(付記9) 前記プログラムの実行中断時に、前記第1の誤り検出符号列に含まれる使用済の部分領域毎の第1の誤り検出符号と、前記プログラムの今回の実行中断時における使用済の部分領域毎の第2の誤り検出符号とを、部分領域に対応するアドレスの小さい方から順に、部分領域毎に照合し、前記第1の誤り検出符号と前記第2の誤り検出符号とが最初に一致した部分領域のアドレスよりも小さいアドレスに対応する部分領域を、使用済の部分領域の前記差分と特定する、付記8記載のスタック破壊検出プログラム。
(付記10) 前記第1の誤り検出符号列の一部の符号に関する前記差分の誤り検出符号列に含まれる符号への置き換え、および、前記第1の誤り検出符号列に対する前記差分の誤り検出符号列に含まれる符号の追加の少なくとも一方を行うことで前記第2の誤り検出符号列を取得する、付記8または9記載のスタック破壊検出プログラム。
(付記11) スタックポインタに基づいて前記スタック領域に属する使用済の部分領域のうちの第1のアドレスに対応する第1の部分領域を特定し、前記第1の部分領域に含まれるフレームポインタに基づいて、前記第1のアドレスよりも大きな第2のアドレスに対応する使用済の第2の部分領域を特定する、付記8乃至10の何れか1つに記載のスタック破壊検出プログラム。
(付記12) 前記プログラムの実行中断時に、前記スタック領域のうちの使用済の部分領域の前記差分以外の領域に対する誤り検出符号の更新を省略し、前記プログラムの実行再開時に、前記スタック領域のうちの未使用の領域に対する誤り検出符号の生成および照合を省略する、付記8乃至11の何れか1つに記載のスタック破壊検出プログラム。
(付記13) 前記取得では、前記プログラムの前回の実行中断時に前記第1の誤り検出符号列を取得する、付記8乃至12の何れか1つに記載のスタック破壊検出プログラム。
(付記14) 実行対象を前記プログラムから他のプログラムに切り替える際に、前記プログラムの実行を中断する、付記8乃至13の何れか1つに記載のスタック破壊検出プログラム。
1 情報処理装置
1a 記憶部
1b 処理部
2 スタック領域
2a,2b,2c,2d 部分領域
2y,2z 未使用領域
3 第1の誤り検出符号列
4 差分の誤り検出符号列
5 第2の誤り検出符号列
6 第3の誤り検出符号列

Claims (8)

  1. プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第1の誤り検出符号列を記憶する記憶部と、
    前記プログラムの実行中断時に、前記スタック領域のうち、前記第1の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、前記プログラムの実行再開時に、前記記憶部に記憶された前記第1の誤り検出符号列に前記差分の誤り検出符号列を反映させた第2の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第3の誤り検出符号列との照合に応じて、スタック破壊を検出する処理部と、
    を有する情報処理装置。
  2. 前記処理部は、前記第1の誤り検出符号列に含まれる使用済の部分領域毎の第1の誤り検出符号と、前記プログラムの今回の実行中断時における使用済の部分領域毎の第2の誤り検出符号とを、部分領域に対応するアドレスの小さい方から順に、部分領域毎に照合し、前記第1の誤り検出符号と前記第2の誤り検出符号とが最初に一致した部分領域のアドレスよりも小さいアドレスに対応する部分領域を、使用済の部分領域の前記差分と特定する、請求項1記載の情報処理装置。
  3. 前記処理部は、前記第1の誤り検出符号列の一部の符号に関する前記差分の誤り検出符号列に含まれる符号への置き換え、および、前記第1の誤り検出符号列に対する前記差分の誤り検出符号列に含まれる符号の追加の少なくとも一方を行うことで前記第2の誤り検出符号列を取得する、請求項1または2記載の情報処理装置。
  4. 前記処理部は、スタックポインタに基づいて前記スタック領域に属する使用済の部分領域のうちの第1のアドレスに対応する第1の部分領域を特定し、前記第1の部分領域に含まれるフレームポインタに基づいて、前記第1のアドレスよりも大きな第2のアドレスに対応する使用済の第2の部分領域を特定する、請求項1乃至3の何れか1項に記載の情報処理装置。
  5. 前記処理部は、前記プログラムの実行中断時に、前記スタック領域のうちの使用済の部分領域の前記差分以外の領域に対する誤り検出符号の更新を省略し、前記プログラムの実行再開時に、前記スタック領域のうちの未使用の領域に対する誤り検出符号の生成および照合を省略する、請求項1乃至4の何れか1項に記載の情報処理装置。
  6. 前記第1の誤り検出符号列は、前記プログラムの前回の実行中断時に前記スタック領域の使用済の部分領域に対して取得された誤り検出符号列である、請求項1乃至5の何れか1項に記載の情報処理装置。
  7. 前記処理部は、実行対象を前記プログラムから他のプログラムに切り替える際に、前記プログラムの実行を中断する、請求項1乃至6の何れか1項に記載の情報処理装置。
  8. プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第1の誤り検出符号列を取得し、
    前記プログラムの実行中断時に、前記スタック領域のうち、前記第1の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、
    前記プログラムの実行再開時に、前記第1の誤り検出符号列に前記差分の誤り検出符号列を反映させた第2の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第3の誤り検出符号列との照合に応じて、スタック破壊を検出する、
    処理をコンピュータに実行させるスタック破壊検出プログラム。
JP2017168720A 2017-09-01 2017-09-01 情報処理装置およびスタック破壊検出プログラム Active JP6905190B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2017168720A JP6905190B2 (ja) 2017-09-01 2017-09-01 情報処理装置およびスタック破壊検出プログラム
US16/111,694 US10586039B2 (en) 2017-09-01 2018-08-24 Information processing apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017168720A JP6905190B2 (ja) 2017-09-01 2017-09-01 情報処理装置およびスタック破壊検出プログラム

Publications (2)

Publication Number Publication Date
JP2019046164A JP2019046164A (ja) 2019-03-22
JP6905190B2 true JP6905190B2 (ja) 2021-07-21

Family

ID=65517389

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017168720A Active JP6905190B2 (ja) 2017-09-01 2017-09-01 情報処理装置およびスタック破壊検出プログラム

Country Status (2)

Country Link
US (1) US10586039B2 (ja)
JP (1) JP6905190B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9459974B2 (en) * 2014-05-28 2016-10-04 International Business Machines Corporation Recovery mechanisms across storage nodes that reduce the impact on host input and output operations
WO2018150956A1 (ja) * 2017-02-17 2018-08-23 日本精機株式会社 車両用表示装置

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4722052A (en) * 1984-04-02 1988-01-26 Sperry Corporation Multiple unit adapter
US4821228A (en) * 1986-12-24 1989-04-11 Hewlett-Packard Company Method and apparatus for computation stack recovery in a calculator
US5701313A (en) * 1995-02-24 1997-12-23 Unisys Corporation Method and apparatus for removing soft errors from a memory
US7380245B1 (en) * 1998-11-23 2008-05-27 Samsung Electronics Co., Ltd. Technique for detecting corruption associated with a stack in a storage device
JP3552627B2 (ja) 2000-02-04 2004-08-11 インターナショナル・ビジネス・マシーンズ・コーポレーション スタック保護システム、コンピュータシステム、コンパイラ、スタック保護方法および記憶媒体
JP2006309375A (ja) * 2005-04-27 2006-11-09 Hitachi Ltd システム情報に基づいて動作する記憶装置システム及びその記憶装置システムの制御方法
US8510596B1 (en) * 2006-02-09 2013-08-13 Virsec Systems, Inc. System and methods for run time detection and correction of memory corruption
JP5039728B2 (ja) * 2009-02-24 2012-10-03 三菱重工業株式会社 コンピュータメモリにおけるスタック領域のデータの保護方法
JP2012174198A (ja) * 2011-02-24 2012-09-10 Denso Corp 異常検出装置、および異常検出プログラム
WO2013156823A1 (en) * 2012-04-20 2013-10-24 Freescale Semiconductor, Inc. Information processing device and method for protecting data in a call stack
US10228992B2 (en) * 2016-01-06 2019-03-12 International Business Machines Corporation Providing instructions to facilitate detection of corrupt stacks
JP6798157B2 (ja) * 2016-06-24 2020-12-09 大日本印刷株式会社 電子情報記憶媒体、異常検知方法、及び異常検知プログラム

Also Published As

Publication number Publication date
JP2019046164A (ja) 2019-03-22
US20190073260A1 (en) 2019-03-07
US10586039B2 (en) 2020-03-10

Similar Documents

Publication Publication Date Title
JP3196004B2 (ja) 障害回復処理方法
US7774636B2 (en) Method and system for kernel panic recovery
JP4841632B2 (ja) ロジカル・パーティションにプロセッサを割り当てるための方法、装置、およびプログラム
JP5161696B2 (ja) 仮想計算機システムおよび仮想計算機システムにおけるエラー回復方法ならびに仮想計算機制御プログラム
US6345351B1 (en) Maintenance of speculative state of parallel executed jobs in an information processing system
US7757237B2 (en) Synchronization of threads in a multithreaded computer program
US10831616B2 (en) Resilient programming frameworks for iterative computations
US7895477B2 (en) Resilience to memory errors with firmware assistance
US20180300142A1 (en) Coalescing store instructions for restoration
JP4937022B2 (ja) 順序関係解析装置、方法及びプログラム
US6665708B1 (en) Coarse grained determination of data dependence between parallel executed jobs in an information processing system
JP2017037370A (ja) 計算機、プロセス制御方法およびプロセス制御プログラム
JP5031470B2 (ja) メモリ管理方法、情報処理装置及びメモリ管理プログラム
JP6905190B2 (ja) 情報処理装置およびスタック破壊検出プログラム
US7953914B2 (en) Clearing interrupts raised while performing operating system critical tasks
US7661016B2 (en) Method for a checkpoint library to detect corruption by an application
CN112612537A (zh) 配置数据缓存方法、装置、设备及存储介质
US8195981B2 (en) Memory metadata used to handle memory errors without process termination
CN115858211A (zh) 机器检查错误的处理方法及装置
WO2014024279A1 (ja) メモリ障害リカバリ装置、方法、及びプログラム
JP5018140B2 (ja) マルチプロセッサシステム、タスクスケジューリング方法およびタスクスケジューリングプログラム
JP2000222221A (ja) コンパイル方法および装置、並びにメソッド活動度計算方法および装置
JPWO2014006694A1 (ja) 情報処理装置、情報保存処理プログラム及び情報保存処理方法
CN116185902B (zh) 一种表切分方法、系统、电子设备及可读介质
Zhang et al. Software-Based Detecting and Recovering from ECC-Memory Faults

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20200611

RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20200625

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20200625

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20210426

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20210525

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20210607

R150 Certificate of patent or registration of utility model

Ref document number: 6905190

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150