(57)【要約】【課題】プログラム実行時に動的にスタック有効範囲外の不当アクセスを検出可能にする。【解決手段】マイクロコンピュータ（１００）は、スタック領域が形成されるメモリ（１１）と、上記メモリをアクセス可能なＣＰＵ（１３）とを含む。上記スタック領域の上限値と現在使用中のスタック位置を示すスタックポインタの上限値との間の領域が上記ＣＰＵによってアクセスされたことを検出するスタックアクセス検出回路（１６）を含み、上記ＣＰＵは、上記スタックアクセス検出回路の検出結果に基づいて所定の例外処理を実行する。スタック領域の上限値と現在使用中のスタック位置を示すスタックポインタの上限値との間は、動的スタック無効領域とされるので、上記スタックアクセス検出回路の検出結果に基づいて所定の例外処理を実行することで、上記不当アクセスを検出できる。【選択図】図１
2012133648.tif 000002
【特許請求の範囲】
【請求項１】
スタック領域が形成されるメモリと、
上記メモリをアクセス可能なＣＰＵと、を含むマイクロコンピュータであって、
上記スタック領域の上限値と現在使用中のスタック位置を示すスタックポインタの上限値との間の領域が上記ＣＰＵによってアクセスされたことを検出するスタックアクセス検出回路を含み、
上記ＣＰＵは、上記スタックアクセス検出回路の検出結果に基づいて所定の例外処理を実行することを特徴とするマイクロコンピュータ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マイクロコンピュータ、さらにはそれにおけるスタック領域の動的チェック機能に関する。
【背景技術】
【０００２】
特許文献１には、スタックの最終書込み位置を示すスタックポインタが所定領域を越えたことを検出するスタックオーバーフロー検出技術について記載されている。それによれば、ラスインファーストアウト方式によりアクセスされるスタックと、このスタックの最終書込み位置を示すポインタが、スタックに予め割り付けられた領域を越えたか否かを検出する検出手段を備える。スタックへのアクセス時に更新されるスタックポインタがそれ以前のスタックポインタの上限値を越えたときに、そのスタックポインタを新たな上限値として保持する保持手段を有する。上記検出手段は、所定のタイミングで、上記保持手段に保持されているスタックポインタの上限値を検査する。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平０４−２６６１４１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
従来のマイクロコンピュータにおけるスタック領域の動的チェック機能について、本願発明者が検討したところ、以下のような課題が見いだされた。
【０００５】
例えばＣコンパイラの生成するコードに誤りがあり、スタックエリアの範囲外をアクセスするコードが出力された場合を想定する。この場合、生成された誤りのあるコードを実行してもテストで１００％検出できるとは限らず、オブジェクトプログラムの影響有無の確認に多大な労力が必要である。
【０００６】
またアセンブリ言語を使ってプログラムを作成する場合において、誤ってスタックアクセス範囲外のコードを記述した場合も同様に検出困難になることが考えられる。
【０００７】
自動車の制御システムやプラント制御システム、医療機器等の分野においては、特に機能安全に関する規格遵守が求められ、そのようなシステムにおいて、プログラム実行時に動的にスタック有効範囲外の不当アクセスを検出する機能をマイクロコンピュータ自身に搭載することは重要と考えられる。
【０００８】
本発明の目的は、プログラム実行時に動的にスタック有効範囲外の不当アクセスを検出可能なマイクロコンピュータを提供することにある。
【０００９】
本発明の前記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１０】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００１１】
すなわち、スタック領域が形成されるメモリと、上記メモリをアクセス可能なＣＰＵとを含んでマイクロコンピュータを構成する。上記スタック領域の上限値と現在使用中のスタック位置を示すスタックポインタの上限値との間の領域が上記ＣＰＵによってアクセスされたことを検出するスタックアクセス検出回路を設ける。上記ＣＰＵは、上記スタックアクセス検出回路の検出結果に基づいて所定の例外処理を実行する。
【発明の効果】
【００１２】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記のとおりである。
【００１３】
すなわち、プログラム実行時に動的にスタック有効範囲外の不当アクセスを検出可能なマイクロコンピュータを提供することができる。
【図面の簡単な説明】
【００１４】
【図１】本発明にかかるマイクロコンピュータにおける主要部の構成例ブロック図である。
【図２】Ｃプログラムが一般的なマイクロコンピュータで実行された場合の説明図である。
【図３】Ｃプログラムが一般的なマイクロコンピュータで実行された場合の説明図である。
【図４】Ｃプログラムが一般的なマイクロコンピュータで実行された場合の説明図である。
【図５】本発明にかかるマイクロコンピュータの全体的な構成例ブロック図である。
【発明を実施するための形態】
【００１５】
１．実施の形態の概要
先ず、本願において開示される発明の代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００１６】
本発明の代表的な実施の形態に係るマイクロコンピュータ（１００）は、スタック領域が形成されるメモリ（１１）と、上記メモリをアクセス可能なＣＰＵ（１３）とを含む。上記スタック領域の上限値と現在使用中のスタック位置を示すスタックポインタの上限値との間の領域が上記ＣＰＵによってアクセスされたことを検出するスタックアクセス検出回路（１６）を含み、上記ＣＰＵは、上記スタックアクセス検出回路の検出結果に基づいて所定の例外処理を実行する。
【００１７】
上記の構成によれば、スタックアクセス検出回路は、上記スタック領域の上限値と現在使用中のスタック位置を示すスタックポインタの上限値との間の領域が上記ＣＰＵによってアクセスされたことを検出する。上記ＣＰＵは、上記スタックアクセス検出回路の検出結果に基づいて所定の例外処理を実行する。スタック領域の上限値と現在使用中のスタック位置を示すスタックポインタの上限値との間は、動的スタック無効領域とされ、プログラムが正常であれば、当該プログラム実行中にこの動的スタック無効領域がＣＰＵによってアクセスされることはない。もし、動的スタック無効領域がＣＰＵによってアクセスされた場合、そのことがスタックアクセス検出回路によて検出され、上記ＣＰＵによって所定の例外処理が実行されることにより、動的スタック無効領域へのアクセス発生を知ることができる。
【００１８】
２．実施の形態の詳細
実施の形態について更に詳述する。
【００１９】
《実施の形態１》
図５には、本発明にかかるマイクロコンピュータの構成例が示される。
【００２０】
図５に示されるマイクロコンピュータ１００は、特に制限されないが、ＲＡＭ（ランダムアクセスメモリ１１、ＲＯＭ（リードオンリーメモリ）１２、ＣＰＵ（中央処理装置）１３、及びスタックアクセス検出回路１６を含み、公知の半導体集積回路製造技術により、単結晶シリコン基板などのひとつの半導体基板に形成される。ＲＡＭ１１、ＲＯＭ１２、ＣＰＵ１３、及びスタックアクセス検出回路１６は、バス１７によって互いに信号のやり取りが可能に結合されている。ＣＰＵ１３は、演算ユニット１４と汎用レジスタ１５とを含み、予め設定されたプログラムを実行する。演算ユニット１４は、フェッチされた命令に従って演算処理を行う。この演算処理において汎用レジスタ１５が利用される。ＲＯＭ１２には、ＣＰＵ１３で実行されるプログラムが格納される。ＲＡＭ１１は、ＣＰＵ１３によってアクセス可能とされ、このＲＡＭ１１を利用してスタック領域が形成される。このスタック領域には、データを後入れ先出し(LIFO: Last In First Out; FILO: First In Last Out)の構造で保持される。スタック領域の位置は、スタックポインタによって示される。スタックアクセス検出回路１６は、ＲＡＭ１１内に形成されたスタック領域の上限値と現在使用中のスタック位置を示すスタックポインタの上限値との間の領域が上記ＣＰＵによってアクセスされたことを検出する。この検出は、バス１７をモニタすることで可能になる。ＣＰＵ１３は、上記スタックアクセス検出回路１６の検出結果に基づいて所定の例外処理に遷移される。
【００２１】
図１には、上記ＲＡＭ１１とスタックアクセス検出回路１６との関係が示される。
【００２２】
ＲＡＭ１１には、上位アドレスから順に、命令コード領域、データ領域、静的スタック有効領域が形成される。静的スタック有効領域は、動的スタック無効領域と動的スタック有効領域とを含む。静的スタック領域の上限値（「静的スタック上限値」という）は、ユーザによって指定され、それは静的スタック上限値レジスタ１９に保持される。また、現在使用中のスタック位置は、スタックポインタ１８によって示される。スタックポインタ１８や静的スタック上限値レジスタ１９は、汎用レジスタ１５内に形成される。スタックポインタ１８の上限値や静的スタック上限値レジスタ１９の値は、スタックアクセス検出回路１６に伝達されるものとする。
【００２３】
静的スタック上限値レジスタ１９に静的スタック上限値が設定された状態で、ＣＰＵ１４によってＲＯＭ１２又はＲＡＭ１１から命令コードがフェッチされ、それが実行される。そしてこの命令コードの実行中に、
メモリアクセスが発生したときに、スタックアクセス検出回路１６によって、妥当なスタック領域が参照されているか否かの判別が行われる。ＲＡＭ１１内に形成されたスタック領域の上限値とスタックポインタ１８の上限値との間は、動的スタック無効領域とされ、プログラムが正常であれば、当該プログラム実行中にこの動的スタック無効領域がＣＰＵ１３によってアクセスされることはない。もし、動的スタック無効領域がＣＰＵ１３によってアクセスされた場合、そのことがスタックアクセス検出回路１６によて検出される。そしてスタックアクセス検出回路１６は、動的スタック無効領域がＣＰＵ１３によってアクセスされたことを検出した場合、ＣＰＵ１３に対する割り込みを発生する。この割り込みにより、ＣＰＵ１３においてスタックアクセス例外処理が実行され、例えばプログラム実行エラー表示等が行われる。このエラー表示等によりユーザは、動的スタック無効領域へのアクセス発生を知ることができる。
【００２４】
ここで、Ｃ言語で記述された一般的なプログラムが、一般的なマイクロコンピュータで実行される場合について説明する。
【００２５】
例えば図２に示されるようなＣプログラム２０１が一般的なマイクロコンピュータ１０で実行された場合、関数ｆの入口では関数f内で宣言された変数がスタック領域に確保され、スタックポインタは、静的スタック有効領域内の動的スタック有効領域の上限値を指し示す。次に図３に示されるように、Ｃプログラム２０１の関数fから関数gを呼び出して、関数gの入口では、関数g内で宣言された変数をスタック領域に確保し、スタックポインタ１８を更新して、動的スタックの上限値を変更する。
【００２６】
一般的なマイクロコンピュータ１０は、予め確保したスタック領域の上限値（静的スタック上限値）を定義し、その範囲内で、現在使用中のスタックを指し示すスタックポインタの値（動的スタック上限値）が静的スタック上限値を超えるかどうかを検出する機構を持つ。しかしながら、プログラムを実行中に、動的スタック無効領域に何らかの不正なアクセスに対して検出する機構は持たない。そのため、図４に示されるように、コンパイラなどが生成した命令コードにこの動的スタック無効領域に不正にアクセスする命令が含まれていても、それを検出することはできない。
【００２７】
これに対して、図１及び図５に示されるマイクロコンピュータ１００によれば、スタックアクセス検出回路１６が設けられているため、本来アクセスしてはならないスタック有効領域以外のスタック領域（動的スタック無効領域）へのアクセスを簡単に検出することができる。従って、このマイクロコンピュータ１００は、当該マイクロコンピュータ１００で実行されるプログラムのテスト機能や、量産後のプログラム不具合の検出機能を発揮することができる。また、マイクロコンピュータ１００は、パイラが生成するコードが正しいかどうかをチェックできることから、コンパイラ自身のテスト装置としての効果も期待できる。
【００２８】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【符号の説明】
【００２９】
１１  ＲＡＭ
１２  ＲＯＭ
１３  ＣＰＵ
１４  演算ユニット
１５  汎用レジスタ
１６  スタックアクセス検出回路
１７  バス
１８  スタックポインタ
１９  静的スタック上限レジスタ
【図１】
2012133648.tif 000003
【図２】
2012133648.tif 000004
【図３】
2012133648.tif 000005
【図４】
2012133648.tif 000006
【図５】
2012133648.tif 000007