(57)【要約】      （修正有）【課題】インターネットの普及に従いコンピュータのセキュリティホールが問題となっているが、セキュリティホールからコンピュータシステムを保護するためのものである。  【解決手段】セキュリティホールは、コンピュータシステムが持つバッファオーバーランという現象を悪用して不正を行う。従来のコンピュータのCPUのスタックレジスタと呼ぶ記憶装置は、作業用メモリの確保を高位からゼロ番地方向へ行い、確保したメモリの使用は通常ゼロ側から高位へ向かって行なう。この結果、メモリ書き込みが暴走した時、過去に設定したデータが全て壊れるという障害が起きていた。このスタックレジスタが行なうメモリ領域の確保をゼロ側から高位に向かって行なうようにして、この問題を解決するものである。さらにCPUに対して従来のモードと当発明のモードを手動切り替えと自動切り替えの２つのモードを用意し互換性を維持しつつ新機構を提供する。  【選択図】図１１
2005316518.tif 000002
【特許請求の範囲】
【請求項１】
従来スタックレジスタと呼ばれている、記憶装置のどのアドレスまで現時点で使用しているかを示し、メモリ（記憶装置）を使用するごとに、保持する値を減算することにより常に未使用のメモリ領域の番地を示すレジスタ装置において、減算ではなく加算により未使用のメモリ番地を示す事を特徴とするコンピュータシステムのCPU（中央処理装置）。
【請求項２】
CPUの内部の状態を切り替えるスイッチ装置を備え、このスイッチ装置により、スタックレジスタ装置が示す未使用のメモリを示すメモリ番地を加算方向と減算方向のいづれかに切り替えるようにした請求項１のCPU（中央処理装置）。 
【請求項３】
プログラムよりスタックレジスタにデータが書き込まれた時、データをそのまま書き込まずに値を減算して書き込むようになっており、減算する値を設定する目的のメモリ装置を備えることを特徴とするCPU（中央処理装置）。   
【請求項４】
プログラムよりスタックレジスタにデータが書き込まれた時、この値を破棄し強制的にスタック用に割り振られたメモリ領域のゼロ番地側の開始アドレス書き込む機構を備えることを特徴とするCPU（中央処理装置）。 
【請求項５】
CPUのレジスタ装置に対してスタックメモリ領域を相対値により参照する時に、正負の符号をそのまま利用するか反転して使用するかを設定する装置の備えることを特徴とする請求項１、請求項２、請求項３、請求項４のCPU（中央処理装置）。 
【請求項６】
CPUの内部にスイッチ装置を備えており、このスイッチ装置のオンオフを、CPU内部の任意のレジスタ装置を利用して、そのレジスタ装置の保持する値を、そのレジスタ装置に転送する命令を実施した時にスイッチがオンオフが変化する機構およびその機構を備えていることを特徴とするCPU（中央処理装置）。 
【請求項７】
CPUの内部にスイッチ装置を備えており、このスイッチ装置のオンオフを、CPU内部に存在するスタックレジスタ装置に対して事前に定めた任意の値を書き込んだ時にスイッチがオンオフが変化する機構およびその機構を備えていることを特徴とするCPU（中央処理装置）。 
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータウィルスに感染しにくい、安全性の高いコンピュータシステムに関するものである。
【背景技術】
【０００２】
インターネットの普及に従い、企業、個人用途のコンピュータシステムは多くがネットワークに接続し相互にデータのやり取りをするに至っている。
【０００３】
これよりコンピュータシステムは外部より悪意あるネットワーク利用者が接続し、コンピュータシステムを知らない間に書き直されているという問題。およびいわゆるコンピュータウィルスと呼ばれる悪意のある実行形式のデータを知らない間に書き込まれるという問題が発生しており深刻な社会問題となっている。
※実行形式のファイルはプログラムと同じ意味。
【特許文献１】特許願 出願番号２００３３００６４１
【特許文献２】特許願 出願番号２００４１２７６８８
【非特許文献２】UNYUN 著  「ハッカー・プログラミング大全」
【非特許文献３】William Stalings, Ph.D. 著  「OPERATING SYSTEM Internals and Design
【非特許文献４】米インテル社 著  「インテル・アーキテクチャ最適化マニュアル」        資料番号242816J-003 1998  ftp://download.intel.co.jp/jp/developer/jpdoc/ia_opti.pdf
【非特許文献５】米インテル社 著  「IA-32 Intel Architecture Software Developer's Manual」        http://www.cs.earlham.edu/~charliep/courses/cs320/ia32/IA32-architecture.pdf
【発明の開示】
【発明が解決しようとする課題】
【０００４】
コンピュータシステムにはセキュリティホールと呼ばれる問題がある。これは、インターネットによる不正アクセスおよびコンピュータウィルスがコンピュータシステムを破壊改造するための警備の穴である。現在多数のセキュリティホールが存在し、これを利用した不正アクセス、コンピュータウィルスが社会問題となっている。
【０００５】
このセキュリティホールを防ぐべく特許文献１、２の発明がある。これらの発明はスタックレジスタ装置を複数実装することによりセキュリティホールの問題を解決しようとしたものである。本発明は、従来どうりただ一つのスタックレジスタ装置を使用してより簡易にセキュリティホールを解決する機構を示すものである。 
【課題を解決するための手段】
【０００６】
過去からの慣例によりスタックレジスタ装置はメモリ領域の高位番地側よりゼロ番地側に向かって未使用のメモリを使用していくという仕様となっている。当発明はこの仕様がセキュリティホールを引き起こすバッファオーバラン現象の原因であると断定する。 
【０００７】
図１０に従来のスタックレジスタ装置が使用するメモリ領域の割り振りを示す。同図ではまたバッファオーバーラン現象が発生した時にメモリがどのように破壊していくか説明している。 
この現象は、スタックレジスタが確保するメモリは高位からゼロ番地側に向かって確保して行くことに原因がある。プログラムはスタックレジスタによりメモリを読み書き参照する時には向かってメモリ領域のゼロ番地側から高位番地側にむかって実施していく。このため、一度メモリ書き込みの歯止めが効かず暴走すると延々とデータを破壊する。 
【０００８】
これを解決するには、スタックレジスタ装置が未使用メモリを確保する方向を向かってゼロ番地側から高位の方向に確保すれば良いことがわかる。本発明はCPUにメモリ領域のゼロ番地側から高位番地側に向かって作動するスタックレジスタ装置を実装することである。図１１に本発明を組み込んだ時のスタックレジスタ装置が使用するメモリ領域の割り振りを示す。同図ではまたバッファオーバーラン現象が発生した時のメモリの破壊の方向を示す。破壊は未使用の領域に対して伸びてゆき、実害が最小に食い止められることがわかる。 
【０００９】
これが請求項１記載の機構である。本機構を実装を組み込んだCPUはスタックレジスタ装置と連動する機能についは図１３、１４、１５、１６に詳細を述べる。図１３はIA32においてはcall命令、ソフトウェア割り込みを行なうint命令により表わすサブルーチンの呼び出しの制御を表わしている。図１４はret命令、iret命令が該当するサブルーチンの終了に関する制御を表わしている。 
【００１０】
これより請求項２の機構を利用して課題を解決する手段について述べる。CPU（中央処理装置）にCPUの状態を決定するスイッチ装置を用意する。このスイッチはCPUの動作を決定するものとする。このスイッチの状態によりCPUを従来と同一の動作をする状態と請求項１の機能をする状態を切り替える。このスイッチ装置により、既存のソフトウェアに対して従来どうりの動作をするCPU環境を提供する。  
【００１１】
このスイッチをCPUを動かしている時に切り替えて新規にCPUに組み込んだ機構を有効にする事ができる。この時に、CPUが保持するプログラムカウンタは内容を保持する。これによりCPU上で動いているソフトウェアがCPUに対してスイッチ装置の内容の設定を自由に行える。リクエスト後はCPUは内部に本発明の機能をソフトウェアの用途に合わせて最適な状態に切り替えて継続してソフトウェアを実行できるようにする。
【００１２】
これより請求項３の機構を利用して課題を解決する手段について述べる。
CPUが、新しい発明機構を作動させながら、従来のソフトウェアを実行する機構を提供するものである。 
【００１３】
従来のOSないしプログラムは、CPUのスタックレジスタにスタックメモリ領域の高位を設定する。そして、CPUはプログラムを実行しながらスタックレジスタの値を減算しながらメモリ領域の高位からゼロ方向に空きメモリを取り崩して使用して行く。 
【００１４】
当機構はスタックレジスタにデータが書き込まれた時、これをCPU内部で減算しゼロ側に近付けて設定する機構である。以後CPUはレジスタ装置を使用するごとに請求項１の機構に従いながら高位側に空き空きメモリを取り崩して確保し動作する。これより既存のプログラムに修正を加えず本発明の機構を作動させることができる。 
【００１５】
これより請求項４の機構を利用して課題を解決する手段について述べる。 
従来のOSないしプログラムは、CPUのスタックレジスタにスタックメモリ領域の高位を設定する。そして、CPUはプログラムを実行しながらスタックレジスタの値を減算しながらメモリ領域の高位からゼロ方向に空きメモリを取り崩して使用して行く。 
【００１６】
当機構はスタックレジスタにデータが書き込まれた時、スタックメモリ領域用に確保したメモリ領域のゼロ側の先端のメモリ番地を調べこれを代替データとしてスタックレジスタに書き込む。後CPUはレジスタ装置を使用するごとに請求項１の機構に従いながら高位側に空き空きメモリを取り崩して確保し動作する。これより既存のプログラムに修正を加えず本発明の機構を作動させることができる。 
【００１７】
これより請求項５の機構を利用して課題を解決する手段について述べる。 
請求項３ないし請求項４の機構を使用して従来のプログラムを実行した時、スタックメモリ領域を参照した時にプログラムが動かなくなる場合がある。 
【００１８】
これは、スタックメモリを参照する時、通常はS２１ないしS２８の値に対して一定の値を加算したものを実際のメモリ番地としてメモリ読み書きを行なう。これをメモリの相対参照と呼称する。 
【００１９】
従来、プログラムはS２１ないしS２８に対して正の方向に加算をおこなって参照している。しかし、本発明を組み込むことにより参照方向はマイナス方向に変化している。 
【００２０】
従い、そのままプログラムを動かすと番地がズレてしまい正常に動作しない。請求項５はこれを補正するものである。本機構の作動により符号が正負反転して正しいメモリ番地を参照が可能となる。 
【発明の効果】
【００２１】
以上記述してきたとうり請求項２、請求項３、請求項４、請求項５により従来のソフトウェアに対して互換性を確保しつつ、手動、自動にて請求項１の発明を有効にするものである。 
【発明を実施するための最良の形態】
【００２２】
本発明の概略構造を説明するにあたり、既存のCPUに本発明を追加した例をもとに説明する。図１は米国のインテル社のｘ８６系のCPUの概略構成図である。このCPUは正式にはIA32と呼称する。
【００２３】
図２に図１を原型に本発明を組み込んだ概略構造図を示す。
【００２４】
図２において実装した新しい機構、S２６、S２７のCPUの状態を決定する制御用のレジスタは従来存在しない。これらレジスタ群に直接データを書き込む命令を新たに当発明のCPUに定義するのが一番自然である。しかし、新しく定義した命令を用意すると、この命令を含んだプログラムは当発明のCPUの上でしか動かなくなる可能性がある。 
【００２５】
ここでは、従来のCPUの持つ命令だけで新たなS２６、S２７を制御する機構を実装する。この機構により本発明を実装していない旧いCPUにおいても正常に動作するようにプログラムによりソフト的なスイッチとして機能する。 
【００２６】
実施態例は複数考えられるが、ここではS２１の特殊性に着目するものとする。S２１は本来はスタックメモリ用に定義した領域の高い番地の値を設定するものである。そして、ゼロ番地に向かって使用していく。つまりS２１の値がゼロになった時にはスタックメモリ領域の最期を示すことになる。 
【００２７】
結論としてCPUにおいてS２１にゼロが設定されることはありえない。この特性を利用してS２１をCPUを利用するスイッチ装置を実装するものとする。当スイッチ装置が請求項７による機構である。 
【００２８】
このスイッチ装置はS２１にゼロを設定した時をスイッチ装置の入力する。これだけでは誤動作してスイッチが入る危険があるので請求項６と組み合わせてダブルトリガ式にするものとする。図４にこのスイッチ装置のオンオフの説明を入れる。 
【図面の簡単な説明】
【００２９】
【図１】米インテル社のIA32仕様のCPU概略図。本発明を説明するにあたり、既存のCPUを例にとるものである。
【００３０】
【図２】本発明を組み込んだ米インテル社のIA32仕様のCPU概略図。
【００３１】
【図３】スイッチ装置S２６の詳細を表わしている。S２６は３２ビットのレジスタ構成をとっている。このうちゼロから第３ビットまでの各ビットのオンオフをスイッチとして利用している。このスイッチの役割を表わしている。
【００３２】
なお、実際にはこのようにCPU上の一つのレジスタになっている必要はない。各機能が個別の独立したレジスタになっていても良いし、特定番地のメモリのビット列をスイッチに定義しても良い。なお、S26の第４ビットから３１までは未使用とする。
【００３３】
【図４】S２１（プログラム中espと記載）を利用した具体的な本発明の実装を示す。図３では具体的なCPU内部のレジスタの配置を示した。図４では具体的なプログラム上の使用方法を説明する。当図の機構は請求項６および請求項７を具現化したものである。
【００３４】
当図で示すプログラムはアセンブラのソースコードにて記述している。実際の実行形式のプログラムにおいては、CPUが直接実行する機械語コードに置き換えられて実行する。CPUの実行処理については図１２にて説明する。プログラムは、図１２の機構によりメモリより読み込まれ、デコードつまり命令解釈を行ない、実行を行なう。 
【００３５】
当図では本発明の各機構に設定を行ない各機能を有効にする方法を述べる。S４１のプログラムを行なうものとする。以後、CPUではS２６、S２７にデータを書き込めるものとする。この状態をここでは拡張設定モードと呼称する。 
【００３６】
S４２では拡張設定モードを解除する方法を記載する。S２１に転送すれば良い。これにてCPUは通常の状態に戻る。 
【００３７】
【図５】実際の使用例を示す。  ここでは、本発明の機能の使用方法を示す。本発明の機能の発揮には２系統の考え方がある。一つはOSないしプログラムの上で本発明の機構を活かす設定を明示的に行なう方法である。この方法は従来のOSないしソフトウェアにごく僅かの仕様変更を加えて実行する方法である。既存のソフトウェアを変更する必要があるが高い互換性を得られる方法である。
【００３８】
当図で示すプログラムはアセンブラのソースコードにて記述している。実際の実行形式のプログラムにおいては、CPUが直接実行する機械語コードに置き換えられて実行する。CPUの実行処理については図１２にて説明する。プログラムは、図１２の機構によりメモリより読み込まれ、デコードつまり命令解釈を行ない、実行を行なう。 
【００３９】
S51はS２１にスタック領域を設定するプログラムサンプルである。従来のソフトウェアは必ずこのようにしてS２１にスタック領域を設定している。 
【００４０】
S５２には、本発明を活かすためのプログラムである。従来S５１のように記述していたところをS５２のように変更すれば良い。これにより本発明の機構を利用できるようになる。図６にS５２を使用した時のメモリの配置図を示す。 
【００４１】
【図６】メモリ配置と各レジスタの関係表。    従来、S５１がOSのアプリケーション起動プログラムの中に入っている場合は、OSに対してS５１をS５２のように書き直せば良い。本発明の機構を利用できるようになる。もちろん、CPUが本発明を実装していない場合でも見かけ上、無意味な命令を実行しているだけであり支障なく従来のプログラムを実行できる。
【００４２】
S５２を本発明のCPUが実行した時に、本発明のS２１の示すメモリ番地およびスタックメモリの伸びる方向を説明する。このようにして、S５１をS５２に変更するだけで互換を維持し従来のソフトウェアをそのまま実行できる。 
【００４３】
【図７】自動設定処理を行なう場合。
【００４４】
図７は、請求項２、請求項３、請求項７の具体的な処理の流れを記載したものである。 
【００４５】
S７３のプログラムリストに示すとうり必ずプログラムはS２１にスタック領域の開始アドレスを設定する。この特性を利用してS21に直接指定された値を書き込まずに加工したデータを書き込みスタック領域の設定を互換性を損なわずに変更できる。 
【００４６】
OSないしアプリケーションプログラムを実行するにあたり、事前にCPUにこの設定がなされているとき、自動的にS21は高位側に向かって空きメモリを取り崩して動くようになり従来のソフトウェアが動作する。 
【００４７】
【図８】スタックレジスタに自動設定処理を行なう場合。
【００４８】
当図ではスタックレジスタすなわちS２１への自動設定を行なった時の実際のメモリへの配置を示す。この図ではS２６に対して２進法数値１１１０（１６進法f）を設定しているとする。 
S２１にデータが与えられた時、図７にて説明している機構が作動し、メモリ配置は当図の状態になる。これより、既存のソフトウェアに対して高い互換性を自動にて提供できる。 
【００４９】
【図９】IA32のプロテクトモードの時のメモリ領域参照方法。
【００５０】
当図はIA３２がプロテクトモードと呼称する３２ビットモードの時のメモリ領域の確保のしかたを説明したものである。 
【００５１】
図中S９１は図２におけるS２３のことである。S９１の内容によりS９２ないしS９３を経由してS９４を取得できる。S９４はその内容としてメモリ領域の開始番地とその終了番地を示す情報を備える。IA32において本発明の機構を実装するうえで、メモリ領域の開始番地ないし終了番地を必要とするときはS９４を参照して取得する。 
【００５２】
【図１０】バッファオーバーフロー現象。
【００５３】
ここでは、従来のCPUにおけるスタックメモリ領域上のメモリの配置とバッファーオーバーフローが発生した時の被害を示す。バッファオーバーフローは通常はS１０１の箇所で発生する。一度発生するとメモリは高位がわに延々と破壊がつづいていくことがわかる。 
【００５４】
【図１１】本発明によるバッファオーバーフロー現象。
【００５５】
ここでは、本発明のCPUにおけるスタックメモリ領域上のメモリの配置とバッファーオーバーフローが発生した時の被害を示す。
【００５６】
バッファオーバーフローは通常はS１１１の箇所で発生する。一度発生するとメモリは高位がわに延々と破壊がつづいていく。しかし、空きメモリが高位側にいるので既存のデータはほとんど障害を受けない事を説明できる。 
【００５７】
【図１２】CPUの基本制御。
【００５８】
図１２はCPUの一般的な構造を示す。CPUは逐次解釈機構を備えておりプログラムカウンタの保持する値を読み取り、実行を行なうものである。図中のフローチャートはループしており永久に廻りつづける。 
【００５９】
【図１３】サブルーチンコールの流れ。
【００６０】
図１３はサブルーチンコールを実行した時の処理をフローチャートにしたものである。この処理は、CPUの内部ではS１２４の所に位置する。当図において請求項２の機構をS１３２にて実装している。請求項１をS１３３にて実装している。 
【００６１】
従来のCPUでは、S１３２とS１３３を持っていない。S１３１、S１３４、S１３５の処理を逐次実行するものであった。 
【００６２】
【図１４】サブルーチンリターンの流れ。
【００６３】
図１４はサブルーチンコールのリターン命令を実行した時の処理をフローチャートにしたものである。この処理は、CPUの内部ではS１２４の所に位置する。当図において請求項２の機構をS１４１にて実装している。請求項１をS１４２にて実装している。 
【００６４】
従来のCPUでは、S１４１とS１４２を持っていない。S１４１、S１４３、S１４４、S１４５の処理を逐次実行するものであった。 
【００６５】
【図１５】push命令の流れ。
【００６６】
IA32にはpushという命令がある。これはS２１と連動してメモリにデータを書き込む命令である。この命令はS２１の常に未使用メモリを示すという特性に依存している。請求項１のCPUにおいてはpush命令も動作を変更する必要がある。本発明におけるpush命令の流れ、およびpush処理を行なう機構の動作を当図により説明する。 
【００６７】
【図１６】pop命令の流れ。
【００６８】
IA32にはpopという命令がある。これはS２１と連動してメモリにデータを読み込む命令である。この命令はS２１の常に未使用メモリを示すという特性に依存している。請求項１のCPUにおいてはpop命令も動作を変更する必要がある。本発明におけるpop命令の流れ、およびpop処理を行なう機構の動作を当図により説明する。 
【００６９】
【図１７】相対参照処理。
【００７０】
図１７は相対参照処理の流れを示している。S２１ないしS２８を元となるアドレスとしてこれに対して相対参照にてメモリへの書き込み、読み込みの処理は当図のフローチャートに従う。 
【００７１】
【図１８】S２９による相対参照処理。
【００７２】
図１８は相対参照処理の流れを示している。各汎用レジスタの示す値を基とし、これに相対値を加算したメモリ番地に対してメモリの読み書きが発生する処理を行なう時の処理を示す。 
【符号の説明】
【００７３】
S２１    これは、スタックレジスタ装置である。この機構は従来より存在しており、この機構がメモリの割り振りを高位番地からゼロ側に行なうために多くの問題が発生している。 
【００７４】
S２２    通常プログラムカウンタと呼ばれる装置である。IA32ではインストラクションポインタと呼称している。従来、S21がサブルーチンコールの処理を行なう時、この機構と連動して動作している。 
【００７５】
S２３    スタックセグメントレジスタである。このレジスタには現在のスタックメモリ領域の存在位置を決定する情報を保持している。S23はIA32がプロテクトモードと呼ぶ、３２ビットモードの時に後述するS24とS25を参照してスタックメモリ用に割り振られたメモリ領域を参照することができる。 
【００７６】
S２４    GDTR（グローバルディスクリプタテーブルレジスタ）と呼ぶ装置である。このレジスタはGDT（グローバルディスクリプタテーブル）の存在するメモリ番地を保持している。GDT（グローバルディスクリプタテーブル）は現在CPUが確保して使用しているメモリ領域を管理するテーブルである。 
【００７７】
S２５    LDTR（ローカルディスクリプタテーブルレジスタ）と呼ぶ装置である。このレジスタはLDT（ローカルディスクリプタテーブル）の存在するメモリ番地を保持している。LDT（ローカルディスクリプタテーブル）は現在CPUで動いているプロセスが確保して使用しているメモリ領域を管理するテーブルである。 
【００７８】
S２６    CPUの動作方法を決定するスイッチ装置である。ここでは３２ビットのレジスタの形式をとっている。制御上都合が良いのでレジスタにしている。このスイッチ装置の動作はCPUの状態は図３により説明している。 
【００７９】
当スイッチ装置の第１ビットについて詳細を説明する。このビットがオンの時、S２１、S２８に対してデータの加算か減算を行なう時、加減算を行なうデータに対して正負の符号を反転してCPUは処理をする。 
【００８０】
S２１、S２８を使用して相対メモリ参照を行なう時、指定した相対値の正負の符号を反転してメモリ番地を決定して読み取る。 
【００８１】
S２７    任意の値を保持するためのレジスタである。
【００８２】
S２８    これはS２１と連動して使用する特殊な装置である。スタックメモリ上に確保したメモリを読み書きしたい時、S２１は逐次変化していることからプログラムは一度、S２８にS２１の値を複写したのち、S２８を使用してメモリの読み書きを行なう。通常はS２８の示すメモリ番地に対して＋n番地のメモリを読む書くという操作を行なう。 
【００８３】
S２９    これはスイッチ装置である。図２のうち、eax、ebx、ecx、edx、esi、ediの各汎用レジスタに対して個別にオンオフする。 
【００８４】
このスイッチ装置は、S２６の第１ビットがオンの時に限り動作する。 
【００８５】
このスイッチが有効の時、各スイッチが対応する汎用レジスタに対してスタック領域を示すデータが設定された時にオンになる。 
【００８６】
IA３２においてはS２１ないしS２８の内容をmov命令（インテル表記のアセンブラ命令）にて汎用レジスタにコピーした時にオンになるものとする。また、lea命令（インテル表記のアセンブラ命令）を使いS２１かS２８の有効アドレスを汎用レジスタに設定した時もこのスイッチはオンになる。 
【００８７】
このスイッチがオンの時、対応する汎用レジスタに加算ないし減算の命令が発生した時、合算する値に対して正負符号を反転して演算を行なう。また、汎用レジスタに対して相対メモリ参照が発生した時、汎用アドレスに加算する相対アドレスの正負符号も反転を行なう。この装置は請求項１のCPUの上で、従来のプログラムを実行するとメモリ確保の方向が異なり誤動作が発生するので、これを補正する役割の機構である。 
【００８８】
このスイッチの解除は対応する汎用レジスタに対して数値を直接書き込んだ時に解除するものとする。また指定したメモリ番地の内容を汎用レジスタに読み取った時も解除する。他の汎用レジスタの値を設定する時には、その読み取り元のスイッチの状態を複写するものとする。 
【００８９】
S４１    インテル表記によるアセンブラリストである。この２行のプログラムはS21に対してゼロを最初の行で設定している。２行目でS21の内容をS21に転送をプログラムしている。このプログラムは文法上エラーにはならない。しかし、まったく無意味なプログラムであり、実際に利用することはない。このプログラム操作をもってしてS26,S27への書き込みを有効な状態に切り替えるスイッチとする。S４１はCPUの状態を切り替えるためのプログラムである。 
【００９０】
S４２    インテル表記によるアセンブラリストである。この２行のプログラムはS21に対してゼロ以外の数字を最初の行で書き込む。S２１にゼロ以外の数値を書き込むことにより、S26,S27への書き込みモードは解除する。S４２はこのソフトウェアスイッチの解除のプログラム例である。 
リスト中では、１６進数７fffffffをS２１に設定してソフトウェアスイッチを解除している。 
【００９１】
S５１    インテル表記によるアセンブラリストである。このリストはOSがプログラムを起動する時に必ず実行するS21へのデータの設定例である。リスト中、定数であるSTACK_HIGHを利用してS21にデータを設定している。もちろん定数以外の代入を行なっても良い。ここでは最も簡単な設定例を示す。 
【００９２】
S５２    インテル表記によるアセンブラリストである。このリストは本発明の機構を有効にするプログラムを表わす。リスト中のSTACK_LOWはスタック領域のゼロ側のメモリ領域の開始番地を表わす定数である。事前に適当な数値を設定しているものとする。 
【００９３】
S71    この判定処理は省略可能である。当処理はS21にデータの書き込みがあった時、通常はスタック領域を設定するものである。しかし念のために誤動作防止を目的に判定を行なっている。S21の内容がスタック用に確保したメモリ領域の高位側の最先端であるかを判定する。最先端である時、スタック領域の設定がなされたと判断する。 
【００９４】
メモリ領域の最先端の情報は、IA32においてはS22を見る事により得ることができる。IA32は３２ビットで動作するプロテクトモードの時にはS22はS23ないしS24を参照し、スタック領域を定義するメモリ領域管理情報を得ることができる。 
【００９５】
S7２    S26の第０ビットがゼロの時の動作を示す。S21にプログラムが指定したデータよりS２７に設定されている値を減算するものとする。もし、第０ビットがオンの時にはスタック領域に設定されたゼロ番地側の最先端の番地をS２７に設定している値を加算するものとする。スタック領域の開始の値はIA32においてはS22,S23,S24を参照して取得できる。 
【００９６】
S２７の設定値は第０ビットの状況により加算ないし減算を使い分けてもよい。また、S２７に対して符号付きの値を設定しているものとして、一律加算してもよい。 
【００９７】
S7３    インテル表記のアセンブルプログラムである。このようなS21に代入が行なわれた時に当図のフローチャートが発生するものとする。リスト中のSTACK_HIGHは有値の任意の定数である。STACK_HIGHがゼロの場合の処理はここでは定めない。 
【００９８】
S９１    これは図２におけるS２３のことである。当図においてはS９１と呼称している。 
【００９９】
S９２    これは図２におけるS２４が指示しているメモリ領域の内容である。 
【０１００】
S９３    これは図２におけるS２５が指示しているメモリ領域の内容である。 
【０１０１】
S９４    メモリ管理表である。IA３２のメモリ領域は全てこの形式の表にて管理している。図中Base Addressはメモリの開始アドレスを示す。図中Limitはメモリ領域の長さを示す情報である。２０４８バイト単位のメモリページの数をここでは指定している。スタックメモリ領域の開始番地と終了番地はこの表より取得できる。 
【０１０２】
S１０１    現在実行しているプログラムが使用する作業用メモリ領域である。バッファオーバーフローは通常この領域で発生する。 
【０１０３】
S１１１    本発明のCPUにおいて現在実行しているプログラムが使用する作業用メモリ領域である。バッファオーバーフローは通常この領域で発生する。 
【０１０４】
S１１２    バッファオーバーフローが発生した時の破壊方向を示す。破壊は未使用のメモリに対して流れていくことを説明できる。 
【０１０５】
S１２１    フェッチプロセスと呼称するメモリの読み取り処理である。プログラムカウンタの示すアドレスかららデータを読み取る。このデータは次にCPU 
が実行するプログラムが１行すなわち１命令格納されている。プログラムカウンタはIA32のCPUにおいては図１ないし図２に記載しているEIPのことである。 
【０１０６】
S１２２    フェッチプロセスにより読み取ったメモリのサイズに応じてプログラムカウンタを増加する。この処理によりプログラムカウンタは常に次に実行するメモリ番地を示す。 
【０１０７】
S１２３    デコードプロセスと呼称する処理装置である。読み取ったメモリの内容、すなわちプログラムはCPUは形式によりまちまちであるが、数十から数百の命令を備える。どのような命令であるかをここで分類し、各処理装置ないしCPU内部に格納した対応する処理プログラムに作業を割り振る。 
【０１０８】
S１２４    エグゼキュートプロセスと呼称する読み取ったメモリに応じた実際の処理を行なう部分である。ここで具体的な処理を行なう。各処理はCPUの持つ命令の数だけ存在する。 
【０１０９】
S１３１    現在プログラムカウンタの示すアドレスをスタックレジスタの示すメモリ番地に書き込む。当処理は、サブチーチンプログラムを実行し終わった後、処理の流れを元に復帰するための情報をメモリ装置に保存している。 
【０１１０】
S１３２    本発明の請求項２の機構である。具体的にはS２６を参照する機構である。S２６の第３ビットを調べ、この内容がゼロの時に従来のCPUモードとして処理の流れを決定する装置である。ゼロでない時は本発明請求項１のCPUモードとして流れを決定する。 
【０１１１】
S１３３    本発明の請求項１を実現する機構である。スタックレジスタ装置が現在保存している値に対して、S１３１で書き込み使用したメモリ番地の数を加算する。この結果スタックレジスタは未使用のメモリ番地を保持する。 
【０１１２】
S１３４    スタックレジスタ装置が現在保存している値に対して、S１３１で書き込み使用したメモリ番地の数を減算する。この結果スタックレジスタは未使用のメモリ番地を保持する。 
【０１１３】
S１３５    プログラムカウンンタにこれから実行するサブルーチンプログラムの開始アドレスを格納する。 
【０１１４】
S１４１        本発明の請求項２の機構である。具体的にはS２６を参照する機構である。S２６の第３ビットを調べ、この内容がゼロの時に従来のCPUモードとして処理の流れを決定する装置である。ゼロでない時は本発明請求項１のCPUモードとして流れを決定する。 
【０１１５】
S１４２        本発明の請求項１の機構である。スタックレジスタの保持する値に対して、減算を行なう。減算値はサブルーチンのリターンアドレスの記憶装置上の番地の格納幅を減算する。 
【０１１６】
S１４３        スタックレジスタの保持する値に対して、加算を行なう。減算値はサブルーチンのリターンアドレスの記憶装置上の番地の格納幅を加算する。通常のCPUは、S１４１およびS１４２を装備せず、直接この処理を実行している。当処理装置は本発明のCPU 
に対して従来のCPUとの互換性を維持する役割を担っている。
【０１１７】
S１４４        スタックレジスタの保持する値から、サブルーチンのリターンアドレスを読み取る。 
【０１１８】
S１４５        CPUのプログラムカウンタにS１４４で取得した値を設定する。これにより、サブルーチンコールは終了する。 
【０１１９】
S１５１        S２１の示すアドレスにpush命令で指定したデータを書き込む。 
【０１２０】
S１５２        本発明の請求項２の機構である。具体的にはS２６を参照する機構である。S２６の第３ビットを調べ、この内容がゼロの時に従来のCPUモードとして処理の流れを決定する装置である。ゼロでない時は本発明請求項１のCPUモードとして流れを決定する。 
【０１２１】
S１５３        本発明の請求項１の機構である。S２１の内容を加算する処理を行なう。加算する値はS１５１で書き込むのに必要としたメモリの番地数である。 
【０１２２】
S１５４        S２１の内容を減算する処理を行なう。減算する値はS１５１で書き込むのに必要としたメモリの番地数である。 
【０１２３】
S１６１        本発明の請求項２の機構である。具体的にはS２６を参照する機構である。S２６の第３ビットを調べ、この内容がゼロの時に従来のCPUモードとして処理の流れを決定する装置である。ゼロでない時は本発明請求項１のCPUモードとして流れを決定する。 
【０１２４】
S１６２        本発明の請求項１の機構である。S２１の内容を減算する処理を行なう。減算する値はS１６４で読み込むメモリの番地数である。 
【０１２５】
S１６３        S２１の内容を加算する処理を行なう。加算する値はS１６４で書き込むのに必要としたメモリの番地数である。 
【０１２６】
S１６４        S２１の示すアドレスよりデータを読み取る。
【０１２７】
S１７１        本発明の請求項２に属する機構である。具体的にはS２６を参照する機構である。S２６の第１ビットを調べ、この内容がゼロの時に従来のCPUモードとして処理の流れを決定する装置である。 
【０１２８】
S１７２        相対値の正負の符号を反転する。
【０１２９】
S１７３        相対値を加算する。
【０１３０】
S１８１        本発明の請求項２に属する機構である。具体的にはS２９を参照する機構である。S２９のビットを調べ、この内容がゼロの時に従来のCPUモードとして処理の流れを決定する装置である。 
【０１３１】
S１８２        相対値の正負の符号を反転する。
【０１３２】
S１８３        相対値を加算する。
【図１】
2005316518.tif 000003
【図２】
2005316518.tif 000004
【図３】
2005316518.tif 000005
【図４】
2005316518.tif 000006
【図５】
2005316518.tif 000007
【図６】
2005316518.tif 000008
【図７】
2005316518.tif 000009
【図８】
2005316518.tif 000010
【図９】
2005316518.tif 000011
【図１０】
2005316518.tif 000012
【図１１】
2005316518.tif 000013
【図１２】
2005316518.tif 000014
【図１３】
2005316518.tif 000015
【図１４】
2005316518.tif 000016
【図１５】
2005316518.tif 000017
【図１６】
2005316518.tif 000018
【図１７】
2005316518.tif 000019
【図１８】
2005316518.tif 000020