(57)【要約】【課題】ＭＭＵやＭＰＵを搭載していないプロセッサにおいて、不正なメモリアクセスを防止することを目的とする。【解決手段】ロードしたプログラムコードに含まれるメモリアクセス命令が、アクセスを許可するメモリ領域である許可領域へのアクセス命令であるか、許可領域の外部の領域へのアクセス命令であるかを判定する検査コードを、プログラムコードにおけるメモリアクセス命令の前に挿入するとともに、ＮＯＰ命令をプログラムコードに挿入する。【選択図】図２
2011164972.tif 000002
【特許請求の範囲】
【請求項１】
メモリアクセス命令を含むプログラムコードをロードするロード部と、
前記ロード部がロードしたプログラムコードに含まれるメモリアクセス命令が、アクセスを許可するメモリ領域である許可領域へのアクセス命令であるか、前記許可領域の外部の領域へのアクセス命令であるかを判定する検査コードを、前記プログラムコードにおける前記メモリアクセス命令の前に挿入するとともに、ＮＯＰ（Ｎｏ  ＯＰｅｒａｔｉｏｎ）命令を前記プログラムコードに挿入して、挿入後プログラムコードを処理装置により生成する挿入後プログラムコード生成部と、
前記挿入後プログラムコード生成部が生成した挿入後プログラムコードを記憶装置に記憶するプログラムコード記憶部と
を備えることを特徴とするプログラムローダ。
【請求項２】
前記プログラムローダは、さらに、
禁止命令を記憶装置に記憶する禁止命令記憶部と、
前記ロード部がロードしたプログラムコードに、前記禁止命令記憶部が記憶した禁止命令が含まれる場合にはエラー情報を出力するエラー出力部と
を備えることを特徴とする請求項１に記載のプログラムローダ。
【請求項３】
前記挿入後プログラムコード生成部は、外部サブルーチンを呼び出す命令を含む検査コードをメモリアクセス命令の前に挿入して、挿入後プログラムコードを生成する
ことを特徴とする請求項１又は２に記載のプログラムローダ。
【請求項４】
請求項１から３までのいずれかに記載のプログラムローダを備えるデータ処理装置であり、
前記プログラムコード記憶部は、前記挿入後プログラムコードを記憶装置である不揮発性メモリに記憶し、
前記データ処理装置は、さらに、
前記プログラムコード記憶部が不揮発性メモリに記憶した挿入後プログラムコードを、前記不揮発性メモリからフェッチして実行するコード実行部
を備えることを特徴とするデータ処理装置。
【請求項５】
処理装置が、メモリアクセス命令を含むプログラムコードをロードするロード工程と、
処理装置が、前記ロード工程でロードしたプログラムコードに含まれるメモリアクセス命令が、アクセスを許可するメモリ領域である許可領域へのアクセス命令であるか、前記許可領域の外部の領域へのアクセス命令であるかを判定する検査コードを、前記プログラムコードにおける前記メモリアクセス命令の前に挿入するとともに、ＮＯＰ（Ｎｏ  ＯＰｅｒａｔｉｏｎ）命令を前記プログラムコードに挿入して、挿入後プログラムコードを生成する挿入後プログラムコード生成工程と、
処理装置が、前記挿入後プログラムコード生成工程で生成した挿入後プログラムコードを記憶装置に記憶するプログラムコード記憶工程と
を備えることを特徴とするプログラムロード方法。
【請求項６】
メモリアクセス命令を含むプログラムコードをロードするロード処理と、
前記ロード処理でロードしたプログラムコードに含まれるメモリアクセス命令が、アクセスを許可するメモリ領域である許可領域へのアクセス命令であるか、前記許可領域の外部の領域へのアクセス命令であるかを判定する検査コードを、前記プログラムコードにおける前記メモリアクセス命令の前に挿入するとともに、ＮＯＰ（Ｎｏ  ＯＰｅｒａｔｉｏｎ）命令を前記プログラムコードに挿入して、挿入後プログラムコードを生成する挿入後プログラムコード生成処理と、
前記挿入後プログラムコード生成処理で生成した挿入後プログラムコードを記憶するプログラムコード記憶処理と
をコンピュータに実行させることを特徴とするロードプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、不正なメモリアクセスを防止するプログラムコードのロード技術に関する。
【背景技術】
【０００２】
組み込み機器では、製品出荷後の機能追加等に対応するために、必要に応じてサーバからモジュールをダウンロードし、機器内に展開する機能を搭載することが求められる。この機能を実現するのがプログラムローダである。
ここで、プログラムローダがダウンロードしたモジュールが、許可されていないメモリアクセスを行うことで、機密情報が漏洩する危険性がある。
【０００３】
悪意のあるコードを含む可能性のあるモジュールを実行する際、通常はＭＭＵ（Ｍｅｍｏｒｙ  Ｍａｎａｇｅｍｅｎｔ  Ｕｎｉｔ）やＭＰＵ（Ｍｅｍｏｒｙ  Ｐｒｏｔｅｃｔｉｏｎ  Ｕｎｉｔ）によるアドレス変換やアクセス制御を行う。これにより、不正なメモリアクセスを防止できる。
しかし、ＭＭＵやＭＰＵを搭載するプロセッサは一般的に高価であり、ＭＭＵやＭＰＵを搭載しないプロセッサも多く存在する。ＭＭＵやＭＰＵを搭載しないプロセッサでは別の方法により不正なメモリアクセスを防止する必要がある。
【０００４】
ＭＭＵやＭＰＵを搭載していないプロセッサで不正なメモリアクセスを防止する方法の１つとして、Ｊａｖａ（登録商標）等の仮想マシンにおいてプログラムコード（以下、単にコードと呼ぶ）をインタプリタ方式で実行する方法がある。この方法では、仮想マシンにおいてコードが実行されるため、不正なメモリアクセスを検知することができる。
【０００５】
別の方法として、非特許文献１には、モジュールをダウンロードして、機器内の不揮発性の記憶領域（フラッシュメモリ、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）等）に格納する際に、不正なメモリアクセスが発生することを防止するための検査コードやアドレスマスキングコードを挿入する方法についての記載がある。
【０００６】
さらに別の方法として、特許文献１には、対象モジュールに電子署名を付与し、改竄の有無を検知した後、適当なメモリ領域（ＲＡＭ）に展開して実行する方法についての記載がある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００７−１３３８６０号公報
【非特許文献】
【０００８】
【非特許文献１】Ｒｏｂｅｒｔ  Ｗａｈｂｅ，  Ｓｔｅｖｅｎ  Ｌｕｃｃｏ，  Ｔｈｏｍａｓ  Ｅ．  Ａｎｄｅｒｓｏｎ，  Ｓｕｓａｎ  Ｌ．  Ｇｒａｈａｍ  “  Ｅｆｆｉｃｉｅｎｔ  Ｓｏｆｔｗａｒｅ−Ｂａｓｅｄ  Ｆａｕｌｔ  Ｉｓｏｌａｔｉｏｎ”，  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  Ｓｙｍｐｏｓｉｕｍ  ｏｎ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ  Ｐｒｉｎｃｉｐｌｅｓ  １９９３
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかし、仮想マシンにおいてコードをインタプリタ方式で実行する場合、コードを１行ずつ解釈しながら実行するため、大幅な速度低下を招く虞がある。例えば、鉄道等の交通系のＩＣカードマイコンでは処理速度が求められる。こののように処理速度が求められる用途では、速度低下は大きなデメリットとなる。
【００１０】
また、非特許文献１に記載された方法のように、検査コードやアドレスマスキングコードを挿入する場合、挿入されたコードを実行させずバイパスさせるようなバイパスコードを、ダウンロードするモジュールに予め挿入される虞がある。また、非特許文献１に記載された方法では、コードをＲＡＭに展開し、コードを書き換えた上で実行される虞がある。このような場合には、不正なメモリアクセスを行う命令が実行される虞がある。
【００１１】
また、特許文献１に記載された方法の場合、モジュール全体をＲＡＭに展開する必要があるため、大量のＲＡＭが必要になる。通常の組み込み機器は、高々数キロバイト程度のＲＡＭしか持たないため、モジュール全体をＲＡＭに展開することは困難である。また、署名されたプログラムが不正なメモリアクセスを行わない保証はない。
【００１２】
この発明は、ＭＭＵやＭＰＵを搭載していないプロセッサにおいて、不正なメモリアクセスを防止することを目的とする。
【課題を解決するための手段】
【００１３】
この発明に係るプログラムローダは、
メモリアクセス命令を含むプログラムコードをロードするロード部と、
前記ロード部がロードしたプログラムコードに含まれるメモリアクセス命令が、アクセスを許可するメモリ領域である許可領域へのアクセス命令であるか、前記許可領域の外部の領域へのアクセス命令であるかを判定する検査コードを、前記プログラムコードにおける前記メモリアクセス命令の前に挿入するとともに、ＮＯＰ（Ｎｏ  ＯＰｅｒａｔｉｏｎ）命令を前記プログラムコードに挿入して、挿入後プログラムコードを処理装置により生成する挿入後プログラムコード生成部と、
前記挿入後プログラムコード生成部が生成した挿入後プログラムコードを記憶装置に記憶するプログラムコード記憶部と
を備えることを特徴とする。
【発明の効果】
【００１４】
この発明に係るプログラムローダは、検査コードとともに、ＮＯＰ命令を挿入するため、バイパスコードを挿入されたコードであっても、検査コードの実行を回避することができない。そのため、バイパスコードを挿入されたコードであっても、検査コードにより、不正なメモリアクセスを防止することができる。
【図面の簡単な説明】
【００１５】
【図１】プログラムローダ２００を備えるデータ処理装置１００の構成図。
【図２】プログラムローダ２００とＯＳ３００との機能を示す機能ブロック図。
【図３】実行コードと挿入後実行コードとを示す図。
【図４】データ処理装置１００における各モジュール４０１、プログラムローダ２００、ＯＳ３００に許可する操作の一覧を示す図。
【図５】ＯＳ３００が挿入後モジュール４０４を呼び出す際の処理の流れを示す図。
【図６】実施の形態２における実行コードと挿入後実行コードとを示す図。
【発明を実施するための形態】
【００１６】
実施の形態１．
実施の形態１では、非特許文献１に記載された方法と同様に、ロードしたプログラムコードに検査コードを埋め込み、不正なメモリアクセスを防止するプログラムローダ２００について説明する。特に、実施の形態１では、非特許文献１に記載された方法の課題である検査コードを実行させることなくバイパスさせるバイパスコード挿入に対応可能なプログラムローダ２００について説明する。
また、実施の形態１では、プログラムローダ２００を備えるデータ処理装置１００について説明する。
【００１７】
図１は、プログラムローダ２００を備えるデータ処理装置１００の構成図である。
データ処理装置１００は、ハードウェアとして、ＣＰＵ１０１、不揮発性メモリ１０２、ＲＡＭ１０３を備える。なお、不揮発性メモリ１０２は、書き換え可能な記憶装置であり、例えば、フラッシュメモリ、ＨＤＤ等である。ＣＰＵ１０１は、不揮発性メモリ１０２を直接フェッチできるものとする。
また、データ処理装置１００は、ソフトウェアとして、プログラムローダ２００、ＯＳ３００を備える。ＯＳ３００は、デバイスドライバの提供や、タスク管理等を行う。プログラムローダ２００は、外部からモジュール４０１をダウンロードする。また、プログラムローダ２００は、ダウンロードしたモジュール４０１が実行された場合に不正なメモリアクセスが発生することを防止する処置をモジュール４０１に施し、挿入後モジュール４０４として不揮発性メモリ１０２に書き込む。
なお、ダウンロードしたモジュール４０１には、オブジェクト情報４０２とリソース情報４０３とが含まれる。オブジェクト情報４０２は、コード本体である実行コードと、実行コードが使用する定数情報とを含む情報である。リソース情報４０３は、実行コードを実行した場合に必要となるＲＡＭ容量、不揮発メモリ容量等、実行コードを実行した場合に必要となるリソース情報である。
【００１８】
不揮発性メモリ１０２には、モジュール用コード領域１０４、モジュール用データ領域１０５、ＯＳ・ローダ用コード領域１０６、ＯＳ・ローダ用データ領域１０７が割り当てられる。
モジュール用コード領域１０４は、モジュール４０１の実行コードを記憶するための記憶領域である。モジュール用データ領域１０５は、モジュール４０１が使用するデータを記憶するための記憶領域である。ＯＳ・ローダ用コード領域１０６は、プログラムローダ２００とＯＳ３００とのコードを記憶するための記憶領域であり、プログラムローダ２００のコードと、ＯＳ３００のコードとが記憶されている。ＯＳ・ローダ用データ領域１０７は、プログラムローダ２００とＯＳ３００とが使用するデータを記憶するための記憶領域である。
【００１９】
ＲＡＭ１０３には、モジュール用データ領域１０８、ＯＳ・ローダ用データ領域１０９、アドレス検査領域１１０が割り当てられる。
モジュール用データ領域１０８は、モジュール４０１が使用するデータを記憶するための記憶領域である。ＯＳ・ローダ用データ領域１０７は、プログラムローダ２００とＯＳ３００とが使用するデータを記憶するための記憶領域である。アドレス検査領域１１０は、不正なメモリアクセスを検出するために使用される領域である。
【００２０】
図２は、プログラムローダ２００とＯＳ３００との機能を示す機能ブロック図である。
プログラムローダ２００は、ロード部２０１、禁止命令抽出部２０２（エラー出力部）、アドレス変換部２０３、コード挿入部２０４（挿入後プログラムコード生成部）、モジュール書込部２０５（プログラムコード記憶部）を備える。
また、ＯＳ３００は、アドレス計算部３０１、不揮発性メモリ制御部３０２を備える。なお、ＯＳ３００が備えるアドレス計算部３０１、不揮発性メモリ制御部３０２は、プログラムローダ２００が備えているとしてもよい。
【００２１】
ロード部２０１は、ネットワークを介してモジュール４０１をダウンロードし、モジュール４０１に含まれるオブジェクト情報４０２とリソース情報４０３とをＣＰＵ１０１により抽出する。
ロード部２０１は、抽出したオブジェクト情報４０２を禁止命令抽出部２０２へ送信するとともに、抽出したリソース情報４０３をアドレス計算部３０１へ送信する。
【００２２】
禁止命令抽出部２０２は、オブジェクト情報４０２に含まれる実行コードから、予め決められた禁止命令をＣＰＵ１０１により抽出する。
禁止命令が抽出された場合には、禁止命令抽出部２０２はエラーを出力する。エラーを出力した場合の対処は、システムに依存するものであるが、例えば、モジュール４０１を不揮発性メモリ１０２に書き込むことなく削除する。
禁止命令が抽出されない場合には、禁止命令抽出部２０２はオブジェクト情報４０２をアドレス変換部２０３へ送信する。
【００２３】
アドレス計算部３０１は、リソース情報４０３に含まれるＲＡＭ容量、不揮発メモリ容量に基づき、モジュール用コード領域１０４とモジュール用データ領域１０５とを不揮発性メモリ１０２に割り当てるとともに、モジュール用データ領域１０８をＲＡＭ１０３に割り当てる。そして、アドレス計算部３０１は、不揮発性メモリ１０２におけるモジュール用コード領域１０４及びモジュール用データ領域１０５のアドレスと、ＲＡＭ１０３におけるモジュール用データ領域１０８のアドレスとを割り当てアドレス情報４０５として、アドレス変換部２０３、コード挿入部２０４、モジュール書込部２０５へ送信する。
また、アドレス計算部３０１は、ＯＳ・ローダ用コード領域１０６におけるＯＳ３００のシステムコールが記憶された記憶領域のアドレスと、ＯＳ・ローダ用データ領域１０９における記憶領域であって、データ処理装置１００におけるソフトウェアに共通で使用される記憶領域である共通ＲＡＭ領域のアドレスとを共通領域情報４０６として、アドレス変換部２０３、コード挿入部２０４へ送信する。
また、アドレス計算部３０１は、不揮発性メモリ制御部３０２と協調して、割り当てアドレス情報４０５に含めたアドレスを不揮発性メモリ１０２のＯＳ・ローダ用データ領域１０７へ書き込む。
【００２４】
アドレス変換部２０３は、割り当てアドレス情報４０５と共通領域情報４０６とに基づき、オブジェクト情報４０２に含まれる実行コードにおける相対アドレスを絶対アドレスへ変換して、変換後実行コードをＣＰＵ１０１により生成する。
アドレス変換部２０３は、生成した変換後実行コードと定数情報とを含む変換後オブジェクト情報４０７をコード挿入部２０４へ送信する。
【００２５】
コード挿入部２０４は、変換後オブジェクト情報４０７に含まれる変換後実行コードから、メモリアクセスを行うコード（メモリアクセス命令）を抽出する。そして、コード挿入部２０４は、抽出したメモリアクセス命令の前に、アドレス検査を行うための検査コードを挿入して、ＣＰＵ１０１により挿入後実行コードを生成する。なお、コード挿入部２０４は、検査コードを挿入する際、割り当てアドレス情報４０５、共通領域情報４０６を参照する場合もある。例えば、コード挿入部２０４は、検査コードの戻り値を格納するアドレスを指定した検査コードを挿入する場合には、割り当てアドレス情報４０５を参照する。
また、コード挿入部２０４は、検査コードとともに、ＮＯＰ（Ｎｏ  ＯＰｅｒａｔｉｏｎ）命令をランダムに挿入する。ＮＯＰ命令とは、何もしない命令である。また、ランダムに挿入するとは、ランダムな個数のＮＯＰ命令を検査コードとメモリアクセス命令との間や、検査コード中に挿入するということである。
コード挿入部２０４は、生成した挿入後実行コードと定数情報とを含む挿入後オブジェクト情報４０８をモジュール書込部２０５へ送信する。
【００２６】
モジュール書込部２０５は、不揮発性メモリ制御部３０２と協調して、挿入後オブジェクト情報４０８を不揮発性メモリ１０２のモジュール用コード領域１０４へ書き込む。
【００２７】
図３は、実行コードと挿入後実行コードとを示す図である。
なお、図３に示す実行コードと挿入後実行コードとは一例であり、実行コードから生成される挿入後実行コードは、ＣＰＵ１０１の種類等の条件によって異なる。
【００２８】
実行コードにおける相対アドレスへの分岐命令（ＪＳＲ  ＿ｌａｂｅｌ）は、挿入後実行コードでは絶対アドレスへの分岐命令（ＪＳＲ  ０ｘ＃＃＃＃＃）に、アドレス変換部２０３により変換されている。
また、挿入後実行コードには、アドレスレジスタ間接参照を行う命令（ＳＵＢ  Ｒ１，［Ａ０］）の前に、検査コードの一種であるアドレス間接参照用検査コード５０１が、コード挿入部２０４により挿入されている。なお、アドレス間接参照用検査コード５０１は、アドレスレジスタＡ０の値がアクセス可能な領域にあるか否かを検査するコードである。
同様に、挿入後実行コードには、スタックを使用する命令（ＰＵＳＨ  Ｒ１）の前に、検査コードの一種であるスタック計算用検査コード５０２が、コード挿入部２０４により挿入されている。スタック計算用検査コード５０２は、命令実行によって変化するスタックポインタの値がアクセス可能な領域にあるか否かを検査するコードである。
さらに、挿入後実行コードには、ＮＯＰ（Ｎｏ  ＯＰｅｒａｔｉｏｎ）命令が、コード挿入部２０４によりランダムに挿入されている。
【００２９】
図４は、データ処理装置１００における各モジュール４０１、プログラムローダ２００、ＯＳ３００に許可する操作の一覧を示す図である。
なお、図４において、“Ｒ”は読み込み可、“Ｗ”は書き込み可、“Ｘ”は実行可、“−”はアクセス不可を示す。また、“＊”はシステムコールについてのみであることを示し、“＄”はオブジェクト間のデータ共有のための領域のみであることを示す。
【００３０】
各モジュール４０１は、自身に割り当てられたモジュール用コード領域１０４に対する実行、自身に割り当てられたモジュール用データ領域１０５に対する読み込み、自身に割り当てられたモジュール用データ領域１０８に対する読み込み／書き込みが許可されている。また、各モジュール４０１は、ＯＳ・ローダ用データ領域１０７におけるシステムコールが記憶された領域に対する実行、ＯＳ・ローダ用データ領域１０９におけるオブジェクト間のデータ共有のための領域に対する読み込み／書き込みが許可されている。
各モジュール４０１は、上記以外については許可されていない。つまり、ＲＡＭ１０３のいずれの領域に対しても実行は許可されていない。また、不揮発性メモリ１０２のいずれの領域に対しても書き込みは許可されていない。そのため、各モジュール４０１が自身に割り当てられたモジュール用データ領域１０５に書き込みを行う必要がある場合は、ＯＳ３００のシステムコールを使用して書き込みを行うことになる。
【００３１】
図５は、ＯＳ３００が挿入後モジュール４０４を呼び出す際の処理の流れを示す図である。
まず、（Ｓ１）で、ＯＳ３００は、挿入後モジュール４０４に割り当てられた記憶領域のアドレスをＯＳ・ローダ用データ領域１０７から呼び出し、アドレス検査領域１１０に書き込む。なお、挿入後モジュール４０４に割り当てられた記憶領域とは、その挿入後モジュール４０４に割り当てられたモジュール用コード領域１０４、モジュール用データ領域１０５、モジュール用データ領域１０８である。また、ＯＳ３００は、ＯＳ３００のシステムコールが記憶された記憶領域のアドレスと、オブジェクト間データ共有のための記憶領域のアドレスとをアドレス検査領域１１０に書き込む。ここでアドレス検査領域１１０に書き込まれたアドレスが示す記憶領域を許可領域と呼ぶ。
そして、（Ｓ２）で、ＯＳ３００は、挿入後モジュール４０４をコールする。ＯＳ３００からコールされると、挿入後モジュール４０４は起動され、挿入後モジュール４０４に含まれる挿入後実行プログラムが実行される。
【００３２】
（Ｓ２）で挿入後モジュール４０４がコールされると、その挿入後モジュール４０４における挿入後実行コードは、ＣＰＵ１０１に不揮発性メモリ１０２から直接フェッチされて実行される。直接フェッチされるとは、ＲＡＭ１０３等に展開されることなく、不揮発性メモリ１０２からフェッチされるということを意味する。挿入後モジュール４０４には、ＲＡＭ１０３に対して実行が許可されていないため、ＲＡＭ１０３にコードを展開したとしても、実行することができない。そのため、挿入後モジュール４０４は、不揮発性メモリ１０２から直接フェッチされ、実行されることになる。
また、挿入後実行コードには、上述したようにメモリアクセス命令の前に、検査コードが挿入されている。検査コードが実行されると、アクセスしようとしているアドレスが、（Ｓ１）でアドレス検査領域１１０に書き込まれたアドレスから検索される。そして、アクセスしようとしているアドレスが検索にヒットした場合、そのアドレスに対して実行しようとしている操作が、許可されているか否かが判定される。操作が許可されている場合、処理は継続して実行される。一方、アクセスしようとしているアドレスが検索にヒットしない場合、及び、操作が許可されていない場合、エラーが出力され、その操作は実行されない。つまり、不正なメモリアクセスは実行されない。
【００３３】
以上のように、プログラムローダ２００は、ダウンロードしたモジュール４０１を不揮発性メモリ１０２に書き込む際に、検査コードを挿入した挿入後モジュール４０４を生成する。そして、データ処理装置１００が挿入後モジュール４０４を実行する際に、検査コードにより、不正なメモリアドレスが実行されることを防止する。これにより、データ処理装置１００は、ネイティブコードの実行を安全に行うことができる。
特に、プログラムローダ２００は、検査コードを挿入する際、ランダムにＮＯＰ命令を挿入する。これにより、ダウンロードしたモジュール４０１に含まれる実行コードに、検査コードの挿入を見越したバイパスコードが挿入されている場合にも、検査コードのスキップを防止できる。
【００３４】
また、データ処理装置１００は、挿入後モジュール４０４にＲＡＭ１０３に対して実行権を与えていない。そのため、挿入後モジュール４０４がＲＡＭ１０３にコードを展開して実行することができず、ＲＡＭ１０３に書き換えたコードを展開して不正なアクセスを行うことができない。
【００３５】
なお、データ処理装置１００における不正なメモリアクセスを防止してコードを実行する方法は、仮想マシンにおいてインタプリタ方式でコードを実行する方法に比べ、高速にコードを実行することができる。
【００３６】
実施の形態２．
実施の形態１では、検査コード全てを実行コードに組み込んだが、実施の形態２では、検査コードの共通部をＯＳ３００に実装する。
【００３７】
図６は、実施の形態２における実行コードと挿入後実行コードとを示す図である。
なお、図６に示す実行コードと挿入後実行コードとは一例であり、実行コードから生成される挿入後実行コードは、ＣＰＵ１０１の種類等の条件によって異なる。
【００３８】
挿入後実行コードでは、アドレスレジスタ間接参照を行う命令（ＳＵＢ  Ｒ１，［Ａ０］）の前に、検査コードの一種であるアドレス間接参照用検査コード６０１が、コード挿入部２０４により挿入されている。アドレス間接参照用検査コード６０１は、ＯＳ３００の＿ｖｅｒｉｆｙＡ０の示すアドレスへのサブルーチンコールを含むコードである。
同様に、挿入後実行コードには、スタックを使用する命令（ＰＵＳＨ  Ｒ１）の前に、スタック計算用検査コード６０２が、コード挿入部２０４により挿入されている。スタック計算用検査コード６０２は、ＯＳ３００の＿ｖｅｒｉｆｙＰＵＳＨの示すアドレスへのサブルーチンコールを含むコードである。
【００３９】
実施の形態２に係るプログラムローダ２００では、検査コードの共通部分をＯＳ３００に実装した。これにより、挿入後モジュール４０４のコードサイズを小さくすることができる。
なお、ここでは、検査コードの共通部をＯＳ３００に実装したが、検査コードの共通部を他のプログラムに実装してもよい。
【００４０】
また、上記説明におけるＯＳ３００の処理は、ＯＳ３００が存在しない場合等は、所定のプログラム（初期化ルーチンやメインルーチン等）により実行されてもよい。
【００４１】
以上をまとめると、次のようになる。
プログラムローダ２００は、プログラムを不揮発性メモリ１０２に展開しておき、不揮発性メモリ１０２からプログラムを直接フェッチするデータ処理装置１００で動作するプログラムローダ２００であって、ロード対象のモジュール４０１を不揮発性メモリ１０２に展開するにあたって、当該モジュール４０１が不正なメモリアクセスを行わないよう、メモリアクセスを行う命令の前に、前記命令がアクセスするメモリアドレスを検査するコードを挿入することを特徴とする。
【００４２】
また、プログラムローダ２００は、メモリアドレスを検査するコードを挿入する際に、ランダムにＮＯＰ命令を挿入することを特徴とする。
【００４３】
また、プログラムローダ２００は、予め禁止命令と定めた命令を前記ロード対象のモジュール４０１が含む際に、エラーを出力することを特徴とする。
【００４４】
また、プログラムローダ２００は、検査コードの一部を、前記挿入されるコードとは別のプログラム領域に実装し、モジュールに挿入するコードには前記別のプログラム領域に実装した検査コードの一部へのサブルーチンコールを含むことを特徴とする。
【００４５】
プログラムローダ２００を含むソフトウェアであって、不揮発性メモリ１０２に展開した挿入後モジュール４０４を実行する際に、当該挿入後モジュール４０４がアクセス可能なメモリ領域を示す情報をＲＡＭ１０３領域に展開し、前記検査コードは前記展開したＲＡＭ１０３領域を参照することでアドレスの検査を行うことを特徴とする。
【００４６】
プログラムを不揮発性メモリ１０２に展開しておき、不揮発性メモリ１０２からプログラムを直接フェッチするデータ処理装置１００であって、上記ソフトウェアを搭載することを特徴とする。
【符号の説明】
【００４７】
１００  データ処理装置、１０１  ＣＰＵ、１０２  不揮発性メモリ、１０３  ＲＡＭ、１０４  モジュール用コード領域、１０５  モジュール用データ領域、１０６  ＯＳ・ローダ用コード領域、１０７  ＯＳ・ローダ用データ領域、１０８  モジュール用データ領域、１０９  ＯＳ・ローダ用データ領域、１１０  アドレス検査領域、２００  プログラムローダ、２０１  ロード部、２０２  禁止命令抽出部、２０３  アドレス変換部、２０４  コード挿入部、２０５  モジュール書込部、３００  ＯＳ、３０１  アドレス計算部、３０２  不揮発性メモリ制御部、４０１  モジュール、４０２  オブジェクト情報、４０３  リソース情報、４０４  挿入後モジュール、４０５  割り当てアドレス情報、４０６  共通領域情報、４０７  変換後オブジェクト情報、４０８  挿入後オブジェクト情報、５０１，６０１  アドレス間接参照用検査コード、５０２，６０２  スタック計算用検査コード。
【図１】
2011164972.tif 000003
【図２】
2011164972.tif 000004
【図３】
2011164972.tif 000005
【図４】
2011164972.tif 000006
【図５】
2011164972.tif 000007
【図６】
2011164972.tif 000008