JP2000259410A - マイクロプロセッサ - Google Patents
マイクロプロセッサInfo
- Publication number
- JP2000259410A JP2000259410A JP11062790A JP6279099A JP2000259410A JP 2000259410 A JP2000259410 A JP 2000259410A JP 11062790 A JP11062790 A JP 11062790A JP 6279099 A JP6279099 A JP 6279099A JP 2000259410 A JP2000259410 A JP 2000259410A
- Authority
- JP
- Japan
- Prior art keywords
- register
- latch
- value
- stack area
- stack
- 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.)
- Pending
Links
Landscapes
- Storage Device Security (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
- Executing Machine-Instructions (AREA)
- Debugging And Monitoring (AREA)
Abstract
(57)【要約】
【課題】 ソフトウェア開発のデバッグ段階において、
スタック領域の破壊を即時に発見して二次、三次障害を
未然に防止し、これによりデバッグ効率を向上して工数
低減を図ることができるマイクロプロセッサ技術を提供
する。 【解決手段】 マイクロプロセッサのスタックポインタ
を、スタック領域の先頭アドレスを設定するベースレジ
スタと、ベースアドレスから実際のスタックポインタま
でのオフセット値を設定するオフセットレジスタとの2
つに分け、更にオフセット値が取り得る範囲をマスクピ
ットパターンで設定するマスクレジスタを設けること
で、オフセット値とマスク値の論理積の結果から、スタ
ック領域のオーバーフローによるスタック領域の破壊が
検出できる。
スタック領域の破壊を即時に発見して二次、三次障害を
未然に防止し、これによりデバッグ効率を向上して工数
低減を図ることができるマイクロプロセッサ技術を提供
する。 【解決手段】 マイクロプロセッサのスタックポインタ
を、スタック領域の先頭アドレスを設定するベースレジ
スタと、ベースアドレスから実際のスタックポインタま
でのオフセット値を設定するオフセットレジスタとの2
つに分け、更にオフセット値が取り得る範囲をマスクピ
ットパターンで設定するマスクレジスタを設けること
で、オフセット値とマスク値の論理積の結果から、スタ
ック領域のオーバーフローによるスタック領域の破壊が
検出できる。
Description
【0001】
【発明の属する技術分野】本発明は、ソフトウェアの開
発、特にマルチタスクシステムのデバッグにおいて、ス
タック領域内外の破壊による二次、三次障害を未然に防
止する場合に好適なマイクロプロセッサ技術に関する。
発、特にマルチタスクシステムのデバッグにおいて、ス
タック領域内外の破壊による二次、三次障害を未然に防
止する場合に好適なマイクロプロセッサ技術に関する。
【0002】
【従来の技術】例えば、メモリマネージメントユニット
を持たない計算機を用いたマルチタスクOS(オペレーテ
ィングシステム)においては、ハードウェアブレークポ
イントを利用して、スタック領域のオーバーフローおよ
びアンダーフローによるスタック領域破壊の検出が可能
である。
を持たない計算機を用いたマルチタスクOS(オペレーテ
ィングシステム)においては、ハードウェアブレークポ
イントを利用して、スタック領域のオーバーフローおよ
びアンダーフローによるスタック領域破壊の検出が可能
である。
【0003】また、メモリマネージメントユニットを持
つ計算機を用いたマルチタスクOSにおいては、メモリ空
間上を4Kバイトなどの既定サイズのページ単位に区切
り、個々のページに対してアクセス可能なプロセスIDを
定義することによって、あるプロセスがアクセスの許さ
れないページに対してアクセスしたことをハードウェア
的に検出することが可能である。
つ計算機を用いたマルチタスクOSにおいては、メモリ空
間上を4Kバイトなどの既定サイズのページ単位に区切
り、個々のページに対してアクセス可能なプロセスIDを
定義することによって、あるプロセスがアクセスの許さ
れないページに対してアクセスしたことをハードウェア
的に検出することが可能である。
【0004】
【発明が解決しようとする課題】前記のようなマルチタ
スクOS技術において、スタック領域破壊の検出は不可能
ではないが、対象目的とは関係のない不要な手続きが必
要であったり、また検出できても直接の障害の検出につ
ながらない場合がほとんどであり、現実的ではないと考
えられる。
スクOS技術において、スタック領域破壊の検出は不可能
ではないが、対象目的とは関係のない不要な手続きが必
要であったり、また検出できても直接の障害の検出につ
ながらない場合がほとんどであり、現実的ではないと考
えられる。
【0005】たとえば、前記ハードウェアブレークポイ
ントを利用する場合については、スタック領域の先頭ア
ドレスに予めブレークポイントを設定することでスタッ
クオーバーフローを検出できるが、ピンポイントでの設
定では実際にスタックオーバーフローが起きても、ブレ
ークポイントとして設定したアドレスに必ずメモリアク
セスが発生するとは限らず、単にスタックポインタがブ
レークポイントアドレスを飛び越えてしまう場合を検出
することができない。また、ブレークポイントアドレス
の下位ビットをマスクして特定の領域に対してハードウ
ェアブレークポイントを設定できるような場合では、そ
のブレークポイントが張られた領域へのメモリアクセス
全てを検出してしまうため、その領域を他の目的で使用
することができない。つまり、2つのタスクのスタック
エリアを連続したメモリ領域に配置するといったことが
できなくなる。また、ブレークポイントアドレスの下位
ビットをマスクしている関係から、スタック領域の先頭
アドレスを2のべき乗の値で表されるアドレス境界にア
ライメントする必要性があり、メモリレイアウトなどの
面で制限を被ることになる。これは、少ないランダムア
クセスメモリ(RAM)でシステムを実現しなければなら
ない組込みシステムではデメリットとなる。
ントを利用する場合については、スタック領域の先頭ア
ドレスに予めブレークポイントを設定することでスタッ
クオーバーフローを検出できるが、ピンポイントでの設
定では実際にスタックオーバーフローが起きても、ブレ
ークポイントとして設定したアドレスに必ずメモリアク
セスが発生するとは限らず、単にスタックポインタがブ
レークポイントアドレスを飛び越えてしまう場合を検出
することができない。また、ブレークポイントアドレス
の下位ビットをマスクして特定の領域に対してハードウ
ェアブレークポイントを設定できるような場合では、そ
のブレークポイントが張られた領域へのメモリアクセス
全てを検出してしまうため、その領域を他の目的で使用
することができない。つまり、2つのタスクのスタック
エリアを連続したメモリ領域に配置するといったことが
できなくなる。また、ブレークポイントアドレスの下位
ビットをマスクしている関係から、スタック領域の先頭
アドレスを2のべき乗の値で表されるアドレス境界にア
ライメントする必要性があり、メモリレイアウトなどの
面で制限を被ることになる。これは、少ないランダムア
クセスメモリ(RAM)でシステムを実現しなければなら
ない組込みシステムではデメリットとなる。
【0006】一方、メモリマネージメントユニット(MM
U)を利用する場合については、オーバーフローなどの
メモリアクセス例外を検出したいスタック領域を特定の
ページ上に配置して実装する。例えば、プロセスID=
1の領域をメモリ上の0x1000〜0x1fff(ページサイズ4
Kバイト)に配置し、プロセスID=2の領域をメモリ
上の0x2000〜0x2fffに配置するといった感じである。こ
の場合、プロセスID=2のタスクは0x2000〜0x2fffの
領域に対しては自由にメモリアクセスできるが、0x1000
〜0x1fffの領域に対してメモリアクセスを行なった場
合、アクセス例外などの異常検出割込みが発生し、スタ
ックオーバーフローの検出が可能となるわけである。し
かし、全てのタスクのスタック領域をそれぞれ異なるペ
ージ上に配置した場合、各タスクのスタックサイズに関
係なく、最低でも(MMUのページサイズ)×(タスクの
数)分のRAMが必要となる。仮にページサイズを 4Kバイ
ト、各タスクの平均的なスタックサイズを2Kバイト、総
タスク数を30とした場合、本来なら60Kバイトで済むは
ずの総スタック領域サイズが、実際には120Kバイトも領
域を確保しなければならなくなる。このようにMMUでは
ページサイズという概念があるために、それよりも小さ
いスタック領域を設定しようとすると残った部分が無駄
になってしまう。ワークステーションやパーソナルコン
ピュータといった非常に多くのRAMを搭載するシステム
では、この程度のメモリ消費は微々たるものであるが、
組込みシステムなどのような小規模なシステムでは少な
いRAM資源を無駄使いするわけにはいかない。さらに、M
MUを実装しようとした場合、仮想メモリ空間と物理メモ
リ空間とのメモリレイアウトの対応表をページテーブル
として持たせ、これをTLB(Translate Lookaside Buffe
r)と呼ばれるMMU用の専用エントリへ登録するなどの作
業が必要である。しかし、これらはスタック領域のオー
バーフローを検出するためとは直接関係のない手続きで
あり、余分な工数を強いられることになり非常に効率が
悪い。実際に、これらTLBエントリへの登録部分(テー
ブルウォーク)のデバッグなどに時間が割かれてしまう
可能性がある。
U)を利用する場合については、オーバーフローなどの
メモリアクセス例外を検出したいスタック領域を特定の
ページ上に配置して実装する。例えば、プロセスID=
1の領域をメモリ上の0x1000〜0x1fff(ページサイズ4
Kバイト)に配置し、プロセスID=2の領域をメモリ
上の0x2000〜0x2fffに配置するといった感じである。こ
の場合、プロセスID=2のタスクは0x2000〜0x2fffの
領域に対しては自由にメモリアクセスできるが、0x1000
〜0x1fffの領域に対してメモリアクセスを行なった場
合、アクセス例外などの異常検出割込みが発生し、スタ
ックオーバーフローの検出が可能となるわけである。し
かし、全てのタスクのスタック領域をそれぞれ異なるペ
ージ上に配置した場合、各タスクのスタックサイズに関
係なく、最低でも(MMUのページサイズ)×(タスクの
数)分のRAMが必要となる。仮にページサイズを 4Kバイ
ト、各タスクの平均的なスタックサイズを2Kバイト、総
タスク数を30とした場合、本来なら60Kバイトで済むは
ずの総スタック領域サイズが、実際には120Kバイトも領
域を確保しなければならなくなる。このようにMMUでは
ページサイズという概念があるために、それよりも小さ
いスタック領域を設定しようとすると残った部分が無駄
になってしまう。ワークステーションやパーソナルコン
ピュータといった非常に多くのRAMを搭載するシステム
では、この程度のメモリ消費は微々たるものであるが、
組込みシステムなどのような小規模なシステムでは少な
いRAM資源を無駄使いするわけにはいかない。さらに、M
MUを実装しようとした場合、仮想メモリ空間と物理メモ
リ空間とのメモリレイアウトの対応表をページテーブル
として持たせ、これをTLB(Translate Lookaside Buffe
r)と呼ばれるMMU用の専用エントリへ登録するなどの作
業が必要である。しかし、これらはスタック領域のオー
バーフローを検出するためとは直接関係のない手続きで
あり、余分な工数を強いられることになり非常に効率が
悪い。実際に、これらTLBエントリへの登録部分(テー
ブルウォーク)のデバッグなどに時間が割かれてしまう
可能性がある。
【0007】また、マルチタスクシステムにおいては、
各タスクや割込みハンドラがいつ実行されるかはそのと
きのシステム環境や周辺装置の動作状況などに依存して
おり、実際に動作させてみるまで分からない。そのた
め、例えばタスク1がタスク2のスタック領域を破壊し
たとしても、それによる動作不具合はタスク2が実行さ
れるまで表面的に現れることはない。また、同様に各タ
スクがOSのカーネル資源(カーネルが管理しているワー
クエリア等)を破壊した場合などは、その後のカーネル
の異常動作が全てのタスクや割込みハンドラに影響を及
ぼし、システムとしての安定性を一気に損なう結果とな
る。ここで仮にアプリケーションを開発しているユーザ
がデバッグを試みたとしても、ユーザがOSカーネルの内
部情報についてその詳細を知ることは少なく、やはりデ
バッグそのものが困難となる。このようにスタックのオ
ーバーフローまたはアンダーフローによって起こる他メ
モリ領域破壊の障害は即時に発見できるものではないと
同時に、非常にデバッグが困難である。
各タスクや割込みハンドラがいつ実行されるかはそのと
きのシステム環境や周辺装置の動作状況などに依存して
おり、実際に動作させてみるまで分からない。そのた
め、例えばタスク1がタスク2のスタック領域を破壊し
たとしても、それによる動作不具合はタスク2が実行さ
れるまで表面的に現れることはない。また、同様に各タ
スクがOSのカーネル資源(カーネルが管理しているワー
クエリア等)を破壊した場合などは、その後のカーネル
の異常動作が全てのタスクや割込みハンドラに影響を及
ぼし、システムとしての安定性を一気に損なう結果とな
る。ここで仮にアプリケーションを開発しているユーザ
がデバッグを試みたとしても、ユーザがOSカーネルの内
部情報についてその詳細を知ることは少なく、やはりデ
バッグそのものが困難となる。このようにスタックのオ
ーバーフローまたはアンダーフローによって起こる他メ
モリ領域破壊の障害は即時に発見できるものではないと
同時に、非常にデバッグが困難である。
【0008】なお、スタックのオーバーフローが起きる
原因として、C言語によるアプリケーション開発におい
ては、多段階の関数呼出しと、自動変数での配列や構造
体といった大きなサイズの領域確保が挙げられる。1つ
目の多段階の関数呼出しは、多人数によるアプリケーシ
ョン開発を行なっていると知らず知らずのうちに起こっ
ていることがある。デバイスドライバやシステムライブ
ラリといった各種サブルーチンをブラックボックス的に
使っている場合、ユーザが意図しないところで幾重にも
サブルーチンコールが行なわれスタックが消費されてい
く。また、再帰関数などはちょっとした不注意で何重に
もループしてしまう場合があり容易にスタックを消費す
ることとなる。また、関数内で自動変数として配列や構
造体を定義すると、これらの領域はスタック上に確保さ
れるため、これもまたスタック領域を多く消費し、スタ
ックオーバーフローを引き起こす原因となる。
原因として、C言語によるアプリケーション開発におい
ては、多段階の関数呼出しと、自動変数での配列や構造
体といった大きなサイズの領域確保が挙げられる。1つ
目の多段階の関数呼出しは、多人数によるアプリケーシ
ョン開発を行なっていると知らず知らずのうちに起こっ
ていることがある。デバイスドライバやシステムライブ
ラリといった各種サブルーチンをブラックボックス的に
使っている場合、ユーザが意図しないところで幾重にも
サブルーチンコールが行なわれスタックが消費されてい
く。また、再帰関数などはちょっとした不注意で何重に
もループしてしまう場合があり容易にスタックを消費す
ることとなる。また、関数内で自動変数として配列や構
造体を定義すると、これらの領域はスタック上に確保さ
れるため、これもまたスタック領域を多く消費し、スタ
ックオーバーフローを引き起こす原因となる。
【0009】一方、スタックのアンダーフローが起こる
最も簡単な例は配列変数で説明することができる。これ
は関数内で自動変数として配列を定義し、その添え字と
して配列要素数の最大値よりも大きな値が与えられたと
きに容易に起こる。具体的には、関数内でchar tmp[1
0];などと宣言しておきながら、tmp[i]などのような記
述をした場合に、もしi=100であったならばスタックの
アンダーフローが発生し、自タスクスタックよりも上位
アドレスにあるメモリ領域をアクセスすることとなる。
しかし、実際にアクセスしたメモリはtmp[]という配列
変数のために確保されたメモリ領域ではない、つまり全
く関係のないメモリ領域をアクセスしたことになり、も
しこのメモリアドレス部分に書き込みなどをした場合
は、他のメモリ領域を破壊したことになる。
最も簡単な例は配列変数で説明することができる。これ
は関数内で自動変数として配列を定義し、その添え字と
して配列要素数の最大値よりも大きな値が与えられたと
きに容易に起こる。具体的には、関数内でchar tmp[1
0];などと宣言しておきながら、tmp[i]などのような記
述をした場合に、もしi=100であったならばスタックの
アンダーフローが発生し、自タスクスタックよりも上位
アドレスにあるメモリ領域をアクセスすることとなる。
しかし、実際にアクセスしたメモリはtmp[]という配列
変数のために確保されたメモリ領域ではない、つまり全
く関係のないメモリ領域をアクセスしたことになり、も
しこのメモリアドレス部分に書き込みなどをした場合
は、他のメモリ領域を破壊したことになる。
【0010】以上のように、スタック領域のオーバーフ
ローやアンダーフローというものは容易に起こり易いに
も関わらず、マルチタスクシステム上ではその早期発見
は非常に難しい。また、この障害により、二次、三次障
害が発生しプログラムの誤動作につながる。例を挙げる
と、まず第1の障害としてタスク1がタスク2のスタッ
ク領域を破壊したとする。もし、その破壊されたものが
タスク2にとって関数リターンの戻りアドレスであった
場合、タスク2は全く予期せぬアドレスへ制御を移すこ
ととなる。ここでそのリターン先がプログラムコード領
域ではなくデータ領域などであった場合は、プログラム
が暴走し、もはや何が起こるかは予想できない。こうな
ると、もはや根本的な原因を追求することは非常に困難
である。なぜなら、タスク1、タスク2の間には何の因
果関係もないし、さらにこれらのタスクがいつ起動する
かはその開発者でさえ予想することができないからであ
る。以上のように、デバッグにおいて二次、三次障害が
発生すると、根本的な原因究明に多大な時間を費やして
しまうということが考えられる。
ローやアンダーフローというものは容易に起こり易いに
も関わらず、マルチタスクシステム上ではその早期発見
は非常に難しい。また、この障害により、二次、三次障
害が発生しプログラムの誤動作につながる。例を挙げる
と、まず第1の障害としてタスク1がタスク2のスタッ
ク領域を破壊したとする。もし、その破壊されたものが
タスク2にとって関数リターンの戻りアドレスであった
場合、タスク2は全く予期せぬアドレスへ制御を移すこ
ととなる。ここでそのリターン先がプログラムコード領
域ではなくデータ領域などであった場合は、プログラム
が暴走し、もはや何が起こるかは予想できない。こうな
ると、もはや根本的な原因を追求することは非常に困難
である。なぜなら、タスク1、タスク2の間には何の因
果関係もないし、さらにこれらのタスクがいつ起動する
かはその開発者でさえ予想することができないからであ
る。以上のように、デバッグにおいて二次、三次障害が
発生すると、根本的な原因究明に多大な時間を費やして
しまうということが考えられる。
【0011】すなわち、ソフトウェアの開発、特にマル
チタスクシステムのデバッグにおいて、スタック領域の
破壊やスタック領域のオーバーフローやアンダーフロー
により、二次、三次障害につながり、障害の原因究明に
多大な労力、費用を費やすことが考えられる。
チタスクシステムのデバッグにおいて、スタック領域の
破壊やスタック領域のオーバーフローやアンダーフロー
により、二次、三次障害につながり、障害の原因究明に
多大な労力、費用を費やすことが考えられる。
【0012】そこで、本発明の目的は、以上の問題を解
決し、マルチタスクシステムのデバッグにおいて、スタ
ック領域の破壊を即時に発見し、これによる二次、三次
障害を未然に防止することができ、またマルチタスクシ
ステムのデバッグ効率を向上し、工数低減を図ることが
できるマイクロプロセッサを提供することにある。
決し、マルチタスクシステムのデバッグにおいて、スタ
ック領域の破壊を即時に発見し、これによる二次、三次
障害を未然に防止することができ、またマルチタスクシ
ステムのデバッグ効率を向上し、工数低減を図ることが
できるマイクロプロセッサを提供することにある。
【0013】
【課題を解決するための手段】本題において開示される
発明のうち、代表的なものの概要を簡単に説明すれば以
下の通りである。
発明のうち、代表的なものの概要を簡単に説明すれば以
下の通りである。
【0014】すなわち、本発明のマイクロプロセッサ
は、マイクロコンピュータが有する中央処理装置に適用
されるものであり、前記中央処理装置にスタック領域の
先頭アドレス値から現在のスタックポインタ値までのオ
フセット値と、所定のマスクビットパターン値との論理
積の結果によりスタック領域のオーバーフローならびに
アンダーフローを検出するスタック領域異常検出手段を
内蔵するものである。
は、マイクロコンピュータが有する中央処理装置に適用
されるものであり、前記中央処理装置にスタック領域の
先頭アドレス値から現在のスタックポインタ値までのオ
フセット値と、所定のマスクビットパターン値との論理
積の結果によりスタック領域のオーバーフローならびに
アンダーフローを検出するスタック領域異常検出手段を
内蔵するものである。
【0015】具体的には、前記スタック領域異常検出手
段の制御レジスタとして、スタック領域の先頭アドレス
を設定する第1のレジスタと、設定されたアドレスから
実際のスタックポインタ値までのオフセット値を設定す
る第2のレジスタと、前記第2のレジスタの値がスタッ
ク領域外かどうかを判定するためのマスクビットパター
ン値を設定する第3のレジスタとを設けるようにしたも
のである。
段の制御レジスタとして、スタック領域の先頭アドレス
を設定する第1のレジスタと、設定されたアドレスから
実際のスタックポインタ値までのオフセット値を設定す
る第2のレジスタと、前記第2のレジスタの値がスタッ
ク領域外かどうかを判定するためのマスクビットパター
ン値を設定する第3のレジスタとを設けるようにしたも
のである。
【0016】これにより、第2レジスタの値と第3レジ
スタの値との論理積の結果が0でない場合に、割込みを
発生するようにする。また、ディスプレースメント付き
SP相対メモリアクセス命令で指定するディスプレースメ
ント値と前記第2レジスタとの加算値とが、第3レジス
タとの論理積の結果によって非0になった場合でも、同
様に割込みを発生するようにする。
スタの値との論理積の結果が0でない場合に、割込みを
発生するようにする。また、ディスプレースメント付き
SP相対メモリアクセス命令で指定するディスプレースメ
ント値と前記第2レジスタとの加算値とが、第3レジス
タとの論理積の結果によって非0になった場合でも、同
様に割込みを発生するようにする。
【0017】これにより、マイクロプロセッサを使った
マルチタスクシステムのデバッグにおいて、スタック領
域のオーバーフローおよびアンダーフローの検出が可能
となり、スタック領域破壊による二次、三次障害を防止
することができる。また、二次、三次障害の防止により
リアルタイムシステムのデバッグ効率の向上を図ること
ができる。
マルチタスクシステムのデバッグにおいて、スタック領
域のオーバーフローおよびアンダーフローの検出が可能
となり、スタック領域破壊による二次、三次障害を防止
することができる。また、二次、三次障害の防止により
リアルタイムシステムのデバッグ効率の向上を図ること
ができる。
【0018】
【発明の実施の形態】以下、本発明の実施の形態を図面
に基づいて詳細に説明する。
に基づいて詳細に説明する。
【0019】図1は本発明の実施の形態であるマイクロ
プロセッサのレジスタトランスファ部分の基本構成図を
示している。図2は図1のマイクロプロセッサの作用に
ついて、スタック領域異常検出の判断処理モデルをフロ
ーチャートで示している。図3は図2の判断処理モデル
におけるメモリレイアウト図を示している。
プロセッサのレジスタトランスファ部分の基本構成図を
示している。図2は図1のマイクロプロセッサの作用に
ついて、スタック領域異常検出の判断処理モデルをフロ
ーチャートで示している。図3は図2の判断処理モデル
におけるメモリレイアウト図を示している。
【0020】図1が示すレジスタトランスファ部は、命
令フェッチステージ(以下、IFステージ)、解読および
レジスタ読出しステージ(以下、DECステージ)、演算
およびオペランドアドレス計算ステージ(以下、EXステ
ージ)、メモリアクセスステージ(以下、MEMステー
ジ)、レジスタ書戻しステージ(以下、WBステージ)の
5つのステージからなる5段パイプライン構造をもつ。
令フェッチステージ(以下、IFステージ)、解読および
レジスタ読出しステージ(以下、DECステージ)、演算
およびオペランドアドレス計算ステージ(以下、EXステ
ージ)、メモリアクセスステージ(以下、MEMステー
ジ)、レジスタ書戻しステージ(以下、WBステージ)の
5つのステージからなる5段パイプライン構造をもつ。
【0021】同図中の1は機械語プログラムを格納する
ROM、2はROM1から取り出した機械語命令(以
下、命令と略す)を格納するIラッチ、3はIラッチ2
に保持された命令を解読しマイクロプロセッサの各部を
制御する命令解読器である。
ROM、2はROM1から取り出した機械語命令(以
下、命令と略す)を格納するIラッチ、3はIラッチ2
に保持された命令を解読しマイクロプロセッサの各部を
制御する命令解読器である。
【0022】4はオペランドデータまたはオペランドを
指定するためのアドレスを格納するレジスタファイルで
ある。レジスタファイル4は、主にオペランドデータを
格納するデータレジスタと、主にアドレスを格納するア
ドレスレジスタとから構成され、それぞれ4本ずつのレ
ジスタD0からD3とA0からA3とからなる。レジス
タ長は32ビットであるものとする。
指定するためのアドレスを格納するレジスタファイルで
ある。レジスタファイル4は、主にオペランドデータを
格納するデータレジスタと、主にアドレスを格納するア
ドレスレジスタとから構成され、それぞれ4本ずつのレ
ジスタD0からD3とA0からA3とからなる。レジス
タ長は32ビットであるものとする。
【0023】5、6、7は本発明によって追加されたレ
ジスタで、5はスタック領域の先頭アドレスを格納する
ベースレジスタ、6は先頭アドレス5から実際のスタッ
クポインタまでの差分を格納するオフセットレジスタ、
7はスタック領域のオーバーフローまたはアンダーフロ
ーを検出するためのマスクビットパターンを格納するマ
スクレジスタである。
ジスタで、5はスタック領域の先頭アドレスを格納する
ベースレジスタ、6は先頭アドレス5から実際のスタッ
クポインタまでの差分を格納するオフセットレジスタ、
7はスタック領域のオーバーフローまたはアンダーフロ
ーを検出するためのマスクビットパターンを格納するマ
スクレジスタである。
【0024】8はIラッチ2の出力と、レジスタファイ
ル4の出力と、加算器11の出力との3入力から1つを
選択するD1セレクタ、9はレジスタファイル4の出力
と、ベースレジスタ5の出力と、オフセットレジスタ6
との3入力から1つを選択するD2セレクタ、10はI
ラッチ2の出力と、ベースレジスタ5の出力との2入力
から1つを選択するD3セレクタである。
ル4の出力と、加算器11の出力との3入力から1つを
選択するD1セレクタ、9はレジスタファイル4の出力
と、ベースレジスタ5の出力と、オフセットレジスタ6
との3入力から1つを選択するD2セレクタ、10はI
ラッチ2の出力と、ベースレジスタ5の出力との2入力
から1つを選択するD3セレクタである。
【0025】11はD3セレクタ10の出力値と、オフ
セットレジスタ6の出力値とを加算する加算器である。
本加算器は2入力から1つを選択して出力するセレクタ
としての機能も有する。
セットレジスタ6の出力値とを加算する加算器である。
本加算器は2入力から1つを選択して出力するセレクタ
としての機能も有する。
【0026】12は加算器11の出力と、マスクレジス
タ7の出力とで論理積演算を行ない、その結果からスタ
ック領域異常割込みを発生する検出器である。両者の論
理積演算の結果が0x00000000でなければスタック領域
異常割込みを発生するための信号を生成する。
タ7の出力とで論理積演算を行ない、その結果からスタ
ック領域異常割込みを発生する検出器である。両者の論
理積演算の結果が0x00000000でなければスタック領域
異常割込みを発生するための信号を生成する。
【0027】13、14、15はD1セレクタ8、D2
セレクタ9、加算器11の出力をそれぞれ格納するD1
ラッチ、D2ラッチ、D3ラッチである。
セレクタ9、加算器11の出力をそれぞれ格納するD1
ラッチ、D2ラッチ、D3ラッチである。
【0028】16はD1ラッチ13およびD2ラッチ1
4の内容を用いて算術論理演算を行う演算器である。本
演算器は2入力から1つを選択して出力するセレクタと
しての機能も有する。
4の内容を用いて算術論理演算を行う演算器である。本
演算器は2入力から1つを選択して出力するセレクタと
しての機能も有する。
【0029】17はレジスタファイル4の出力と、D3
ラッチ15の出力との2入力から1つを選択するEセレ
クタであり、18、19は演算器16、Eセレクタ17
の出力をそれぞれ格納するE1ラッチ、E2ラッチであ
る。
ラッチ15の出力との2入力から1つを選択するEセレ
クタであり、18、19は演算器16、Eセレクタ17
の出力をそれぞれ格納するE1ラッチ、E2ラッチであ
る。
【0030】20はE1ラッチ18の出力をアドレス入
力としてデータを読み書きするRAMである。
力としてデータを読み書きするRAMである。
【0031】21はE1ラッチ18の出力と、RAM2
0の出力との2入力から1つを選択するMセレクタであ
り、22はMセレクタ21の出力の最下位から8ビット
目もしくは16ビット目の値をそれより上位側の24ビ
ットおよび16ビットにコピー(符号拡張)する符号拡
張器である。また、上位側の24ビットおよび16ビッ
トを全て0にする(ゼロ拡張)する拡張器としても動作
する。
0の出力との2入力から1つを選択するMセレクタであ
り、22はMセレクタ21の出力の最下位から8ビット
目もしくは16ビット目の値をそれより上位側の24ビ
ットおよび16ビットにコピー(符号拡張)する符号拡
張器である。また、上位側の24ビットおよび16ビッ
トを全て0にする(ゼロ拡張)する拡張器としても動作
する。
【0032】23、24は拡張器22、E2ラッチ19
の出力をそれぞれ格納するM1ラッチ、M2ラッチであ
り、25はM1ラッチ23の出力値からM2ラッチ24
の出力値を減算する減算器である。本減算器は2入力か
ら1つを選択して出力するセレクタとしての機能も有す
る。
の出力をそれぞれ格納するM1ラッチ、M2ラッチであ
り、25はM1ラッチ23の出力値からM2ラッチ24
の出力値を減算する減算器である。本減算器は2入力か
ら1つを選択して出力するセレクタとしての機能も有す
る。
【0033】上記マイクロプロセッサの構成のうちIラ
ッチ2およびレジスタファイル4、ベースレジスタ5、
オフセットレジスタ6、マスクレジスタ7、D1ラッチ
13およびD2ラッチ14およびD3ラッチ15、E1
ラッチ18およびE2ラッチ19、M1ラッチ23およ
びM2ラッチ24は、それぞれステージ間で処理結果を
受け渡すパイプラインレジスタとして設けられている。
また、ROM1とIラッチ2と命令解読器3を除く全て
の構成要素の入出力は32ビット幅を有するものとす
る。なお、加算器11、演算器16および減算器25は
2入力の演算をするだけでなく、2入力のうち1つを選
択して出力するセレクタと同様の機能を有するものとす
る。
ッチ2およびレジスタファイル4、ベースレジスタ5、
オフセットレジスタ6、マスクレジスタ7、D1ラッチ
13およびD2ラッチ14およびD3ラッチ15、E1
ラッチ18およびE2ラッチ19、M1ラッチ23およ
びM2ラッチ24は、それぞれステージ間で処理結果を
受け渡すパイプラインレジスタとして設けられている。
また、ROM1とIラッチ2と命令解読器3を除く全て
の構成要素の入出力は32ビット幅を有するものとす
る。なお、加算器11、演算器16および減算器25は
2入力の演算をするだけでなく、2入力のうち1つを選
択して出力するセレクタと同様の機能を有するものとす
る。
【0034】以上のように構成された本実施の形態によ
るマイクロプロセッサについて、その動作を説明する。
以下の命令語はアセンブリ言語形式(ニモニックとオペ
ランド)で記述しているが、実際は機械語コードとして
0と1のビットパターンで表されROM1に格納されて
いる。また、下記の標記の中でSPはスタックポインタ
レジスタを表すが、本発明ではスタックポインタレジス
タという実態はない。そこで、SPという仮想レジスタ
を、図1の回路上でベースレジスタ5とオフセットレジ
スタ6の2つのレジスタを使ってどのように再現するの
かを6つの例を挙げて詳しく述べる。
るマイクロプロセッサについて、その動作を説明する。
以下の命令語はアセンブリ言語形式(ニモニックとオペ
ランド)で記述しているが、実際は機械語コードとして
0と1のビットパターンで表されROM1に格納されて
いる。また、下記の標記の中でSPはスタックポインタ
レジスタを表すが、本発明ではスタックポインタレジス
タという実態はない。そこで、SPという仮想レジスタ
を、図1の回路上でベースレジスタ5とオフセットレジ
スタ6の2つのレジスタを使ってどのように再現するの
かを6つの例を挙げて詳しく述べる。
【0035】以下に示す6つの例において、各命令を実
行する前のレジスタの値は、ベースレジスタ5は0x9000
2010、オフセットレジスタ6は0x00000134、マスクレジ
スタ7は0xfffff000であるとする。この場合の仮想SP
レジスタ値は0x90002010+0x00000134で0x90002144とな
る。 (a)SPレジスタへの即値の代入 命令語:mov #imm,SP(仮に#immは0x90002130とする) まずIFステージでは即値である#imm=0x90002130がR
OM1から読込まれてIラッチ2にラッチされる。次に
DECステージで、Iラッチ2の出力がD1セレクタ8
を経由してD1ラッチ13にラッチされる。一方、ベー
スレジスタ5の出力がD2セレクタ9を経由してD2ラ
ッチ14にラッチされる。EXステージでは、演算器1
6によってD1ラッチ13の値からD2ラッチ14の値
が減算され、E1ラッチ18にラッチされる。このとき
E1ラッチ18の内容は、0x90002130-0x90002010=0x00
000120である。MEMステージでは、E1ラッチ18の
出力はMセレクタ21、拡張器22を経由してM1ラッ
チ23にラッチされる。拡張器22では符号拡張もゼロ
拡張もせず、32ビット幅のデータ値をそのままスルー
する。最後にWBステージにおいて、減算器25でM1
ラッチ23の値をスルーして出力し、オフセットレジス
タ6に格納する。このときM2ラッチ24の出力は参照
されない。最終的にオフセットレジスタ6に格納される
値は、0x00000120となる。ベースレジスタ5の値は0x90
002010のまま変更されない。 (b)メモリからSPレジスタへのデータロード 命令語:mov (mem),SP (仮にmemは0x90001234とし、
メモリ上の0x90001234で表されるアドレスから連続する
4バイトの領域には0x90003050が格納されているものと
する) まずIFステージではメモリアドレス値であるmem=0x90
001234がROM1から読込まれてIラッチ2にラッチさ
れる。次にDECステージで、Iラッチ2の出力はD1
セレクタ8を経由してD1ラッチ13にラッチされる。
もし、memとして即値の代わりにアドレスレジスタA0
〜A3が指定された場合は、レジスタファイル4の出力
がD1セレクタを経由して同様にD1ラッチ13にラッ
チされる。一方、ベースレジスタ5の出力はD3セレク
タ10および加算器11を経由してD3ラッチ15に格
納される。このとき加算器11はセレクタとして機能し
オフセットレジスタ6の値は加算されない。EXステー
ジではD1ラッチ13の出力は演算器16をスルーし、
E1ラッチ18にラッチされる。このときD2ラッチ1
4の内容は参照されない。同様にD3ラッチ15の値は
Eセレクタ17を経由してE2ラッチ19にそのままラ
ッチされる。次のMEMステージでは、E1ラッチ18
の出力値0x90001234をアドレス値としてRAM20を参
照し、メモリからロードされたデータはMセレクタ21
を経由し、必要があれば拡張器22で符号拡張またはゼ
ロ拡張が行なわれM1ラッチ23にラッチされる。E2
ラッチ19の出力はそのままM2ラッチ24にラッチさ
れる。この時点でM1ラッチ23とM2ラッチ24の値
はそれぞれ0x90003050、0x90002010である。最後にWB
ステージにおいて減算器25によってM1ラッチ23の
出力値からM2ラッチ24の出力値を減算し、その結果
をオフセットレジスタ6に格納する。最終的にオフセッ
トレジスタ6に格納される値は0x90003050-0x90002010=
0x00001040である。 (c)SPレジスタからメモリへのデータストア 命令語:mov SP,(mem) (仮にmemは0x90001234とす
る) まずIFステージではメモリアドレス値mem=0x90001234
がROM1から読込まれてIラッチ2にラッチされる。
次にDECステージで、Iラッチ2の出力はD1セレク
タ8を経由してD1ラッチ13にラッチされる。もし、
memとして即値の代わりにアドレスレジスタA0〜A3
が指定された場合は、レジスタファイル4の出力がD1
セレクタを経由してD1ラッチ13にラッチされる。一
方、ベースレジスタ5の出力はD3セレクタ10を経由
して加算器11に入力し、オフセットレジスタ6の出力
も同様に加算器11に入力する。加算器11で加算され
た結果はD3ラッチ15にラッチされる。このときのD
3ラッチ15の値は0x90002010+0x00000134=0x90002144
である。EXステージではD1ラッチ13の出力は演算
器16をスルーし、E1ラッチ18にラッチされる。こ
のときD2ラッチ14の内容は参照されない。またD3
ラッチ15の値はEセレクタ17を経由してE2ラッチ
19にそのままラッチされる。次のMEMステージで
は、RAM20に対してE1ラッチ18の出力値0x9000
1234で示されるアドレスの部分に、E2ラッチ19の出
力値0x90002144を書き込む。 (d)SPレジスタへの加算 命令語:add #imm,SP(仮に#immは0x00000220とする) まずIFステージでは即値である#imm=0x00000220がR
OM1から読込まれてIラッチ2にラッチされる。次に
DECステージで、Iラッチ2の出力がD1セレクタ8
を経由してD1ラッチ13にラッチされる。一方、オフ
セットレジスタ6の出力がD2セレクタ9を経由してD
2ラッチ14にラッチされる。EXステージでは、演算
器16によってD1ラッチ13の値とD2ラッチ14の
値が加算され、E1ラッチ18にラッチされる。このと
きE1ラッチ18の内容は、0x00000220+0x00000134=0x
00000354である。MEMステージでは、E1ラッチ18
の出力はMセレクタ21、拡張器22を経由してM1ラ
ッチ23にラッチされる。拡張器22では符号拡張もゼ
ロ拡張もせず、32ビット幅のデータ値をそのままスル
ーする。最後にWBステージにおいて、M1ラッチ23
の出力は減算器25をスルーし、オフセットレジスタ6
に格納される。最終的にオフセットレジスタ6に格納さ
れる値は0x00000354である。ベースレジスタ5の値は0x
90002010のまま変更されない。 (e)ディスプレースメント付きSP相対メモリアクセ
ス(メモリからレジスタへのデータロード) 命令語:mov (#disp,SP),R (仮に#disp=0x20とする) まずIFステージで、即値である#disp=0x20がROM1
から読込まれてIラッチ2にラッチされる。次にDEC
ステージで、Iラッチ2の出力がD3セレクタ10を経
由して加算器11でオフセットレジスタ6の出力値と加
算される(0x00000020+0x00000134=0x00000154)。この
加算結果はD1セレクタ8を経由しD1ラッチ13にラ
ッチされると同時に、マスクレジスタ7の出力値と論理
積演算されてスタック領域異常割込みを発生する要因と
なる。今回の場合、具体的には0x00000154 and 0xfffff
000=0x00000000となるため、スタック異常は発生してい
ないので割込みは発生しない。一方、ベースレジスタ5
の出力がD2セレクタ9を経由してD2ラッチ14にラ
ッチされる。この時点でD1ラッチ13の値は0x000001
54、D2ラッチ14の値は0x90002010である。EXステ
ージでは、演算器16によってD1ラッチ13の値とD
2ラッチ14の値が加算され、E1ラッチ18にラッチ
される。このときE1ラッチ18の内容は、0x00000154
+0x90002010=0x90002164である。MEMステージでは、
E1ラッチ18の出力値0x90002164をアドレス値として
RAM20が参照され、メモリからロードされたデータ
はMセレクタ21を経由し、必要があれば拡張器22で
符号拡張またはゼロ拡張が行なわれM1ラッチ23にラ
ッチされる。最後にWBステージにおいて、M1ラッチ
23の出力は減算器25をスルーし、レジスタファイル
4の指定されたレジスタに格納される。 (f)ディスプレースメント付きSP相対メモリアクセ
ス(レジスタからのメモリへのデータストア) 命令語:mov R,(#disp,SP) (仮に#disp=0x0f20とす
る) まずIFステージで、即値である#disp=0x0f20がROM
1から読込まれてIラッチ2にラッチされる。次にDE
Cステージで、Iラッチ2の出力がD3セレクタ10を
経由して加算器11でオフセットレジスタ6の出力値と
加算される(0x00000f20+0x00000134=0x00001054)。こ
の加算結果は、D1セレクタ8を経由しD1ラッチ13
にラッチされると同時に、マスクレジスタ7の出力値と
論理積演算されてスタック領域異常割込みを発生する要
因となる。具体的には0x00001054and 0xfffff000=0x000
01000となり、結果が0x00000000でないためスタック領
域異常割込みが発生する。なお、スタック領域異常割込
みが発生しなかったことを仮定して話を続けると、前記
D1ラッチ13へのラッチと同時に、ベースレジスタ5
の出力がD2セレクタ9を経由してD2ラッチ14にラ
ッチされる。この時点でD1ラッチ13の値は0x000010
54、D2ラッチ14の値は0x90002010である。EXステ
ージでは、演算器16によってD1ラッチ13の値とD
2ラッチ14の値が加算され、E1ラッチ18にラッチ
される。このときE1ラッチ18の値は0x00001054+0x9
0002010=0x90003064である。一方、レジスタファイル4
の中からレジスタRの内容が出力されEセレクタ17を
経由してE2ラッチ19にラッチされる。MEMステー
ジでは、E1ラッチ18の出力値0x90003064をアドレス
値としてRAM20をアクセスし、E2ラッチ19の出
力値(レジスタRの値)を書き込む。
行する前のレジスタの値は、ベースレジスタ5は0x9000
2010、オフセットレジスタ6は0x00000134、マスクレジ
スタ7は0xfffff000であるとする。この場合の仮想SP
レジスタ値は0x90002010+0x00000134で0x90002144とな
る。 (a)SPレジスタへの即値の代入 命令語:mov #imm,SP(仮に#immは0x90002130とする) まずIFステージでは即値である#imm=0x90002130がR
OM1から読込まれてIラッチ2にラッチされる。次に
DECステージで、Iラッチ2の出力がD1セレクタ8
を経由してD1ラッチ13にラッチされる。一方、ベー
スレジスタ5の出力がD2セレクタ9を経由してD2ラ
ッチ14にラッチされる。EXステージでは、演算器1
6によってD1ラッチ13の値からD2ラッチ14の値
が減算され、E1ラッチ18にラッチされる。このとき
E1ラッチ18の内容は、0x90002130-0x90002010=0x00
000120である。MEMステージでは、E1ラッチ18の
出力はMセレクタ21、拡張器22を経由してM1ラッ
チ23にラッチされる。拡張器22では符号拡張もゼロ
拡張もせず、32ビット幅のデータ値をそのままスルー
する。最後にWBステージにおいて、減算器25でM1
ラッチ23の値をスルーして出力し、オフセットレジス
タ6に格納する。このときM2ラッチ24の出力は参照
されない。最終的にオフセットレジスタ6に格納される
値は、0x00000120となる。ベースレジスタ5の値は0x90
002010のまま変更されない。 (b)メモリからSPレジスタへのデータロード 命令語:mov (mem),SP (仮にmemは0x90001234とし、
メモリ上の0x90001234で表されるアドレスから連続する
4バイトの領域には0x90003050が格納されているものと
する) まずIFステージではメモリアドレス値であるmem=0x90
001234がROM1から読込まれてIラッチ2にラッチさ
れる。次にDECステージで、Iラッチ2の出力はD1
セレクタ8を経由してD1ラッチ13にラッチされる。
もし、memとして即値の代わりにアドレスレジスタA0
〜A3が指定された場合は、レジスタファイル4の出力
がD1セレクタを経由して同様にD1ラッチ13にラッ
チされる。一方、ベースレジスタ5の出力はD3セレク
タ10および加算器11を経由してD3ラッチ15に格
納される。このとき加算器11はセレクタとして機能し
オフセットレジスタ6の値は加算されない。EXステー
ジではD1ラッチ13の出力は演算器16をスルーし、
E1ラッチ18にラッチされる。このときD2ラッチ1
4の内容は参照されない。同様にD3ラッチ15の値は
Eセレクタ17を経由してE2ラッチ19にそのままラ
ッチされる。次のMEMステージでは、E1ラッチ18
の出力値0x90001234をアドレス値としてRAM20を参
照し、メモリからロードされたデータはMセレクタ21
を経由し、必要があれば拡張器22で符号拡張またはゼ
ロ拡張が行なわれM1ラッチ23にラッチされる。E2
ラッチ19の出力はそのままM2ラッチ24にラッチさ
れる。この時点でM1ラッチ23とM2ラッチ24の値
はそれぞれ0x90003050、0x90002010である。最後にWB
ステージにおいて減算器25によってM1ラッチ23の
出力値からM2ラッチ24の出力値を減算し、その結果
をオフセットレジスタ6に格納する。最終的にオフセッ
トレジスタ6に格納される値は0x90003050-0x90002010=
0x00001040である。 (c)SPレジスタからメモリへのデータストア 命令語:mov SP,(mem) (仮にmemは0x90001234とす
る) まずIFステージではメモリアドレス値mem=0x90001234
がROM1から読込まれてIラッチ2にラッチされる。
次にDECステージで、Iラッチ2の出力はD1セレク
タ8を経由してD1ラッチ13にラッチされる。もし、
memとして即値の代わりにアドレスレジスタA0〜A3
が指定された場合は、レジスタファイル4の出力がD1
セレクタを経由してD1ラッチ13にラッチされる。一
方、ベースレジスタ5の出力はD3セレクタ10を経由
して加算器11に入力し、オフセットレジスタ6の出力
も同様に加算器11に入力する。加算器11で加算され
た結果はD3ラッチ15にラッチされる。このときのD
3ラッチ15の値は0x90002010+0x00000134=0x90002144
である。EXステージではD1ラッチ13の出力は演算
器16をスルーし、E1ラッチ18にラッチされる。こ
のときD2ラッチ14の内容は参照されない。またD3
ラッチ15の値はEセレクタ17を経由してE2ラッチ
19にそのままラッチされる。次のMEMステージで
は、RAM20に対してE1ラッチ18の出力値0x9000
1234で示されるアドレスの部分に、E2ラッチ19の出
力値0x90002144を書き込む。 (d)SPレジスタへの加算 命令語:add #imm,SP(仮に#immは0x00000220とする) まずIFステージでは即値である#imm=0x00000220がR
OM1から読込まれてIラッチ2にラッチされる。次に
DECステージで、Iラッチ2の出力がD1セレクタ8
を経由してD1ラッチ13にラッチされる。一方、オフ
セットレジスタ6の出力がD2セレクタ9を経由してD
2ラッチ14にラッチされる。EXステージでは、演算
器16によってD1ラッチ13の値とD2ラッチ14の
値が加算され、E1ラッチ18にラッチされる。このと
きE1ラッチ18の内容は、0x00000220+0x00000134=0x
00000354である。MEMステージでは、E1ラッチ18
の出力はMセレクタ21、拡張器22を経由してM1ラ
ッチ23にラッチされる。拡張器22では符号拡張もゼ
ロ拡張もせず、32ビット幅のデータ値をそのままスル
ーする。最後にWBステージにおいて、M1ラッチ23
の出力は減算器25をスルーし、オフセットレジスタ6
に格納される。最終的にオフセットレジスタ6に格納さ
れる値は0x00000354である。ベースレジスタ5の値は0x
90002010のまま変更されない。 (e)ディスプレースメント付きSP相対メモリアクセ
ス(メモリからレジスタへのデータロード) 命令語:mov (#disp,SP),R (仮に#disp=0x20とする) まずIFステージで、即値である#disp=0x20がROM1
から読込まれてIラッチ2にラッチされる。次にDEC
ステージで、Iラッチ2の出力がD3セレクタ10を経
由して加算器11でオフセットレジスタ6の出力値と加
算される(0x00000020+0x00000134=0x00000154)。この
加算結果はD1セレクタ8を経由しD1ラッチ13にラ
ッチされると同時に、マスクレジスタ7の出力値と論理
積演算されてスタック領域異常割込みを発生する要因と
なる。今回の場合、具体的には0x00000154 and 0xfffff
000=0x00000000となるため、スタック異常は発生してい
ないので割込みは発生しない。一方、ベースレジスタ5
の出力がD2セレクタ9を経由してD2ラッチ14にラ
ッチされる。この時点でD1ラッチ13の値は0x000001
54、D2ラッチ14の値は0x90002010である。EXステ
ージでは、演算器16によってD1ラッチ13の値とD
2ラッチ14の値が加算され、E1ラッチ18にラッチ
される。このときE1ラッチ18の内容は、0x00000154
+0x90002010=0x90002164である。MEMステージでは、
E1ラッチ18の出力値0x90002164をアドレス値として
RAM20が参照され、メモリからロードされたデータ
はMセレクタ21を経由し、必要があれば拡張器22で
符号拡張またはゼロ拡張が行なわれM1ラッチ23にラ
ッチされる。最後にWBステージにおいて、M1ラッチ
23の出力は減算器25をスルーし、レジスタファイル
4の指定されたレジスタに格納される。 (f)ディスプレースメント付きSP相対メモリアクセ
ス(レジスタからのメモリへのデータストア) 命令語:mov R,(#disp,SP) (仮に#disp=0x0f20とす
る) まずIFステージで、即値である#disp=0x0f20がROM
1から読込まれてIラッチ2にラッチされる。次にDE
Cステージで、Iラッチ2の出力がD3セレクタ10を
経由して加算器11でオフセットレジスタ6の出力値と
加算される(0x00000f20+0x00000134=0x00001054)。こ
の加算結果は、D1セレクタ8を経由しD1ラッチ13
にラッチされると同時に、マスクレジスタ7の出力値と
論理積演算されてスタック領域異常割込みを発生する要
因となる。具体的には0x00001054and 0xfffff000=0x000
01000となり、結果が0x00000000でないためスタック領
域異常割込みが発生する。なお、スタック領域異常割込
みが発生しなかったことを仮定して話を続けると、前記
D1ラッチ13へのラッチと同時に、ベースレジスタ5
の出力がD2セレクタ9を経由してD2ラッチ14にラ
ッチされる。この時点でD1ラッチ13の値は0x000010
54、D2ラッチ14の値は0x90002010である。EXステ
ージでは、演算器16によってD1ラッチ13の値とD
2ラッチ14の値が加算され、E1ラッチ18にラッチ
される。このときE1ラッチ18の値は0x00001054+0x9
0002010=0x90003064である。一方、レジスタファイル4
の中からレジスタRの内容が出力されEセレクタ17を
経由してE2ラッチ19にラッチされる。MEMステー
ジでは、E1ラッチ18の出力値0x90003064をアドレス
値としてRAM20をアクセスし、E2ラッチ19の出
力値(レジスタRの値)を書き込む。
【0036】以上で説明したマイクロプロセッサはRO
Mに記憶されているシステムやアプリケーションプログ
ラムに基づいて、マイクロコンピュータを構成するそれ
ぞれの構成要素の動作を制御することができるようにな
っている。
Mに記憶されているシステムやアプリケーションプログ
ラムに基づいて、マイクロコンピュータを構成するそれ
ぞれの構成要素の動作を制御することができるようにな
っている。
【0037】本実施の形態の作用について、スタック領
域のオーバーフローによるスタック領域破壊の判断処理
モデルを図2のフローチャートに基づいて説明する。図
2のモデルは、2つのタスクが動作しているマルチタス
クシステムを示している。カーネルディスパッチャで
は、ベースレジスタ、オフセットレジスタおよびマスク
レジスタを設定して、タスク1もしくはタスク2に制御
を移すようになっている。ここで、タスク1およびタス
ク2がそれぞれ使用するスタック領域のメモリレイアウ
トを表しているのが図3である。ここで、タスク1のス
タックサイズは0x100バイトであり、タスク2のスタッ
クサイズは0x200バイトである。また、タスク2のスタ
ック領域は0x90001020番地から始まっている。つまり、
本実施の形態ではスタック領域の先頭アドレスにアライ
メントなどの制限はなく、自由なアドレスから開始する
ことができる。
域のオーバーフローによるスタック領域破壊の判断処理
モデルを図2のフローチャートに基づいて説明する。図
2のモデルは、2つのタスクが動作しているマルチタス
クシステムを示している。カーネルディスパッチャで
は、ベースレジスタ、オフセットレジスタおよびマスク
レジスタを設定して、タスク1もしくはタスク2に制御
を移すようになっている。ここで、タスク1およびタス
ク2がそれぞれ使用するスタック領域のメモリレイアウ
トを表しているのが図3である。ここで、タスク1のス
タックサイズは0x100バイトであり、タスク2のスタッ
クサイズは0x200バイトである。また、タスク2のスタ
ック領域は0x90001020番地から始まっている。つまり、
本実施の形態ではスタック領域の先頭アドレスにアライ
メントなどの制限はなく、自由なアドレスから開始する
ことができる。
【0038】ここで図2のディスパッチャ201におい
て、ベースレジスタ=0x90001020、オフセットレジスタ=
0x00000140、マスクレジスタ=0xfffffc00を設定し、タ
スク2にディスパッチしたとする。この状態が図3にお
ける1)である。このときタスク2内で mov (0x10,S
P),D0という命令を実行した場合(図2のステップ203、
および図3の2)の状態)、図1のスタック領域異常検
出器12では、 (0x00000140 + 0x00000010)and 0xfffffc00 = 0x0000
0000 という論理積演算が行なわれる。演算の結果は0である
ので、スタック領域の異常は検出されず、割込みは発生
しない。しかし、同タスク2内でmov(-0x200,SP),D0と
いう命令を実行した場合(図3の3)の状態)、図1の
スタック領域異常検出器12では、 (0x00000140 - 0x00000200)and 0xfffffc00 = 0xffff
fc00 という論理積演算が行なわれる。演算の結果は非0であ
るので、スタック領域の異常が検出され、スタック領域
異常割込みが発生する。このとき、図2では割込みの発
生により、ステップ204に制御が移される。ここでは、
スタック領域の異常をユーザに通知するため、ステップ
205にジャンプする。ステップ205のスタック異常処理で
は、デバッガの画面上に「スタックオーバーフロー」な
どのメッセージを表示してユーザに知らせると同時に、
プログラムの実行を停止する。これにより、タスク2の
スタック領域のオーバーフローが起こっても、タスク1
のスタック領域を破壊する瞬間を割込みで検出すること
が可能となり、デバッグ効率の向上が期待できる。
て、ベースレジスタ=0x90001020、オフセットレジスタ=
0x00000140、マスクレジスタ=0xfffffc00を設定し、タ
スク2にディスパッチしたとする。この状態が図3にお
ける1)である。このときタスク2内で mov (0x10,S
P),D0という命令を実行した場合(図2のステップ203、
および図3の2)の状態)、図1のスタック領域異常検
出器12では、 (0x00000140 + 0x00000010)and 0xfffffc00 = 0x0000
0000 という論理積演算が行なわれる。演算の結果は0である
ので、スタック領域の異常は検出されず、割込みは発生
しない。しかし、同タスク2内でmov(-0x200,SP),D0と
いう命令を実行した場合(図3の3)の状態)、図1の
スタック領域異常検出器12では、 (0x00000140 - 0x00000200)and 0xfffffc00 = 0xffff
fc00 という論理積演算が行なわれる。演算の結果は非0であ
るので、スタック領域の異常が検出され、スタック領域
異常割込みが発生する。このとき、図2では割込みの発
生により、ステップ204に制御が移される。ここでは、
スタック領域の異常をユーザに通知するため、ステップ
205にジャンプする。ステップ205のスタック異常処理で
は、デバッガの画面上に「スタックオーバーフロー」な
どのメッセージを表示してユーザに知らせると同時に、
プログラムの実行を停止する。これにより、タスク2の
スタック領域のオーバーフローが起こっても、タスク1
のスタック領域を破壊する瞬間を割込みで検出すること
が可能となり、デバッグ効率の向上が期待できる。
【0039】以上、本実施の形態のマイクロプロセッサ
によれば、スタック領域異常検出のための制御レジスタ
として、ベースレジスタ5、オフセットレジスタ6およ
びマスクレジスタ7を設け、かつそれらのレジスタを図
1で示したような構成にすることにより、スタック領域
の破壊を割込みにより即時に発見し、これによる二次、
三次障害を未然に防止することができる。
によれば、スタック領域異常検出のための制御レジスタ
として、ベースレジスタ5、オフセットレジスタ6およ
びマスクレジスタ7を設け、かつそれらのレジスタを図
1で示したような構成にすることにより、スタック領域
の破壊を割込みにより即時に発見し、これによる二次、
三次障害を未然に防止することができる。
【0040】また、スタック領域の破壊を即時に発見で
き、従来のような二次、三次障害につながることによる
障害の原因究明に多大な労力、費用を費やす必要がない
ので、ソフトウェア開発におけるデバッグ効率を向上さ
せることができ、工数の低減を図ることができる。
き、従来のような二次、三次障害につながることによる
障害の原因究明に多大な労力、費用を費やす必要がない
ので、ソフトウェア開発におけるデバッグ効率を向上さ
せることができ、工数の低減を図ることができる。
【0041】これまで本発明の実施の形態について説明
したが、本発明は前記実施の形態に限定されるものでは
なく、その要旨を逸脱しない範囲で種々変更可能である
ことはいうまでもない。たとえば、図1に示した各種レ
ジスタやラッチは32ビット幅ではなく16ビットや8
ビットのレジスタでもよい。また、前記(a)〜(f)
の例においてスタック領域異常の検出を行なっているも
のは(e)と(f)だけであるが、(a)〜(d)にお
いても同様に検出できるような回路を付加することも可
能である。
したが、本発明は前記実施の形態に限定されるものでは
なく、その要旨を逸脱しない範囲で種々変更可能である
ことはいうまでもない。たとえば、図1に示した各種レ
ジスタやラッチは32ビット幅ではなく16ビットや8
ビットのレジスタでもよい。また、前記(a)〜(f)
の例においてスタック領域異常の検出を行なっているも
のは(e)と(f)だけであるが、(a)〜(d)にお
いても同様に検出できるような回路を付加することも可
能である。
【0042】また、図2や図3においても、タスクの数
は2に限定されることはなく数十タスクから数百タスク
に至るまで、システムに依存した数だけ実装することも
可能である。
は2に限定されることはなく数十タスクから数百タスク
に至るまで、システムに依存した数だけ実装することも
可能である。
【0043】
【発明の効果】本願において開示される発明のうち、代
表的なものによって得られる効果を簡単に説明すれば、
以下の通りである。 (1) スタック領域のオーバーフローまたはアンダーフロ
ーを検出するスタック領域異常検出手段に、スタック領
域の先頭アドレスを設定する第1のレジスタと、設定ア
ドレスから実際のスタックポインタまでのオフセット値
を設定する第2のレジスタと、前記第2のレジスタの有
効範囲をマスクビットパターンで設定する第3のレジス
タとを設けることで、第2のレジスタ値と第3のレジス
タ値の論理積の結果によりスタック領域のオーバーフロ
ーおよびアンダーフローの検出が可能となる。 (2) 前記(1)に加えて、ディスプレースメント付きSP相
対メモリアクセス命令のディスプレースメント値を前記
第2のレジスタに加算し、その値と前記第3のレジスタ
との論理積の結果を監視することで、ディスプレースメ
ント付きSP相対メモリアクセス命令実行時のスタック領
域のオーバーフローおよびアンダーフローの検出が可能
となる。 (3) 前記(1)、(2)により、スタック領域のオーバーフロ
ーおよびアンダーフローが割込みにより検出できること
によって、スタック領域破壊の早期発見を実現すること
ができるので、このスタック領域破壊による二次、三次
障害を未然に防止することが可能となる。 (4) 前記(3)により、スタック領域破壊による二次、三
次障害を未然に防止することができるので、デバッグ効
率の向上が可能となる。
表的なものによって得られる効果を簡単に説明すれば、
以下の通りである。 (1) スタック領域のオーバーフローまたはアンダーフロ
ーを検出するスタック領域異常検出手段に、スタック領
域の先頭アドレスを設定する第1のレジスタと、設定ア
ドレスから実際のスタックポインタまでのオフセット値
を設定する第2のレジスタと、前記第2のレジスタの有
効範囲をマスクビットパターンで設定する第3のレジス
タとを設けることで、第2のレジスタ値と第3のレジス
タ値の論理積の結果によりスタック領域のオーバーフロ
ーおよびアンダーフローの検出が可能となる。 (2) 前記(1)に加えて、ディスプレースメント付きSP相
対メモリアクセス命令のディスプレースメント値を前記
第2のレジスタに加算し、その値と前記第3のレジスタ
との論理積の結果を監視することで、ディスプレースメ
ント付きSP相対メモリアクセス命令実行時のスタック領
域のオーバーフローおよびアンダーフローの検出が可能
となる。 (3) 前記(1)、(2)により、スタック領域のオーバーフロ
ーおよびアンダーフローが割込みにより検出できること
によって、スタック領域破壊の早期発見を実現すること
ができるので、このスタック領域破壊による二次、三次
障害を未然に防止することが可能となる。 (4) 前記(3)により、スタック領域破壊による二次、三
次障害を未然に防止することができるので、デバッグ効
率の向上が可能となる。
【図1】本発明の実施の形態であるマイクロプロセッサ
を示すブロック図
を示すブロック図
【図2】実施の形態において、割込みによる判断処理モ
デルを示すフローチャート
デルを示すフローチャート
【図3】実施の形態におけるタスクスタック領域のメモ
リ配置を示す説明図
リ配置を示す説明図
1 ROM 2 Iラッチ 3 命令解読器 4 レジスタファイル 5 ベースレジスタ 6 オフセットレジスタ 7 マスクレジスタ 8 D1セレクタ 9 D2セレクタ 10 D3セレクタ 11 加算器 12 割込み発生器 13 D1ラッチ 14 D2ラッチ 15 D3ラッチ 16 演算器 17 Eセレクタ 18 E1ラッチ 19 E2ラッチ 20 RAM 21 Mセレクタ 22 符号拡張器 23 M1ラッチ 24 M2ラッチ 25 減算器 ROM リードオンリメモリ RAM ランダムアクセスメモリ BASE ベースレジスタ OFFSET オフセットレジスタ MASK マスクレジスタ disp ディスプレースメント値 imm 即値 INT 割込み発生器 D0〜D3 データレジスタ A0〜A3 アドレスレジスタ IFステージ 命令フェッチステージ DECステージ デコードステージ EXステージ 実行ステージ MEMステージ メモリアクセスステージ WBステージ ライトバックステージ
Claims (5)
- 【請求項1】 スタック領域の先頭アドレスを設定する
第1のレジスタと、前記先頭アドレスから現在のスタッ
クポインタ値までのオフセット値を設定する第2のレジ
スタとを備え、スタックポインタの値を前記第1のレジ
スタと前記第2のレジスタとに分けて保持することを特
徴とするマイクロプロセッサ。 - 【請求項2】 前記オフセット値と、所定のマスクビッ
トパターン値との論理積の結果により、スタック領域の
オーバーフローまたはアンダーフローを検出するスタッ
ク領域異常検出手段を備えることを特徴とする請求項1
記載のマイクロプロセッサ。 - 【請求項3】 前記スタック領域異常検出手段は、 前記先頭アドレスを設定する第1の制御レジスタと、 前記オフセット値を設定する第2の制御レジスタと、 前記マスクビットパターン値を設定する第3の制御レジ
スタとを備えることを特徴とする請求項2記載のマイク
ロプロセッサ。 - 【請求項4】 前記オフセット値とディスプレースメン
ト付きスタックポインタ相対アドレッシング命令におけ
るディスプレースメント値との加算結果と、所定のマス
クビットパターン値との論理積の結果により、スタック
のオーバーフローまたはアンダーフローを検出するスタ
ック領域異常検出手段を備えることを特徴とする請求項
1記載のマイクロプロセッサ。 - 【請求項5】 前記スタック領域のサイズが2のべき乗
の数であることを特徴とする請求項1から4のいずれか
1項に記載のマイクロプロセッサ。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP11062790A JP2000259410A (ja) | 1999-03-10 | 1999-03-10 | マイクロプロセッサ |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP11062790A JP2000259410A (ja) | 1999-03-10 | 1999-03-10 | マイクロプロセッサ |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JP2000259410A true JP2000259410A (ja) | 2000-09-22 |
Family
ID=13210506
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP11062790A Pending JP2000259410A (ja) | 1999-03-10 | 1999-03-10 | マイクロプロセッサ |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JP2000259410A (ja) |
Cited By (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN1315062C (zh) * | 2002-06-07 | 2007-05-09 | 松下电器产业株式会社 | 处理器装置、使用它的信息处理装置、编译装置及其方法 |
| WO2017112489A1 (en) * | 2015-12-22 | 2017-06-29 | Intel Corporation | Apparatus and method for retrieving elements from a linked structure |
| CN116361115A (zh) * | 2023-03-30 | 2023-06-30 | 苏州浪潮智能科技有限公司 | 一种线程栈溢出监测方法以及相关设备 |
-
1999
- 1999-03-10 JP JP11062790A patent/JP2000259410A/ja active Pending
Cited By (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN1315062C (zh) * | 2002-06-07 | 2007-05-09 | 松下电器产业株式会社 | 处理器装置、使用它的信息处理装置、编译装置及其方法 |
| WO2017112489A1 (en) * | 2015-12-22 | 2017-06-29 | Intel Corporation | Apparatus and method for retrieving elements from a linked structure |
| US10095517B2 (en) | 2015-12-22 | 2018-10-09 | Intel Corporation | Apparatus and method for retrieving elements from a linked structure |
| CN116361115A (zh) * | 2023-03-30 | 2023-06-30 | 苏州浪潮智能科技有限公司 | 一种线程栈溢出监测方法以及相关设备 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| Case et al. | Architecture of the IBM System/370 | |
| JP5668143B2 (ja) | データ処理装置のデバッグ | |
| KR100737666B1 (ko) | 가상 기계 동작에서 기계 상태를 관리하는 방법 및 시스템 | |
| US5317754A (en) | Method and apparatus for enabling an interpretive execution subset | |
| EP0213843A2 (en) | Digital processor control | |
| CN101261577A (zh) | 微处理器以及在微处理器中存储数据的方法 | |
| US6779132B2 (en) | Preserving dump capability after a fault-on-fault or related type failure in a fault tolerant computer system | |
| KR19980702137A (ko) | 프로세서의 명령어 집합간의 변환 방법 및 장치 | |
| TW201530320A (zh) | 資料處理裝置及半導體積體電路裝置 | |
| JP2009157542A (ja) | 情報処理装置及びそのスタックポインタ更新方法 | |
| JP2020518910A (ja) | 機能の使用を管理するための装置および方法 | |
| JP2889845B2 (ja) | 情報処理装置 | |
| JPH07210381A (ja) | プロセッサ及びコンピュータ・システム | |
| US6697959B2 (en) | Fault handling in a data processing system utilizing a fault vector pointer table | |
| US6199156B1 (en) | System for explicitly referencing a register for its current content when performing processor context switch | |
| CN120693595A (zh) | 标记保护指令 | |
| US6687845B2 (en) | Fault vector pointer table | |
| US5404471A (en) | Method and apparatus for switching address generation modes in CPU having plural address generation modes | |
| JP3716604B2 (ja) | 情報処理装置 | |
| EP1220088B1 (en) | Circuit and method for supporting misaligned accesses in the presence of speculative load instructions | |
| EP1133724B1 (en) | Microprocessor | |
| US6934892B2 (en) | Computing system construction method under execution environment to be dependent on OS | |
| JP2870405B2 (ja) | 情報処理装置 | |
| EP1235139B1 (en) | System and method for supporting precise exceptions in a data processor having a clustered architecture | |
| Huang et al. | Design memory protection based on embedded operating system with focus on PicoBlaze soft controller |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
| LAPS | Cancellation because of no payment of annual fees |