(57)【要約】【課題】ポインタを利用する言語において、モジュールを超えてポインタのアクセス範囲を、リアルタイム性を保証したまま、正確に保護するプロセッサを提供する。【解決手段】メモリ装置３０上のプログラムを読み込んで逐次実行する命令処理部１と、プログラムにおけるポインタの絶対アドレスが格納されるアドレスレジスタ３と、このポインタについての範囲情報が、絶対アドレスを用いて、格納される範囲情報レジスタ４と、命令処理部が、アドレスレジスタに係るポインタを利用して、メモリ装置をアクセスする際、命令処理部の出力と範囲情報レジスタの範囲情報とを入力し、メモリ装置の範囲違反があるときに、例外信号Ｓ１を命令処理部へ出力する例外発生部７とを備える。ポインタと、そのアクセス範囲情報とを、不可分に関連付け、モジュールを超えても正確にアクセス保護を行う。【選択図】　図１
2004013556.tif 000002
【特許請求の範囲】
【請求項１】
メモリ装置上のプログラムを読み込んで逐次実行する命令処理部と、
前記命令処理部によって読み書きされ、かつ、プログラムにおけるポインタの絶対アドレスが格納されるアドレスレジスタと、
前記命令処理部によって読み書きされ、かつ、このポインタについての範囲情報が、絶対アドレスを用いて、格納される範囲情報レジスタと、
前記命令処理部が、前記アドレスレジスタに係るポインタを利用して、メモリ装置をアクセスする際、前記命令処理部の出力と前記範囲情報レジスタの範囲情報とを入力し、メモリ装置の範囲違反があるときに、例外信号を前記命令処理部へ出力する例外発生部と
を備える、プロセッサ装置。
【請求項２】
メモリ装置上のプログラムを読み込んで逐次実行する命令処理部と、
前記命令処理部によって読み書きされ、かつ、プログラムにおける実行アドレス値が格納されるプログラムカウンタと、
前記命令処理部によって読み書きされ、かつ、プログラムの実行アドレス値についての範囲情報が、格納される範囲情報レジスタと、
前記命令処理部が、前記プログラムカウンタに新たな実行アドレス値を格納する際、この新たな実行アドレス値と、前記範囲情報レジスタの範囲情報とを入力し、範囲違反があるときに、例外信号を前記命令処理部へ出力する例外発生部とを備える、プロセッサ装置。
【請求項３】
メモリ装置上のプログラムを読み込んで逐次実行する命令処理部と、
前記命令処理部によって読み書きされ、かつ、プログラムにおけるポインタの絶対アドレスが格納されるアドレスレジスタと、
前記命令処理部によって読み書きされ、かつ、このポインタについての範囲情報が、絶対アドレスを用いて、格納される第１の範囲情報レジスタと、
前記命令処理部が、メモリ装置をアクセスする際、前記命令処理部の出力と前記第１の範囲情報レジスタの範囲情報とを入力し、メモリ装置の範囲違反があるときに、第１の例外信号を前記命令処理部へ出力する第１の例外発生部と、
前記命令処理部によって読み書きされ、かつ、プログラムにおける実行アドレス値が格納されるプログラムカウンタと、
前記命令処理部によって読み書きされ、かつ、実行アドレス値についての範囲情報が、格納される第２の範囲情報レジスタと、
前記命令処理部が、前記プログラムカウンタに新たな実行アドレス値を格納する際、この新たな実行アドレス値と、前記第２の範囲情報レジスタの範囲情報とを入力し、範囲違反があるときに、第２の例外信号を前記命令処理部へ出力する第２の例外発生部と
を備える、プロセッサ装置。
【請求項４】
前記アドレスレジスタと、前記第１の範囲情報レジスタと、前記プログラムカウンタと、前記第２の範囲情報レジスタとは、いずれも汎用レジスタにより構成されている、請求項３記載のプロセッサ装置。
【請求項５】
範囲情報は、範囲の上限値と範囲の下限値とを含んでいる、請求項１から４記載のプロセッサ装置。
【請求項６】
範囲情報は、範囲の下限値と、この下限値から範囲の上限値までの長さとを含んでいる、請求項１から４記載のプロセッサ装置。
【請求項７】
範囲情報は、読み書きの許可／禁止を示す属性を含んでいる、請求項１から４記載のプロセッサ装置。
【請求項８】
範囲情報は、範囲の上限値を含むが範囲の下限値を含まない、請求項１から４記載のプロセッサ装置。
【請求項９】
前記命令処理部は、プログラムのポインタの絶対アドレスを前記アドレスレジスタに格納する処理と、このポインタの範囲情報を前記範囲情報レジスタに格納する処理とを、１機械語命令において実行する、請求項１または３記載のプロセッサ装置。
【請求項１０】
前記命令処理部は、前記プログラムカウンタに新たな実行アドレス値を格納する処理と、実行アドレス値の範囲情報を前記範囲情報レジスタに格納する処理とを、１機械語命令において実行する、請求項２または３記載のプロセッサ装置。
【請求項１１】
ポインタを直接操作可能なプログラミング言語で記述されたソースコードから、実行コードを生成するコンパイル装置であって、
変数範囲が保存されるメモリと、
ソースコードを解析し、判別条件に従ってコードの渡し先を決定する、ソース解析部と、
前記ソース解析部が変数宣言のコードと判別した場合、このコードを受け取り、かつ、このコードに割り当てる変数領域を決定し、変数アドレスと変数範囲を、前記メモリに格納する、変数領域割り当て部と、
前記ソース解析部が、変数からポインタを生成しているコードと判別した場合、このコードを受け取り、かつ、前記メモリから対応する変数の割り当て領域を読み出し、範囲付きのポインタ変数を生成するコードを生成する、範囲付きポインタ生成部と、
前記ソース解析部が即値からポインタを生成しているコードと判別した場合、全アドレス領域又は設定値を利用した範囲付きのポインタ変数を生成するコードを生成する、即値ポインタ生成部と、
前記ソース解析部がポインタ演算と判別した場合、アドレス範囲を継承したポインタ演算を行うコードを生成する、ポインタ演算コード生成部と、
前記ソース解析部が前記判別条件のいずれにも該当しない場合、コードを受け取り、かつ、このプログラミング言語の文法に対応したコード生成を行う、言語対応実行コード生成部とを備える、コンパイル装置。
【請求項１２】
ポインタを直接操作可能なプログラミング言語で記述されたソースコードから、実行コードを生成するコンパイル装置であって、
関数コード範囲が保存される、関数コード範囲格納用メモリと、
生成された実行コードが保存される、実行コード用メモリと、
ソースコードを解析し、判別条件に従ってコードの渡し先を決定する、ソース解析部と、
前記ソース解析部が関数宣言終了のコードと判別した場合、前記実行コード用メモリの関数コードの範囲を解析し、関数コード範囲を前記関数コード範囲格納用メモリに格納する、関数コード範囲解析部と、
前記ソース解析部が、関数呼び出しのコードと判別した場合、このコードを受け取り、かつ、コード範囲付き分岐コードを生成する、コード範囲付き分岐命令生成部と、
前記ソース解析部が、関数ポインタを生成しているコードと判別した場合、コードを受け取り、かつ、コード範囲付きの関数ポインタ変数を生成するコードを生成する、範囲付き関数ポインタ生成部と、
前記ソース解析部が、前記判別条件いずれにも該当しない場合にコードを受け取り言語の文法に対応したコード生成を行う、言語対応実行コード生成部と、
前記実行コード用メモリからコードを取り出し、関数ポインタに、前記関数コード範囲格納用メモリから取り出した値を埋め込む、関数範囲埋め込み部とを備える、コンパイル装置。
【請求項１３】
範囲は、上限値と下限値とで定義される、請求項１１または１２記載のコンパイル装置。
【請求項１４】
範囲は、下限値と、この下限値から上限値までの長さとで定義される、請求項１１または１２記載のコンパイル装置。
【請求項１５】
範囲は、上限値のみで定義される、請求項１１または１２記載のコンパイル装置。
【請求項１６】
ポインタを直接操作可能なプログラミング言語で記述されたソースコードから生成するコンパイル方法であって、
プログラムソースを解析して判別条件によって処理を分岐するソース解析ステップと、
前記ソース解析ステップで変数宣言と判別された場合、変数領域を確保して変数アドレスと変数範囲を保存するステップと、
前記ソース解析ステップで変数からポインタを生成していると判別された場合、範囲付きのポインタ変数を生成するコードを生成するステップと、
前記ソース解析ステップで即値からポインタを生成していると判別された場合、全アドレス領域又は設定値を利用した範囲付きのポインタ変数を生成するコードを生成するステップと、
前記ソース解析ステップでポインタ演算と判別された場合、アドレス範囲を継承したポインタ演算を行うコードを生成するステップと、
前記ソース解析ステップで、前記判別条件いずれにも該当しない場合、このプログラミング言語の文法に対応したコード生成ステップを備える、コンパイル方法。
【請求項１７】
ポインタを直接操作可能なプログラミング言語で記述されたソースコードから生成するコンパイル方法であって、
プログラムソースを解析して判別条件によって処理を分岐するソース解析ステップと、
前記ソース解析ステップで関数定義完了と判別された場合、関数コード領域を保存する、関数コード領域保存ステップと、
前記ソース解析ステップで関数呼び出しと判別された場合、コード範囲付き分岐命令を生成する、コード範囲付き分岐命令生成ステップと、
前記ソース解析ステップで関数ポインタ生成と判別された場合、コード範囲付き関数ポインタを生成する、コード範囲付き関数ポインタ生成ステップと、
コード変換が全てのソースに行われた後に、前記関数コード領域保存ステップで保存された、関数領域情報を、前記コード範囲付き分岐命令生成ステップ及び前記コード範囲付き関数ポインタ生成ステップで生成されたコードに埋め込む、即値埋め込みステップを備える、コンパイル方法。
【請求項１８】
ポインタを直接操作可能なプログラミング言語で記述されたソースコードから生成するコンパイル方法であって、
プログラムソースを解析して判別条件によって処理を分岐するソース解析ステップと、
前記ソース解析ステップで変数宣言と判別された場合、変数領域を確保して変数アドレスと変数範囲を保存するステップと、
前記ソース解析ステップで変数からポインタを生成していると判別された場合、上限範囲付きのポインタ変数を生成するコードを生成するステップと、
前記ソース解析ステップで即値からポインタを生成していると判別された場合、全アドレス領域又は設定値を利用した上限範囲付きのポインタ変数を生成するコードを生成するステップと、
前記ソース解析ステップでポインタ演算と判別された場合、アドレス範囲を継承したポインタ演算を行うコードを生成するステップと、
前記ソース解析ステップで前記判別条件いずれにも該当しない場合、このプログラミング言語の文法に対応したコード生成ステップを備える、コンパイル方法。
【請求項１９】
範囲は、上限値と下限値とで定義される、請求項１６から１８記載のコンパイル方法。
【請求項２０】
範囲は、下限値と、この下限値から上限値までの長さとで定義される、請求項１６から１８記載のコンパイル方法。
【請求項２１】
範囲は、上限値のみで定義される、請求項１６から１８記載のコンパイル方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、メモリ保護機能を有する、プロセッサ装置、コンパイル装置及びその関連技術に関するものである。
【０００２】
【従来の技術】
コンピュータシステムにおける、従来のメモリ保護技術は、プロセッサもしくはコンパイラ単独で行われていたものが殆どで、組み合わせによるメモリ保護もその技術の延長に位置するに過ぎない。
【０００３】
プロセッサにおけるメモリ保護技術としては、セグメントレジスタ等のように、アドレス範囲を示したレジスタ装置を用いたセグメント保護によるものや、メモリのアクセス可能範囲を設定する、メモリマネージメントユニット（ＭＭＵ）等をプロセッサに設けるページング保護などがある。
【０００４】
これらでは、アクセス範囲の設定をプロセッサの特権モードで動作するＯＳのみに与えることで、不正アクセス時に例外を発生させていた。
【０００５】
さらに、コンパイラ単独によるメモリ保護技術として、メモリ監視機能をすべてソフトウェアで実現するコードをプログラムに埋め込むという手法も存在する。
【０００６】
ソフトウェアでのメモリ監視を高速化するプロセッサ機構をもつものも在るが、メモリ範囲チェックの高速化を行う機構をもつのみで、高級言語が意味するポインタを明確に扱う機構は、存在しない。
【０００７】
以上のうち、まず、セグメント保護やページング保護では、ＯＳの実行されるプロセッサの特権モードでしか書き換えることが出来ないため、メモリ保護機能を有した高度なＯＳが存在しない場合には、利用できない。
【０００８】
また、制御制御や通信などの用途では、タスク切り替えのオーバーヘッドの大きいＭＭＵなどは、利用できない。
【０００９】
さらに、セグメントレジスタやＭＭＵテーブルの割り当ての単位は、プロセス単位でＯＳが割り当てるものであり、アプリケーションの内部の構造に対応した細かいメモリ保護は不可能であったし、プロセスに相当するものが１つしか存在しない組み込み用アプリケーションにおける大規模プログラムには、適用困難である。
【００１０】
ソフトウェアで行うメモリ保護技術は、チェックに時間がかかり、実用的でない。
【００１１】
ハードウェアのアドレス範囲の比較器を備え、これを高速化するプロセッサを利用する手法は存在する。しかしながら、オブジェクト間でポインタを渡す場合、ポインタの保持するアドレス値とは独立したアクセス範囲を、ポインタと同時に渡す必要があり、これを厳密にサポートするアーキテクチャは存在せず、狭い範囲での限定された保護に留まっている。
【００１２】
また、もしこれを厳密に行おうとした場合も、ポインタとアクセス範囲を同時に操作する機能が無いため、操作中に割り込みが発生した場合、ポインタとアクセス範囲の整合性が失われる。
【００１３】
以上のような点に鑑みて、特開平７−６０９５号公報では、ポインタを介して、メモリブロックにアクセスする場合に、プログラムの実行速度を低下させることなく、不当なアクセスを防止する技術が提案されている。
【００１４】
しかしながら、このものでは、プロセッサにおいて、アドレスの範囲を格納するレジスタが用意されているものの、ポインタ値そのものを格納するレジスタが用意されていない。
【００１５】
したがって実際には、このものによると、ポインタと、そのポインタについて許される、アドレスの範囲情報とを、別々に処理せざるを得ない。
【００１６】
つまり、このものにおいて、ポインタとアクセス範囲とが常に整合が取れているという、アトミック性を保証するためには、ポインタの操作の度に、割り込み禁止などを行わねばならず、効率が著しく低下してしまう。
【００１７】
また、このものでは、１つのプロセスについて、ローカルモジュール内部でのメモリ範囲チェック等により、対応している。したがって、モジュールを超える、メモリアクセスが発生すると、その保護範囲を正確に保持することは困難であった。
【００１８】
【発明が解決しようとする課題】
そこで本発明は、ポインタを利用するプログラム言語において、モジュールを超えてポインタのアクセス範囲を、リアルタイム性を保証したまま、正確に保護する技術を提供することを、目的とする。
【００１９】
【課題を解決するための手段】
請求項１記載のプロセッサ装置では、メモリ装置上のプログラムを読み込んで逐次実行する命令処理部と、命令処理部によって読み書きされ、かつ、プログラムにおけるポインタの絶対アドレスが格納されるアドレスレジスタと、命令処理部によって読み書きされ、かつ、このポインタについての範囲情報が、絶対アドレスを用いて、格納される範囲情報レジスタと、命令処理部が、アドレスレジスタに係るポインタを利用して、メモリ装置をアクセスする際、命令処理部の出力と範囲情報レジスタの範囲情報とを入力し、メモリ装置の範囲違反があるときに、例外信号を命令処理部へ出力する例外発生部とを備える。
【００２０】
この構成により、ポインタとその範囲情報とを、不可分に関連付けることができ、ポインタがモジュールを超えて利用されても、ポインタ操作によるアクセス違反を検出でき、動作安定性を向上できる。
【００２１】
請求項２記載のプロセッサ装置では、メモリ装置上のプログラムを読み込んで逐次実行する命令処理部と、命令処理部によって読み書きされ、かつ、プログラムにおける実行アドレス値が格納されるプログラムカウンタと、命令処理部によって読み書きされ、かつ、プログラムの実行アドレス値についての範囲情報が、格納される範囲情報レジスタと、命令処理部が、プログラムカウンタに新たな実行アドレス値を格納する際、この新たな実行アドレス値と、範囲情報レジスタの範囲情報とを入力し、範囲違反があるときに、例外信号を命令処理部へ出力する例外発生部とを備える。
【００２２】
この構成により、実行アドレス値とその範囲情報とを、不可分に関連付けることができ、実行アドレス値が、分岐などにより変化しても、暴走検出を行え、動作安定性を向上できる。
【００２３】
請求項３記載のプロセッサ装置では、メモリ装置上のプログラムを読み込んで逐次実行する命令処理部と、命令処理部によって読み書きされ、かつ、プログラムにおけるポインタの絶対アドレスが格納されるアドレスレジスタと、命令処理部によって読み書きされ、かつ、このポインタについての範囲情報が、絶対アドレスを用いて、格納される第１の範囲情報レジスタと、命令処理部が、メモリ装置をアクセスする際、命令処理部の出力と第１の範囲情報レジスタの範囲情報とを入力し、メモリ装置の範囲違反があるときに、第１の例外信号を命令処理部へ出力する第１の例外発生部と、命令処理部によって読み書きされ、かつ、プログラムにおける実行アドレス値が格納されるプログラムカウンタと、命令処理部によって読み書きされ、かつ、実行アドレス値についての範囲情報が、格納される第２の範囲情報レジスタと、命令処理部が、プログラムカウンタに新たな実行アドレス値を格納する際、この新たな実行アドレス値と、第２の範囲情報レジスタの範囲情報とを入力し、範囲違反があるときに、第２の例外信号を命令処理部へ出力する第２の例外発生部とを備える。
【００２４】
この構成により、ポインタとその範囲情報とを、不可分に関連付けることができ、ポインタがモジュールを超えて利用されても、ポインタ操作によるアクセス違反を検出でき、動作安定性を向上できる。また、実行アドレス値とその範囲情報とを、不可分に関連付けることができ、実行アドレス値が、分岐などにより変化しても、暴走検出を行え、動作安定性を向上できる。
【００２５】
請求項４記載のプロセッサ装置では、アドレスレジスタと、第１の範囲情報レジスタと、プログラムカウンタと、第２の範囲情報レジスタとは、いずれも汎用レジスタにより構成されている。
【００２６】
この構成により、既存のプロセッサ装置に、大幅な変更を加えなくとも、必要な機能を実装できる。
【００２７】
請求項５記載のプロセッサ装置では、範囲情報は、範囲の上限値と範囲の下限値とを含んでいる。
【００２８】
この構成において、上限値と下限値により、範囲を明確に定義できる。
【００２９】
請求項６記載のプロセッサ装置では、範囲情報は、範囲の下限値と、この下限値から範囲の上限値までの長さとを含んでいる。
【００３０】
この構成において、上限値と、下限値から範囲の上限値までの長さにより、範囲を明確に定義できる。
【００３１】
請求項７記載のプロセッサ装置では、範囲情報は、読み書きの許可／禁止を示す属性を含んでいる。
【００３２】
この構成における属性により、細やかなアクセス制御を実現できる。
【００３３】
請求項８記載のプロセッサ装置では、範囲情報は、範囲の上限値を含むが範囲の下限値を含まない。
【００３４】
この構成により、少ないメモリ量で、実情上有効な範囲保護を実現できる。
【００３５】
請求項９記載のプロセッサ装置では、命令処理部は、プログラムのポインタの絶対アドレスをアドレスレジスタに格納する処理と、このポインタの範囲情報を範囲情報レジスタに格納する処理とを、１機械語命令において実行する。
【００３６】
請求項１０記載のプロセッサ装置では、命令処理部は、プログラムカウンタに新たな実行アドレス値を格納する処理と、実行アドレス値の範囲情報を範囲情報レジスタに格納する処理とを、１機械語命令において実行する。
【００３７】
これらの構成において、１機械語命令により、これらの処理を実行することにより、割り込みにより処理が分断されず、アトミック性が高く、正確な、動作を担保できる。
【００３８】
【発明の実施の形態】
具体的な構成の説明に先立ち、本願発明の基本的な考え方を説明する。
【００３９】
（メモリアクセス保護に関して）
既存の多くのメモリ保護技術は、ＯＳの存在を前提にプログラムのプロセス単位で粒度の荒い保護を行うものが主流である。
【００４０】
これは、不特定のコードを実行する場合には有効であるが、設計者の意図したプログラムしか実行されない組み込みシステムには向かない。
【００４１】
コンパイラにメモリ保護機能を移管した場合、アクセスの前提となる変数毎のメモリ範囲をコンパイラに保持させるれば、粒度の細かいメモリ保護が可能となる。
【００４２】
より具体的には、メモリ範囲違反の発生する可能性のあるポインタ変数に、そのポインタを算出するに当たって利用された、変数のアクセス範囲を、不可分に関連付け、以降そのポインタ変数を利用したアクセス時に、範囲チェックを行えば良い。
【００４３】
（プロセッサに必要な機能）
メモリアクセス保護を高速に行うには、通常のプロセッサに機能追加が必要である。まず、プロセッサには、ポインタの絶対アドレスを格納するレジスタと、そのアクセス範囲を保持できる範囲情報レジスタとが、必要である。また、これらは、割り込みなどに介在されずに、１命令で読み書きできるようにすべきである。
【００４４】
そうすると、アクセス範囲情報を含むポインタを、アトミックに操作可能となり、しかも、プログラマは、ポインタが範囲情報と関連付けられていることを、特に意識する必要はない。
【００４５】
またこの際、ポインタのアドレス値と、範囲情報とは、分離できるように独立している必要がある。
【００４６】
単なるソフトウェアでのメモリ保護を高速化するだけのプロセッサの場合、アドレス値からの範囲を同時に備えているものがあるが、高級言語レベルでの厳密な整合性を取るためには、アドレス値がどのような値に書き換えられても、アクセス範囲情報の指すメモリ範囲は、変化してはならない。
【００４７】
次に、プロセッサには、例外発生部として、アドレス比較器を設けるべきである。そして、ポインタを利用したメモリアクセスが発生した場合、最終的に発生するアドレスとポインタの保持するアドレス範囲が比較され、範囲外であれば例外を発生させる。
【００４８】
このような技術は、既存のプロサッサアーキテクチャに対して、単なる拡張機能として追加的に実装可能である。
【００４９】
（コンパイラに必要な機能）
コンパイラは、全ての変数にメモリ領域を割り当てる場合に際して、それぞれの範囲を保持しておく必要がある。
【００５０】
プログラム中でポインタを生成する部分があれば、従来どおりポインタを生成すると共に、そのポインタを生成する元となる変数の範囲情報を、このポインタと不可分に関連付ける、必要がある。
【００５１】
もしこの際に、Ｉ／Ｏアクセスなどで、プログラム中の即値からアドレスを生成する場合は、そのポインタの持つアクセス範囲はメモリ空間の全てを指すようにするとよい。こうすると、即値から生成したポインタは、従来どおりのアクセス保護の無いポインタとして扱える。
【００５２】
また、必要に応じて、即値から生成されるポインタのアクセス範囲をコンパイルオプションなどで予め限定しておいたり、拡張構文を用意してプログラム中に埋め込むことも可能である。
【００５３】
ポインタに対する演算処理は、従来どおり行えばよく、アクセス時にはプロセッサ側で保護がかかる。
【００５４】
ポインタ以外の範囲違反の要因として配列アクセスがある。配列は、ポインタとは異なるが、アクセス時には、配列のアドレスをレジスタに読み出し、インデックスを加算してアクセスを行う。そのため、配列アドレスをレジスタに読み出す際に、配列のアクセス範囲を含めて、範囲情報レジスタに読み出すようにすれば、ポインタ同様に保護が実現できる。つまり、配列アドレスと、ポインタとを区別する実益はない。したがって、本明細書では、一般の定義を拡張して、配列のアドレスを含めて、「ポインタ」として取り扱う。
【００５５】
また、コンパイラは、専用のライブラリプログラムと共に提供されることが普通であり、ライブラリには、動的メモリ割り当て機能（例えば、ｍａｌｌｏｃ関数など）がある場合が多い。その場合は、動的メモリ割り当てライブラリが確保したメモリの範囲情報を有したポインタを返すように作成すればよい。このようにすれば、本発明の「ポインタ」に含めて、取り扱える。
【００５６】
（アクセス範囲限定による効率向上）
以上のように、ポインタと、その範囲情報を不可分に関連付けると、メモリ使用量の点では、事実上、ポインタのサイズが、範囲情報分大きくなったのと等しい。しかしながら、一般に、変数として利用するポインタは、ポインタ以外の変数に比べ、通常数が少なく、ＲＡＭ使用量の増大は、近年のメモリ容量の増大からすれば、さしたる問題ではない。ポインタ変数以外で暗黙に読み出される範囲情報は、ＲＯＭに格納しても良い。
【００５７】
また、効率に関しても、モジュール間のポインタ情報渡しは、レジスタで行うことが多いため、アクセス範囲付きでアトミックに読み書きできるプロセッサであれば、レジスタ対レジスタの移動による効率の低下は発生しない。
【００５８】
メモリ対レジスタ間移動であっても、メモリ上にアドレス値とアドレス範囲が連続しているため、メモリのバーストアクセス及びキャッシュヒットの効率アップが望め、効率の低下は極めて少ない。
【００５９】
しかしながら、少ないとはいえ効率の低下を許容できない場合は、アドレス範囲情報をアドレス上方に対する制限だけに限定し、アドレス範囲情報の情報量を半減させることも可能である。
【００６０】
これには、アドレス値の半分だけを扱える命令を備えたプロセッサ及びコンパイラが必要である。また、多くの範囲違反は、アドレス上方に対して発生するため、アクセス保護の完全性は失われるが、実用上の効果は十分に得られる。
【００６１】
（プログラムの暴走検出に関して）
既存のメモリ監視によるプログラムの暴走検出技術の多くでは、ＯＳの存在を前提に、プログラムのプロセス単位で粒度の荒い保護を行っている。
【００６２】
これは、不特定のコードを実行する場合には有効であるが、設計者の意図したプログラムしか実行されない組み込みシステムには向かない。
【００６３】
コンパイラに暴走検出の機能を移管した場合、アクセスの前提となる関数毎のメモリ範囲を、コンパイラに保持させると、粒度の細かい暴走検出が可能となる。
【００６４】
具体的には、プログラムの暴走が発生する可能性のある関数ポインタ変数に、その関数ポインタを算出するに当たって利用された関数のコード範囲を、不可分に関連付け、以降そのプログラムの別関数への分岐時及び実行中に範囲チェックを行えば良い。
【００６５】
高級言語の関数に対する保護だけであれば、分岐時のチェックだけでも問題ないが、実行中のチェックも同一機構で実現可能であるため、高級言語の関数から、アセンブリ言語によって作られたモジュールに分岐する際にも、高い効果を発揮する。
【００６６】
（プロセッサに必要な機能）
プログラムの暴走検出を高速に行うには、通常のプロセッサに、機能追加が必要である。まず、プロセッサには、プログラムカウンタと、このカウンタのアクセス範囲を保持できるレジスタが必要である。
【００６７】
これに加えて、プログラムカウンタの値が更新される際に範囲情報と比較して、範囲外であれば例外を発生させる例外発生部として、比較器を設けるべきである。
【００６８】
また、プログラムカウンタを、その範囲情報と共に書き換える、分岐命令の追加が必要である。
【００６９】
このような技術は、既存のプロサッサアーキテクチャに対して、拡張機能として追加可能である。
【００７０】
（コンパイラに必要な機能）
コンパイラは、全ての関数にコード用のメモリ領域を割り当てる場合に際して、それぞれの範囲を保持しておく必要がある。
【００７１】
プログラム中で関数ポインタを生成する部分があれば、従来どおり関数ポインタを生成すると共に、その関数ポインタを生成する元となる関数のコード範囲を、関数ポインタに対して、不可分に関連付ける必要がある。
【００７２】
もしこの際に、ＯＳのサービスコールなど範囲の不明な関数への呼び出しを埋め込む場合は、関数ポインタの持つアクセス範囲は、メモリ空間の全てを指すようにする。こうすると、生成した関数ポインタは、従来どおりのアクセス保護の無い関数ポインタとして扱える。
【００７３】
必要に応じて、この際の関数ポインタのアクセス範囲をコンパイルオプションなどで予め限定しておいたり、拡張構文を用意してプログラム中に埋め込むことも可能である。
【００７４】
関数呼び出しの際は、プログラムカウンタ値と共にプログラムカウンタのアクセス範囲も、更新する分岐命令で分岐するとよい。関数内での分岐は、従来どおりのプログラムカウンタのみを更新する命令で分岐を行う。
【００７５】
（アクセス範囲限定による効率向上）
上記のようにすると、事実上、関数ポインタのサイズが、範囲情報分大きくなり、メモリ使用量は増大する。しかしながら通常、関数ポインタは、データ用変数と比べて、使用割合は少ない。
【００７６】
静的な関数呼び出しに関しては、関数アドレス及び範囲値はＲＯＭに格納することもできる。
【００７７】
また、メモリ上にアドレス値と範囲情報とを連続して格納すれば、メモリのバーストアクセス及びキャッシュヒットの効率アップが望め、効率の低下は極めて少ない。
【００７８】
しかしながら、少ないとはいえ効率の低下を許容できない場合は、アセンブリ言語で作られた関数の保護に限定してアドレス範囲情報をアドレス上方に対する制限だけに限定し、アドレス範囲情報の情報量を半減させることも可能である。
【００７９】
これには、アドレス値の半分だけを扱える命令を備えたプロセッサ及びコンパイラが必要である。しかしながら、多くのアセンブリ言語の暴走は、アドレス上方に対して発生するため、暴走検出の完全性は失われるが、実用上の効果は得られる。
【００８０】
以上の説明をふまえ、以下図面を参照しながら、本発明の実施の形態を具体的に説明する。
【００８１】
（実施の形態１）
本形態は、プロセッサ装置に関する。図１は、本発明の実施の形態１におけるプロセッサ装置のブロック図である。
【００８２】
図１に示すように、このプロセッサ装置１０は、バス２０を介して、メモリ装置３０やＩ／Ｏ装置４０等に接続される。そして、プロセッサ装置１０は、次の構成要素を備える。
【００８３】
命令処理部１は、バス２０を経由して、メモリ装置３０上のプログラムを読み込んで逐次実行したり、Ｉ／Ｏ装置４０と入出力を行う。
【００８４】
ここで、本形態では、命令処理部１と、バス２０との間に、ＭＭＵ（メモリマネージメントユニット）を設け、命令処理部１とＭＭＵ２とは、論理アドレスを用いて入出力をし、ＭＭＵ２は、論理アドレス／物理アドレスの変換を行うことにしているが、例えば、ＭＭＵを省略し、命令処理部１が、物理アドレスを入出力するようしても差し支えない。
【００８５】
さて、本形態のプロセッサ装置１０には、通常のプロセッサ装置の要素に加えて、次のレジスタ（通常、汎用レジスタで構成すればよい。）が設けられている。
【００８６】
まず、アドレスレジスタ３は、命令処理部１によって読み書きされ、かつ、プログラムにおけるポインタの絶対アドレスが格納される。また、第１範囲情報レジスタ４は、命令処理部１によって読み書きされ、かつ、このポインタについての範囲情報が、絶対アドレスを用いて、格納される。
【００８７】
これらアドレスレジスタ３と、第１範囲情報レジスタ４とは、不可分に関連付けられたペアである。アドレスレジスタ３と、第１範囲情報レジスタ４との対応関係は、命令処理部１が管理している。
【００８８】
命令処理部１は、プログラムのポインタの絶対アドレスをアドレスレジスタ３に格納する処理と、このポインタの範囲情報を第１範囲情報レジスタ４に格納する処理とを、１機械語命令（アクセス範囲情報付きレジスタロード命令）において実行する。
【００８９】
より具体的には、命令処理部１は、このレジスタロード命令を、メモリ装置３０上から読み出すと、この命令をデコードして実行し、その結果、命令処理部１は、プログラムのポインタの絶対アドレスをアドレスレジスタ３に格納すると共に、このポインタの範囲情報を第１範囲情報レジスタ４に格納する。
【００９０】
この命令は、プロセッサが特権モードであることを、前提としない。つまり、この命令は、アプリケーションプログラムのソースコードで記述できる、単独の命令である。また、この命令は、１機械語命令であるから、命令の途中で、割り込みが発生することはありえず、アドレスレジスタ３のアドレス値と、第１範囲情報レジスタ４の範囲情報とが、分断されないことを保証できる。これにより、アトミック性が確保される。
【００９１】
また、第１範囲情報レジスタ４に格納される、範囲情報は、（例１）範囲の上限値と範囲の下限値とを含む、（例２）範囲の下限値と、この下限値から範囲の上限値までの長さとを含む、のいずれの形態としても良い。（例１）または（例２）では、１つのポインタに対して、３つのアドレスを格納することになるから、ポインタによるメモリ使用量は、通常のものの、３倍になる。
【００９２】
さらに、（例３）この範囲情報に、読み書きの許可／禁止を示す属性（例えば、読み書きいずれも許可、書込み禁止など）を含めて、細かい制御を行うこともできる。
【００９３】
また、上記基本的な考え方で言及したように、（例４）範囲情報を、範囲の上限値のみとし、範囲の下限値や下限値から範囲の上限値までの長さを含めないように、構成しても、実用上の効果がある。
【００９４】
図１において、第１例外発生部７は、比較器から構成される。第１例外発生部７は、命令処理部１が、アドレスレジスタ３に係るポインタを利用して、メモリ装置３０をアクセスする際、命令処理部１の出力（本例では、論理アドレス値）と、第１範囲情報レジスタ４の範囲情報とを入力し、比較演算を行い、メモリ装置３０の範囲違反があるときに、例外信号Ｓ１を命令処理部１へ出力する。
【００９５】
このメモリ装置３０のアクセスは、直接アドレッシングでも良いし、インデックス値の加減算を行う間接アドレッシングでも良い。
【００９６】
このプロセッサアーキテクチャにより、範囲情報が不可分に関連付けられたポインタを、範囲チェックをしながら、１機械語命令により、高速かつアトミックに、扱うことが可能となる。
【００９７】
しかも、ＯＳなどプロセッサの特権モードで動作するプログラムの介在無しに、プログラム自身で、例外を発生させ、不適切なメモリアクセスをトラップできる。
【００９８】
また、図１に示すように、このプロセッサ装置１０には、次のレジスタ（通常、汎用レジスタで構成すればよい。）が設けられている。
【００９９】
まず、プログラムカウンタ５は、命令処理部１によって読み書きされ、かつ、プログラムにおける実行アドレス値が格納される。また、第２範囲情報レジスタ６は、命令処理部によって読み書きされ、かつ、プログラムの実行アドレス値についての範囲情報が、格納される。
【０１００】
これらプログラムカウンタ５と、第２範囲情報レジスタ６とは、不可分に関連付けられたペアである。プログラムカウンタ５と、第２範囲情報レジスタ６との対応関係は、命令処理部１が管理している。
【０１０１】
命令処理部１は、プログラムカウンタ５に新たな実行アドレス値を格納する処理と、実行アドレス値の範囲情報を、第２範囲情報レジスタ６に格納する処理とを、１機械語命令（アクセス範囲情報つき分岐命令）において実行する。
【０１０２】
この処理は、プログラムカウンタ５の実行アドレス値を、インクリメントする場合や、ＪＵＭＰあるいはＣＡＬＬ命令のような、分岐命令を実行する際に、行われる。
【０１０３】
より具体的には、命令処理部１は、この分岐命令を、メモリ装置３０上から読み出すと、この命令をデコードして実行し、後述する例外信号Ｓ２がなければ、命令処理部１は、プログラムの新たな実行アドレス値をプログラムカウンタ５に格納すると共に、必要があれば、これにあわせて、実行アドレス値の範囲情報を第２範囲情報レジスタ６に格納する。
【０１０４】
プログラムカウンタ５と第２範囲情報レジスタ６とのペアは、上述した、アドレスレジスタ３と第１範囲情報レジスタ４とのペアと、よく似ている。
【０１０５】
すなわち、この命令（アクセス範囲情報つき分岐命令）は、プロセッサが特権モードであることを、前提としない。つまり、この命令は、アプリケーションプログラムのソースコードで記述できる、単独の命令である。また、この命令は、１機械語命令であるから、命令の途中で、割り込みが発生することはありえず、プログラムカウンタ５の実行アドレス値と、第２範囲情報レジスタ６の範囲情報とが、分断されないことを保証できる。これにより、アトミック性が確保される。
【０１０６】
また、範囲情報についても、上述と同様である。すなわち、第２範囲情報レジスタ６に格納される、範囲情報は、（例５）範囲の上限値と範囲の下限値とを含む、（例６）範囲の下限値と、この下限値から範囲の上限値までの長さとを含む、のいずれの形態としても良い。（例５）または（例６）では、１つの実行アドレス値に対して、３つの実行アドレス値を格納することになるから、メモリ使用量は、通常のものの、３倍になる。
【０１０７】
また、上記基本的な考え方で言及したように、（例７）範囲情報を、範囲の上限値のみとし、範囲の下限値や下限値から範囲の上限値までの長さを含めないように、構成しても、実用上の効果がある。
【０１０８】
図１において、第２例外発生部８は、比較器から構成される。第２例外発生部８は、命令処理部１が、プログラムカウンタ５に新たな実行アドレス値を格納する際、この新たな実行アドレス値と、第２範囲情報レジスタ６の範囲情報とを入力し、範囲違反があるときに、第２の例外信号Ｓ２を命令処理部へ出力する。
【０１０９】
なお、第２例外発生部８は、第１例外発生部７とは異なり、命令処理部１が、新たな実行アドレス値をセットした後に、例外信号Ｓ２を出力するのではなく、命令処理部１が、新たな実行アドレス値をセットしようとするときに、例外信号Ｓ２を発生するようにしている。これは、プログラムレジスタ５に不正な実行アドレス値がセットされること自体が問題であり、このような事態を未然に防止し、暴走（プログラマが意図しない実行アドレス値に制御が移動してしまうこと）を回避するためである。
【０１１０】
従来技術では、プロセッサの暴走はプロセス単位でしか行えず、自プロセス内部で偶然アドレスが暴走すると、検出困難であった。また、組み込みシステムに多い、単一プロセスの環境では、暴走検出そのものができない。
【０１１１】
本形態のような、プロセッサアーキテクチャによれば、ソフトウェアモジュール内部でのプロセッサの実行範囲を制限することが可能となり、アセンブリ言語などで書かれたモジュールの暴走や、データ破壊によるＣ言語モジュールの暴走を、細かい粒度で検出できる。
【０１１２】
また、このプロセッサアーキテクチャにより、範囲情報が不可分に関連付けられた実行アドレス値を、範囲チェックをしながら、１機械語命令により、高速かつアトミックに、扱うことが可能となる。
【０１１３】
しかも、ＯＳなどプロセッサの特権モードで動作するプログラムの介在無しに、プログラム自身で、例外を発生させ、不適切な分岐をトラップできる。
【０１１４】
次に、図２を用いて、アドレスレジスタ３と、第１範囲情報レジスタ４とのペアによる、メモリ保護の例を説明する。図２（ａ）は、本発明の実施の形態１で取り上げるソースコードの例示図である。なお、この例では、プログラミング言語として、ｃ言語を使用しているが、ポインタを直接取り扱える、他のプログラミング言語（例えば、Ｐａｓｃａｌなど）でも同様の利点がある。
【０１１５】
さて、図２（ａ）のソースコードでは、ｍａｉｎ関数と、ｆｏｏ関数とが、定義されており、ｍａｉｎ関数内で宣言（０３行目）されるｉｎｔ型の配列ａ［］を、０５行目において、ｆｏｏ関数で使用している。
【０１１６】
また、ｆｏｏ関数では、１４行目から１５行目において、インデックスｉを用いた、ループが記述されている。
【０１１７】
さて、上述したように、本形態のプロセッサアーキテクチャ（以下簡単のため、（例１）を使用するものとする）によると、ひとつのポインタについて、上限値と下限値との範囲情報が、不可分に関連付けられるから、結局、３つのアドレス値が使用されることになる。
【０１１８】
ここで、このプロセッサアーキテクチャに対応した、ｃ言語のコンパイラは、まず、ｍａｉｎ関数の０３行目を評価するときに、配列ａ［］の先頭アドレス（ここではポインタと同一視する）と、そのサイズ（ａ［０］からａ［２］）がｉｎｔ型３つ分であることを知る。
【０１１９】
そして、０５行目において、ｆｏｏ関数の引数として、配列ａ［］の先頭アドレスが渡されていることを、評価するときに、上述のように知った、サイズから、配列ａ［］について、範囲情報付きのポインタ（ａ［］のポインタのアドレス値と、そのアドレスの下限値および上限値の、３つのアドレス値からなる）を生成する。
【０１２０】
そして、１０行目において、ｆｏｏ関数が呼び出されるときに、このコンパイラは、ｉｎｔ型のポインタｐ（これも範囲情報付きポインタである）に、生成された配列ａ［］についての、範囲情報付きのポインタを代入する。
【０１２１】
その結果、ポインタｐについて考えると、代入当初では、配列ａ［］の範囲情報付きポインタとまったく同じものになる。
【０１２２】
ところで、ｆｏｏ関数では、１４行目から１５行目において、インデックスｉを用いたループが記述されている。実は、このループは、適切なアクセス範囲を逸脱する、不正なものである。
【０１２３】
ここで、インデックスｉ＝０なら、図２（ｂ）に示すように、ポインタｐは、代入当初と変わらない。すなわち、ポインタｐのアドレスは、配列ａ［］の先頭アドレスと一致しており、ポインタｐの上限値と下限値は、配列ａ［］の上限値と下限値にそれぞれ一致する。
【０１２４】
そして、１４行目のｆｏｒ文により、インデックスｉがインクリメントされ、図２（ｃ）に示すように、インデックスｉ＝２となったとき、ポインタｐのアドレスは、配列ａ［］の最後の要素ａ［２］の先頭アドレスを指す。ここまでは、ポインタｐの上限値および下限値で定められた範囲に属しており、なんら問題ない。
【０１２５】
しかしながら、インデックスｉ＝３になり、そのまま処理を進めると、図２（ｄ）に示すように、ポインタｐは配列ａ［］の範囲を逸脱し、無効領域を指すことになる。この無効領域は、なんら意味のないゴミの値がセットされているものかもしれないし、別のモジュールのため確保されているものかもしれない。いずれにしても、無効領域にむやみにアクセスすると、そこに確保されているかもしれないモジュールの破壊を招来するから、正常な動作を保証できなくなる。
【０１２６】
ところが、本形態によれば、ポインタｐのアドレス値に、ａ［２］の先頭アドレスをｉｎｔ型１つ分だけ進めたアドレスを、セットしようとすると、例外信号Ｓ１が発生し、このような事態が未然に回避される。
【０１２７】
１５行目では、この無効領域に、値「０」を代入することになっているが、代入される前に、ポインタｐの範囲違反がトラップされるため、無効領域に値「０」がセットされることはない。
【０１２８】
このように、本発明では、プロセッサのレベルにおいても、１機械語命令で、ポインタとその範囲情報とを、不可分に関連付けて取り扱うことにより、ポインタそのもの（厳密には、範囲情報付きポインタ）だけで、アクセス違反を未然に防止できるのである。
【０１２９】
従来技術により、似たような保護を実施しようとすると、ソースコードレベルにおいて、どのモジュールからもスコープに入る、グローバルなテーブルを用意し、このテーブルに、変数のアクセス範囲を格納し、いちいちこれを参照して、処理を実行せざるを得ないので、高速実行は困難であった。しかしながら、このテーブルがスコープ外となるような、別のモジュールのポインタに、元のポインタのアクセス範囲を反映させるすべがない。また、ポインタを引き渡された側の、モジュールにおいても、そのポインタのアクセス範囲が適正であるか否かを知ることができない。
【０１３０】
本形態によれば、単純に、範囲情報付きポインタを、代入するか、引き渡すだけで、足りるし、ソースコードレベルで、わざわざグローバルなテーブルを作成するような必要もない。また、ポインタの演算を行っても、範囲情報を含めて正確に演算すれば、演算後のポインタの範囲情報が適切になることを保証できる。
【０１３１】
すなわち、本発明によれば、プロセッサの機能により、通常のポインタと極めて等価に扱えるポインタにアクセス範囲情報を含むことが可能であり、モジュールを超えても、ポインタによる不当なアクセスを、高速かつ正確に、予防できる。
【０１３２】
図２（ａ）から明らかなように、範囲情報付きポインタを使用するために、特別な記述は不要である。そして、ソースコードの記述そのものは、従来どおりであり、ソースコード互換性が担保されている。つまり、プログラマは、範囲情報付きポインタを取り扱っていることを、特に意識する必要はない。
【０１３３】
（実施の形態２）
本形態は、図１に示した、アドレスレジスタ３と、第１範囲情報レジスタ４とのペアによる、範囲情報つきポインタをサポートする、コンパイル装置に関する。なお、ソースコードから実行可能コードを生成する場合には、通常、段階を踏んで、コンパイル、リンクなどの手法を組み合わせるが、本明細書では、ソースコードから実行可能コード生成までの一連の手法を、一括してコンパイルと呼ぶ。
【０１３４】
図３は、本発明の実施の形態２におけるコンパイル装置のブロック図である。もちろん、図２に示す、このコンパイル装置５１は、ポインタを直接操作可能なプログラミング言語（例えば、ｃ／ｃ＋＋言語、Ｐａｓｃａｌなど）で記述されたソースコード５２から、実行コード６０を生成する。
【０１３５】
このソースコード５２においては、実施の形態１で述べたように、範囲情報付きポインタを使用するために、特別な記述は不要である。
【０１３６】
図２において、ソース解析部５３は、ソースコード５２を解析し、判別条件に従ってコードの渡し先を決定する。また、メモリ５０には、変数範囲が保存される。
【０１３７】
変数領域割り当て部５４は、ソース解析部５３が変数宣言のコードと判別した場合、このコードを受け取り、かつ、このコードに割り当てる変数領域を決定し、変数アドレスと変数範囲を、メモリ５０に格納する。
【０１３８】
範囲情報付きポインタ生成部５６は、ソース解析部５３が、変数からポインタを生成しているコードと判別した場合、このコードを受け取り、かつ、メモリ５０から対応する変数の割り当て領域を読み出し、範囲付きのポインタ変数を生成するコードを生成し、コード結合装置５９に出力する。
【０１３９】
即値ポインタ生成部５８は、ソース解析部５３が即値からポインタを生成しているコードと判別した場合、全アドレス領域又は設定値を利用した範囲付きのポインタ変数を生成するコードを生成し、コード結合装置５９に出力する。
【０１４０】
ポインタ演算コード生成部５５は、ソース解析部５３がポインタ演算と判別した場合、アドレス範囲を継承したポインタ演算を行うコードを生成し、コード結合装置５９に出力する。
【０１４１】
言語対応実行コード生成部５７は、ソース解析部５３が判別条件のいずれにも該当しない場合、コードを受け取り、かつ、このプログラミング言語の文法に対応したコードを生成し、コード結合装置５９に出力する。
【０１４２】
コード結合部５９は、生成されたすべてのコードを結合して、実行可能コード６０を出力する。
【０１４３】
ここで、実施の形態１と同様に、ポインタのアクセスの範囲は、上限値と下限値とで定義してもよいし、下限値と、この下限値から上限値までの長さとで定義してもよいし、上限値のみで定義してもよい。
【０１４４】
次に、動作を説明する。図４は、本発明の実施の形態２におけるコンパイル装置のフローチャートである。
【０１４５】
まず、ステップ３１では、ソース解析部５３が、ソースコード５２を解析して判定条件に従って分岐し、コードの渡し先が決定される。
【０１４６】
ステップ３１で、変数宣言と判別された場合は、ステップ３２において、変数領域割り当て部５４が、変数領域を確保し、その領域のアドレス及び範囲が、メモリ５０に保存される。
【０１４７】
ステップ３１で、変数からポインタを生成していると判別された場合は、ステップ３３にて、範囲付きポインタ生成部５６が、変数アドレスと変数範囲を含んだポインタを扱うコードを生成し、命令処理部１で処理可能なポインタが生成される。
【０１４８】
ステップ３１で、即値からのポインタ生成と判別された場合は、ステップ３４にて、即値ポインタ生成部５８が、即値から生成されたポインタと予め決められた値による範囲情報付きポインタを生成する。この場合の範囲情報は、プロセッサの全メモリ空間又はコンパイラの設定などで決定する。
【０１４９】
ステップ３１で、ポインタ演算と判別された場合は、ステップ３５にて、ポインタ演算コード生成部５５が、アドレス範囲情報を継承した演算を行うコードを生成する。
【０１５０】
ステップ３１で、前記以外と判別された場合は、ステップ３６にて、言語対応実行コード生成部５７が、言語の文法に対応するコード（従来技術どおりＣ言語の文法に従った実行コード）を生成する。
【０１５１】
そして、ステップ３７にて、ソース解析部５３が、ソースの終端まで、ステップ３１から３６の処理を繰り返し、ソースの終端に達したら、コンパイル処理を終了する。
【０１５２】
ここで生成されたコードは、アドレスレジスタ３および第１範囲情報レジスタ４のペアを利用するため、ポインタアクセスの範囲が、ポインタ生成元の変数の範囲を超えた場合に例外信号Ｓ１を発生でき、範囲情報を伴うポインタをレジスタにロードする際に１命令で処理できるため、コードサイズも小さくできかつ高速動作可能である。
【０１５３】
このコンパイル装置５１により、従来のＣ言語ソースコードをそのまま利用して、範囲情報付きポインタをサポートし、メモリ保護を行える。
【０１５４】
（実施の形態３）
本形態は、図１に示す、プログラムカウンタ５と第２範囲情報レジスタ６のペアによる、実行アドレス値の範囲保護をサポートするコンパイル装置に関する。
【０１５５】
図５は、本発明の実施の形態３におけるコンパイル装置のブロック図である。図５に示すように、このコンパイル装置７１は、実施の形態２と同様のプログラミング言語で記述されたソースコード７２から、実行コード８１を生成し、次に述べる要素を備えている。
【０１５６】
ソース解析部７３は、判別条件に従ってコードの渡し先を決定する。関数コード範囲格納用メモリ７９には、関数コード範囲が保存される。実行コード用メモリ７８には、生成された実行コードが保存される。
【０１５７】
関数コード範囲解析部７４は、ソース解析部７３が関数宣言終了のコードと判別した場合、実行コード用メモリ７８の関数コードの範囲を解析し、終了した、関数コード範囲を関数コード範囲格納用メモリ７９に格納する。
【０１５８】
コード範囲付き分岐命令生成部７５は、ソース解析部７３が、関数呼び出しのコードと判別した場合、このコードを受け取り、かつ、コード範囲情報付き分岐命令を値を未解決のまま生成し、実行コード用メモリ７８へ出力する。
【０１５９】
範囲付き関数ポインタ生成部７６は、ソース解析部７３が、関数ポインタを生成しているコードと判別した場合、コードを受け取り、かつ、コード範囲付きの関数ポインタ変数を、値が未解決のまま生成する。
【０１６０】
言語対応実行コード生成部７７は、ソース解析部７３が、判別条件いずれにも該当しない場合にコードを受け取り言語の文法に対応したコード生成を行い、実行コードを実行コード用メモリ７８へ出力する。
【０１６１】
関数範囲埋め込み部８０は、全プログラムソースの処理が完了した後に、実行コード用メモリ装置７８から実行コードを読み出し、未解決となっている関数アドレスと関数アドレス範囲を関数コード範囲格納用メモリ７９から読み出してコードに埋め込み、実行可能コード８１を出力する。
【０１６２】
このコンパイラ装置により、従来のＣ言語ソースコードをそのまま利用して、実行アドレス値の範囲保護を実現できる。
【０１６３】
ここで、実施の形態１と同様に、実行アドレス値のアクセスの範囲は、上限値と下限値とで定義してもよいし、下限値と、この下限値から上限値までの長さとで定義してもよいし、上限値のみで定義してもよい。
【０１６４】
次に、動作を説明する。図６は、本発明の実施の形態３におけるコンパイル装置のフローチャートである。
【０１６５】
まず、ステップ４１にて、ソース解析部７３が、ソースコード７２を順に解析し、構文の示す処理内容を判別する。
【０１６６】
ステップ４１で、関数定義完了と判別された場合、ステップ４２にて、関数コード範囲解析部７４が、関数で発生した実行コードの開始アドレスとコードのアドレス範囲を、関数コード範囲格納用メモリ７９に保存する。
【０１６７】
ステップ４１で、関数呼び出しと判別された場合、ステップ４３にて、コード範囲付き分岐命令生成部７５が、範囲情報付き分岐コードを生成する。
【０１６８】
ステップ４１で、関数ポインタ生成と判別された場合、ステップ４４にて、範囲付き関数ポインタ生成部７６が、コード範囲を含んだポインタを生成する。
【０１６９】
ステップ４１で、前記以外と判別された場合、ステップ４５にて、言語対応実行コード生成部７７が、従来技術どおり言語に対応する実行コードに変換する。
【０１７０】
ステップ４６にて、ソース解析部７３が、ソースの終端に至るまで、ステップ４１から４５の処理が繰り返され、ソースの終端に至ると、ステップ４７にて、関数範囲埋め込み部８０が、実行コード用メモリ装置７８から実行コードを読み出し、未解決となっている関数アドレスと関数アドレス範囲を関数コード範囲格納用メモリ７９から読み出してコードに埋め込み、実行可能コード８１を出力する。
【０１７１】
このコンパイル装置７１により、従来のＣ言語ソースコードをそのまま利用して、保護範囲情報付き実行アドレス値をサポートし、暴走を予防できる。
【０１７２】
以上、実施の形態２、３のコンパイラ装置を、別々に説明したが、これらを組み合わせて構成することもできる。むしろ、実際の実装時には、組み合わせておく方が望ましい。そのときは、それぞれの形態の効果が、互いに干渉することなく奏される。
【０１７３】
【発明の効果】
本発明により、従来技術で実現できなかったモジュールを超えたポインタのアクセス範囲の完全な保護が可能となる。
【０１７４】
本発明は、既存プロセッサアーキテクチャの実行コードの上位互換を保ったままでメモリ保護機能を有したプロセッサを作成することができる。
【０１７５】
また、このプロセッサでメモリ保護機能を利用しながら動作可能なソースコードレベルの互換性を保ったままのコンパイラが作成することが出来る。
【０１７６】
本発明は、ＯＳなどのプロセッサの特権モードで動作するプラットフォームが存在の有無に関わらず適用可能であり、またプロセス単位で機能するＭＭＵなどと異なり単一の巨大なプロセスを構成する場合でも有効に機能する。
【０１７７】
タスク切り替えの際に切り替える内容もレジスタのみであるため、テーブルを入れ替える可能性のあるＭＭＵなどの機構を用いたものよりも短い最悪時タスク切り替え時間を保証することが可能となりリアルタイム制御プログラムにも適用可能である。
【０１７８】
ＭＭＵなど既存のメモリ保護技術との併用も可能である。
【０１７９】
発生する例外をトラップして表示するデバッガ装置と組み合わせれば、リアルタイム制御プラグラムの実時間デバッグにおけるメモリ不正アクセスの監視も可能となり、プログラム開発期間を削減できる。
【図面の簡単な説明】
【図１】本発明の実施の形態１におけるプロセッサ装置のブロック図
【図２】（ａ）本発明の実施の形態１で取り上げるソースコードの例示図
（ｂ）同範囲情報付きポインタの状態説明図
（ｃ）同範囲情報付きポインタの状態説明図
（ｄ）同範囲情報付きポインタの状態説明図
【図３】本発明の実施の形態２におけるコンパイル装置のブロック図
【図４】同コンパイル装置のフローチャート
【図５】本発明の実施の形態３におけるコンパイル装置のブロック図
【図６】同コンパイル装置のフローチャート
【符号の説明】
１　命令処理部
２　ＭＭＵ
３　アドレスレジスタ０
４　第１範囲情報レジスタ
５　プログラムカウンタ
６　第２範囲情報レジスタ
７　第１例外発生部
８　第２例外発生部
１０　プロセッサ装置
２０　バス
３０　メモリ装置
４０　Ｉ／Ｏ装置
【図１】
2004013556.tif 000003
【図２】
2004013556.tif 000004
【図３】
2004013556.tif 000005
【図４】
2004013556.tif 000006
【図５】
2004013556.tif 000007
【図６】
2004013556.tif 000008