(57)【要約】  実行開始時に、モジュール（＃１）および（＃２）間で共有するセキュア共有領域がメモリ上に確保されると共に、鍵交換が行われる。セキュア共有領域を利用したモジュール（＃１）および（＃２）間でのデータのやりとりを、この鍵を用いた暗号化／復号処理を介して行うことで、モジュール（＃１）および（＃２）外からのセキュア共有領域に対するアクセスが不能となる。モジュール（＃１）がモジュール（＃２）を呼び出すと、動作の切替直前に、切替前処理部により呼び出し先のモジュールを示す識別子がセキュア共有領域に書き込まれる。呼び出されたモジュール（＃２）において、切替後処理部は、セキュア共有領域から読み出した識別子と自身のモジュールの識別子とを比較し、両者が一致したらプログラムの実行を開始する。識別子が一致しない場合には、モジュール（＃２）をスリープ状態とする。
2011101972.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに実行させるための複数のモジュールを含むプログラムであって、
前記コンピュータは、
連係して動作するモジュールのみがアクセス可能な領域であって、該連係して動作するモジュールのうち、ＯＳ上で動作するモジュールの識別子を示す実行モジュール識別子を格納する共有領域を含むメモリを備え、
前記モジュールのそれぞれは、
連携する他のモジュールへの動作の切替を行う直前に、前記他のモジュールの識別子を前記実行モジュール識別子として前記共有領域に格納する第１処理ステップと、
前記他のモジュールからの動作の切替が行われた直後に、前記共有領域に格納されている前記実行モジュール識別子と自モジュールの識別子とが一致した場合に、該自モジュール内の機能を実行させる第２処理ステップと
を有する
ことを特徴とするプログラム。
【請求項２】
前記第１処理ステップは、
少なくとも、前記切替の要因を示す切替フラグと、該切替に必要な情報を含む切替パラメータとを前記共有領域にさらに格納し、
前記第２処理ステップは、
前記共有領域に格納される前記切替フラグと前記切替パラメータとに従い前記自モジュール内の機能を実行させる
ことを特徴とする請求項１に記載のプログラム。
【請求項３】
前記第１処理ステップは、
前記切替の要因が呼び出しである場合に、該呼び出しを示す前記切替フラグと、該呼び出しにより前記切替が行われる前記他のモジュール内の呼び出し位置を示す呼び出し情報を少なくとも含む前記切替パラメータとを該共有領域に格納し、
前記第２処理ステップは、
前記切替フラグが前記呼び出しを示す場合に、前記切替パラメータに含まれる前記呼び出し情報に従い前記自モジュール内で呼び出しを行う
ことを特徴とする請求項２に記載のプログラム。
【請求項４】
前記第１処理ステップは、
前記切替の要因が呼び出しからの復帰である場合に、該復帰を示す前記切替フラグと、該呼び出しにより前記切替が行われた前記自モジュールの実行結果を示す呼び出し復帰情報を少なくとも含む前記切替パラメータとを前記共有領域に格納し、
前記第２処理ステップは、
前記切替フラグが前記復帰を示す場合に、前記切替パラメータに含まれる前記呼び出し復帰情報を用いて前記自モジュールが前記呼び出しを行われた位置に戻って実行を再開させる
ことを特徴とする請求項３に記載のプログラム。
【請求項５】
連携する他のモジュールへの動作の切り替えを行う直前に、前記切替の要因が前記呼び出しまたは前記復帰以外の場合に、該呼び出しまたは復帰以外を示す前記切替フラグと、該切替の要因の内容を示す切替要因情報を少なくとも含む前記切替パラメータとを前記共有領域に格納する第３処理ステップと、
前記他のモジュールからの動作の切り替えが行われた直後に、前記切替フラグが前記呼び出しまたは復帰以外を示す場合に、前記切替パラメータに含まれる前記切替要因情報が示す前記要因に対応する処理を実行する第４処理ステップと
をさらに有する
ことを特徴とする請求項４に記載のプログラム。
【請求項６】
前記第３処理ステップは、
前記切替の要因が言語例外である場合に、該言語例外を示す前記切替フラグと、該言語例外を通知するために必要な言語例外情報を少なくとも含む前記切替パラメータとを前記共有領域に格納し、
前記第４処理ステップは、
前記切替フラグが前記言語例外を示す場合に、前記切替パラメータに含まれる前記言語例外情報を用いて前記自モジュールに対して言語例外を発生させる
ことを特徴とする請求項５に記載のプログラム。
【請求項７】
前記識別子と、コンテキスト毎にユニークなコンテキスト番号と、該コンテキストを示すコンテキスト情報とを１対１に対応付けて管理する管理テーブルから、前記他のモジュールにより指定される該コンテキスト番号に対応する該コンテキスト情報を取得し、取得した該コンテキスト情報で前記自モジュールの現在のコンテキストを置き換える設定ステップをさらに有し、
前記第３処理ステップは、
前記切替の要因がコンテキスト設定である場合に、前記切替が行われる直前に、前記管理テーブルから、前記識別子と前記コンテキスト番号とに対応する前記コンテキスト情報を削除すると共に、コンテキスト設定を示す前記切替フラグと、前記設定ステップにより設定されるコンテキストを示すコンテキスト設定情報を少なくとも含む前記切替パラメータとを前記共有領域に格納し、
前記第４処理ステップは、
前記切替が行われた直後に、前記切替フラグが前記呼び出しを示し、且つ、前記切替パラメータが前記コンテキスト設定情報を含む場合に、前記他のモジュールを示す前記識別子と、該他のモジュールにより指定される前記コンテキスト番号と、前記第１処理ステップに戻るためのコンテキスト情報とを前記管理テーブルに登録し、
前記切替フラグがコンテキスト設定を示す場合には、前記切替パラメータに含まれる前記コンテキスト設定情報を用いて設定ステップに制御を移す
ことを特徴とする請求項６に記載のプログラム。
【請求項８】
登録部が、前記識別子と、コンテキスト毎にユニークなコンテキスト番号と、該コンテキストを示すコンテキスト情報とを１対１に対応付けて管理する管理テーブルに対してコンテキスト情報を登録し、該コンテキスト情報に対応する該コンテキスト番号を返す登録ステップと、
前記自モジュールから指定される前記識別子と、該自モジュールの前記識別子とが一致する場合には、該自モジュールにより指定される前記コンテキスト番号に対応する前記コンテキスト情報を前記管理テーブルから取得し、取得した該コンテキスト情報で該自モジュールのコンテキストを置き換え、
前記自モジュールから指定される前記識別子と、該自モジュールの前記識別子とが一致しない場合には、該自モジュールのコンテキストを前記第１処理ステップの実行直前の時点のコンテキストに置き換える設定ステップと
をさらに備え、
前記第３処理ステップは、
前記切替の要因がコンテキスト設定である場合に、前記切替が行われる直前に、コンテキスト設定を示す前記切替フラグと、前記設定ステップにより設定されるコンテキストを示すコンテキスト設定情報を少なくとも含む前記切替パラメータとを前記共有領域に格納し、
前記第４処理ステップは、
前記切替フラグが前記コンテキスト設定を示す場合に、前記切替が行われた直後に、前記切替パラメータに格納された前記コンテキスト設定情報を用いて前記設定ステップに制御を移す
ことを特徴とする請求項６記載のプログラム。
【請求項９】
前記共有領域は、切替元のモジュールを示す切替元識別子がさらに格納され、
前記第１処理ステップは、
前記切替の要因が呼び出しである場合に、前記切替が行われる直前に、前記自モジュールを示す前記識別子を前記切替元識別子として前記共有領域に格納し、
前記切替の要因が呼び出しからの復帰である場合に、前記切替による情報を保持する切替履歴領域から前記切替元のモジュールを示す前記識別子を取得して前記切替元識別子として前記共有領域に格納し、
前記第２処理ステップは、
前記切替フラグが前記呼び出しを示す値である場合に、前記切替が行われた直後に、前記共有領域から前記切替元識別子を取得して前記切替履歴領域に格納する
ことを特徴とする請求項２に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のモジュールが連携動作する際の実行順序の変更を防止する技術に関する。
【背景技術】
【０００２】
オープンシステムでは、コンピュータのハードウェアやオペレーティングシステム（ＯＳ）のソースコードが開示されているので、ユーザがオペレーティングプログラムを改変して所望のプログラムを得ることができる。そのため、オープンシステムでは、ＯＳのプログラムを改変してアプリケーションプログラムを攻撃することが想定される。ＯＳに対してアプリケーションプログラムへの攻撃を防ぐための処理を施すだけでは、このような第三者による攻撃を防ぐことが困難である。【０００３】
一方、ハードウェアは、ユーザによる改変が困難である。ＯＳなどの改変によるプログラムへの攻撃を防ぐように構成したセキュアプロセッサが既に提案されている（特許文献１、非特許文献１）。このようなセキュアプロセッサは、マルチタスク環境でプログラムと当該プログラムで利用される情報とを暗号化することで、プログラムおよび情報の第三者への漏洩やプログラムの改変を防止し、プログラムから生成されたプロセス単体が正しい順序で実行可能となる。【０００４】
また、複数モジュールが連携して動作するように構成されたアプリケーションが多く存在する。セキュアプロセッサでは、各モジュールは別のモジュールを一部分しか信用しない状況が考えられる。例えば、各モジュールは別々の鍵で暗号化保護され、別々のコンテキストで動作し、各コンテキストはＯＳや他のモジュールから隔離される。モジュール間で交換したデータは、潜在的に敵対的なＯＳや連携しないモジュールに渡さない。このモデルでは、他のモジュールからコンテキストを隔離してモジュール内のプライベートデータを保護する一方で、モジュール間で連係動作するためのデータのやりとりには共有領域を利用する。【０００５】
このようなモジュール構成によるアプリケーション形態の一つとして、共有ライブラリを用いる方法が挙げられる。マルチプロセスで実現する場合、各プロセスは互いに独立して動作することから、各プロセス間において動作の同期を取るための記述が必要となる。一方、共有ライブラリは、単体のアプリケーションを作成する場合と同じように、通常の呼び出し規約に従って記述するだけでよい。また、動作も逐次的になるため、簡単に記述できるといった利点がある。【０００６】
セキュアプロセッサで共有ライブラリを用いる場合、連携しようとするモジュールが適切かどうかを検証する必要がある。特許文献２では、共有ライブラリを呼び出すプログラムが共有ライブラリの初期化時に認証鍵交換を行って共有ライブラリの正当性を検証している。そして、共有ライブラリを呼び出す際に、共有ライブラリ内の特定のエントリポイントを必ず実行する。また、特許文献３では、呼び出し元となるモジュールと、呼び出し先となるモジュールがそれぞれ正当であるか否かを、そのモジュールを復号するための鍵によって検証するようにしている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特許第４２２６８１６号公報
【特許文献２】特許第４１１５７５９号公報
【特許文献３】特開２００５−１９６２５７号公報
【非特許文献】
【０００８】
【非特許文献１】リー他著  “コピー及び耐タンパソフトウェアに対するアーキテクチャ支援”、コンピュータアーキテクチャーニュース、２８（５）、ｐ．１６８
【発明の概要】
【発明が解決しようとする課題】
【０００９】
ところで、各モジュールが別々にコンテキストを持ち、実行制御はＯＳが管理することから、モジュールは、ＯＳの実行制御により動作が開始可能となる。このとき、他のモジュールからの呼び出し待ち状態のモジュールでも、当該モジュールは動作を開始してしまう。このように、呼び出し待ち状態のモジュールであっても、ＯＳの実行制御によって動作開始する。【００１０】
上述した特許文献２および３は、呼び出し先のモジュールの正当性は検証できるが、呼び出されたモジュールが動作すべきタイミングであるか否かを判断することができない。したがって、複数モジュールが連携しながら動作する場合に、その実行順序を変更することが可能となり、共有ライブラリのような決められた順番で逐次的に動作することを保証できないという問題点があった。【００１１】
本発明は、上記に鑑みてなされたものであって、第三者による実行順序の変更を、より確実に防止するプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
上述した課題を解決し、目的を達成するために、本発明は、コンピュータに実行させるための複数のモジュールを含むプログラムであって、コンピュータは、連係して動作するモジュールのみがアクセス可能な領域であって、連係して動作するモジュールのうち、ＯＳ上で動作するモジュールの識別子を示す実行モジュール識別子を格納する共有領域を含むメモリを備え、モジュールのそれぞれは、連携する他のモジュールへの動作の切替を行う直前に、他のモジュールの識別子を実行モジュール識別子として共有領域に格納する第１処理ステップと、他のモジュールからの動作の切替が行われた直後に、共有領域に格納されている実行モジュール識別子と自モジュールの識別子とが一致した場合に、自モジュール内の機能を実行させる第２処理ステップとを有することを特徴とする。
【発明の効果】
【００１３】
本発明によれば、第三者による実行順序の変更を、効率的にかつ確実に防止することができる効果がある。
【図面の簡単な説明】
【００１４】
【図１】第１の実施形態に適用可能なシステムの構成の図。
【図２】鍵テーブルの一例のデータ構成の図。
【図３】複数のモジュールがセキュアプロセッサ上で動作する図。
【図４】第１の実施形態によるモジュール構成の機能ブロック図。
【図５】セキュア共有領域が構築されたメモリのメモリマップの図。
【図６】モジュール間で切り替えを行う処理の全体の流れの図。
【図７】アプリケーションモジュールが行う初期化処理の図。
【図８】ライブラリモジュールが行う初期化処理の図。
【図９】切り替え前処理を示すフローチャート。
【図１０】切り替え後処理を示すフローチャート。
【図１１】セキュア共有領域および切替履歴領域の状態の変化の図。
【図１２】複数モジュールが連携する正規の実行順序の例の図。
【図１３】実行順序攻撃の第１の例の図。
【図１４】実行順序攻撃の第２の例の図。
【図１５】実行順序攻撃の第３の例の図。
【図１６】実行順序攻撃の第１の例に第１の実施形態を適用させた例の図。
【図１７】実行順序攻撃の第２の例に第１の実施形態を適用させた例の図。
【図１８】実行順序攻撃の第３の例に第１の実施形態を適用させた例の図。
【図１９】発明の第２の実施形態に適用可能なシステムの構成の図。
【図２０】モジュール切替管理テーブルのデータ構成の図。
【図２１】第２の実施形態によるモジュール構成の機能ブロック図。
【図２２】モジュール切替管理部の処理を示すフローチャート。
【図２３】アプリケーションモジュールが行う初期化処理を示すフローチャート。
【図２４】ライブラリモジュールが行う初期化処理を示すフローチャート。
【図２５】切り替え前処理を示すフローチャート。
【図２６】切り替え後処理を示す一例のフローチャート。
【図２７】セキュア共有領域および切替履歴領域の状態の変化の図。
【図２８】仮想マシンモニタを用いた構成の例の図。
【図２９】言語例外処理機構による動作の図。
【図３０】発明の第３の実施形態に適用可能なシステムの構成の図。
【図３１】第３の実施形態によるモジュール構成の機能ブロック図。
【図３２】第３の実施形態による言語例外に対する処理の図。
【図３３】第３の実施形態による例外通知処理を示すフローチャート。
【図３４】第３の実施形態による例外受付処理を示すフローチャート。
【図３５】セキュア共有領域および切替履歴領域の状態の変化の図。
【図３６】関数ｓｅｔｊｍｐ／ｌｏｎｇｊｍｐによる一例の動作の図。
【図３７】第４の実施形態によるモジュール構成の機能ブロック図。
【図３８】コンテキスト管理テーブルのデータ構成の図。
【図３９】セキュア共有領域および切替履歴領域の状態の変化の図。
【図４０】第４の実施形態によるコンテキスト登録処理を示すフローチャート。
【図４１】切り替え後処理を示す一例のフローチャート。
【図４２】コンテキスト設定処理を示すフローチャート。
【図４３】コンテキスト変更通知処理を示すフローチャート。
【図４４】コンテキスト変更受付処理を示すフローチャート。
【図４５】第５の実施形態によるモジュール構成の機能ブロック図。
【図４６】コンテキスト管理テーブルの一例のデータ構成の図。
【図４７】セキュア共有領域および切替履歴領域の状態の変化の図。
【図４８】コンテキスト設定処理を示すフローチャート。
【発明を実施するための形態】
【００１５】
＜第１の実施形態＞
以下、図面を参照しながら本発明の第１の実施形態について説明する。先ず、本発明の第１の実施形態を適用可能な一例のシステムについて説明する。図１は、本発明の第１の実施形態に適用可能なシステムの一例の構成を模式的に示す。図１では、概略的なハードウェア構成と、システムビューとを同時に表している。
【００１６】
ターゲットシステムは、ハードウェア的には、セキュアプロセッサ２００と、メモリ２８０とを備えており、各部はバス２８１で接続されている。セキュアプロセッサ２００は、コア２１０と暗号復号管理部２２０とを備える。コア２１０は、このセキュアプロセッサ２００の中核をなし各種プログラムの実行を司る部分であって、現タスク識別子レジスタ２１２を備える。現タスク識別子レジスタ２１２は、コア２１０で現在実行しているモジュールのタスク識別子（現タスク識別子と呼ぶ）を格納する。また、暗号復号管理部２２０は、鍵テーブル２２２、セレクタ２２４および暗号／復号器２２６を備える、暗号復号管理部２２０は、セキュアプロセッサ２００外へのアクセスに同期して動作する。セレクタ２２４は、コア２１０の制御により、鍵テーブル２２２に格納される各値の、暗号・復号器２２６に対する供給を制御する。
【００１７】
ターゲットシステムにおいて、セキュアプロセッサ２００のコア２１０上で単一のＯＳ（オペレーティングシステム）１８０が動作し、ＯＳ１８０上で１または複数のモジュールが動作する。図１の例では、複数のモジュール（＃１）１１０、モジュール（＃２）１２０、モジュール（＃３）１３０およびモジュール（＃４）１４０が動作している。ＯＳ１８０上で動作する各モジュールは、そのモジュールの由来となるプログラムがある。また、各モジュールは、セキュアプロセッサ２００内のコア２１０において各モジュールを一意に識別するための値である、タスク識別子を持つ。
【００１８】
図１の例では、モジュール（＃１）１１０は、タスク識別子が「＃１」であって、プログラムＡ（Ｐｒｇ  Ａ）から生成されていることが示されている。モジュール（＃２）１２０は、タスク識別子が「＃２」であって、プログラムＢ（Ｐｒｇ  Ｂ）から生成されている。モジュール(＃３)１３０は、タスク識別子が「＃３」であって、プログラムＣ（Ｐｒｇ  Ｃ）から生成されている。また、モジュール（＃４）１４０は、タスク識別子が「＃４」であって、プログラムＢから生成されている。モジュール（＃２）１２０とモジュール（＃４）１４０のように、１つのプログラムから複数のモジュールを生成することができ、由来を同一とする複数のモジュールが異なるタスク識別子を持つことがある。
【００１９】
図２は、鍵テーブル２２２の一例のデータ構成を示す。鍵テーブル２２２は、タスク識別子をインデクスとして、インデクス（ＩＤ）が「＃１」から「＃ｎ」までのｎ個のエントリを有する。各エントリは、鍵値フィールド、先頭アドレスフィールドおよび末尾アドレスフィールドを有する。鍵値フィールドは、暗号／復号器２２６で暗号化や復号を行う際に用いる鍵を格納する。先頭アドレスフィールドおよび末尾アドレスフィールドは、鍵値フィールドに格納される鍵で暗号化や復号を行う対象となるデータの、メモリ２８０上での先頭アドレスおよび末尾アドレスをそれぞれ格納する。
【００２０】
各モジュール（＃１）１１０〜モジュール（＃４）１４０のこの鍵テーブル２２２へのアクセスは、アクセスを行うモジュールのタスク識別子に対応するエントリに限定して行われ、他のタスク識別子に対応するエントリにはアクセスできないように制御される。例えば、モジュール（＃１）１１０は、鍵テーブルのＩＤ「＃１」にのみアクセス可能であって、それ以外のＩＤ「＃２」〜「＃ｎ」にはアクセスできないように制御される。
【００２１】
あるモジュール（＃ｍ）がコア２１０上で実行されているときに、鍵テーブル２２２に対して先頭アドレスＰ、末尾アドレスＱおよび鍵値Ｋの書き込みを行う場合について考える。この場合、セキュアプロセッサ２００は、コア２１０にある現タスク識別子レジスタ２１２を参照してコア２１０上で実行されているモジュール（＃ｍ）のタスク識別子を特定する。そして、特定されたタスク識別子に対応する鍵テーブル２２２内のエントリ＃ｍに対して、鍵値Ｋと先頭アドレスＰおよび末尾アドレスＱを書く。
【００２２】
次に、そのモジュール（＃ｍ）が、メモリ２８０上のデータにアクセスする方法について説明する。以下では、鍵テーブル２２２のエントリのうちＩＤ「＃ｍ」に対して、既に先頭アドレスＰ、末尾アドレスＱ、鍵Ｋが登録されており、モジュール（＃ｍ）がメモリ２８０上のアドレスＸにあるデータへアクセスする場合を例に説明する。
【００２３】
モジュール（＃ｍ）がメモリ２８０のアドレスＸからデータを読み出すときには、セキュリティプロセッサ２００は、メモリ２８０からアドレスＸに対応するデータＤ1を取得する。次に、暗号復号管理部２２０は、現タスク識別子レジスタ２１２から取り出したタスク識別子（＃ｍ）に対応する鍵値などを鍵テーブル２２２から取得する。暗号復号管理部２２０は、読み出し先のアドレスＸが鍵テーブル２２２に書かれた先頭アドレスＰと末尾アドレスＱの間であれば、暗号／復号器２２６でデータＤ1を復号した値をコア２１０に返す。一方、読み出し先のアドレスＸが鍵テーブル２２２に書かれた先頭アドレスＰと末尾アドレスＱの間でなければ、データＤ1をコア２１０に返す。
【００２４】
同様に、モジュール（＃ｍ）がメモリ２８０にデータＤ2を書くとき、セキュアプロセッサ２００は、書き出し先アドレスＹがアドレスＰからアドレスＱの間であれば、データＤ2を鍵値Ｋで暗号化したデータをメモリ２８０上に書く。一方、書き出し先アドレスＹがアドレスＰからアドレスＱの間でなければ、データＤ2をメモリ２８０上に書く。
【００２５】
ここで、セキュアプロセッサ２００上で複数のモジュールが連係動作する場合のモジュール構成について、概略的に説明する。セキュアプロセッサ２００上で動作する複数のモジュールは、それぞれ他のモジュールを一部分しか信用しないように構成される。各モジュールは、別々の鍵で暗号化されて保護されて、別々のコンテキストで動作する。各モジュールのコンテキストは、ＯＳや他のモジュールから隔離されると共に、モジュール間で交換したデータは、潜在的に敵対的なＯＳや連携しないモジュールに渡さない。
【００２６】
図３は、セキュアプロセッサ２００上で複数のモジュールが動作する場合の、一例のモジュール構成を概念的に示す。図３の例では、モジュール（＃１）１１０およびモジュール（＃２）１２０は、それぞれ別々のスタック（＃１）１１９およびスタック（＃２）１２９などのコンテキストを保持し、それらのコンテキストは、他のモジュールから直接的に見ることができないようにされる。
【００２７】
モジュール（＃１）１１０とモジュール（＃２）１２０との間でデータをやり取りするために、共有領域１９０が設けられる。すなわち、セキュアプロセッサ２００上で複数のモジュールが動作する場合には、他のモジュールからコンテキストを隔離してモジュール内のプライベートデータを保護すると共に、モジュール間で連係動作するためのデータのやり取りには共有領域１９０を利用する。
【００２８】
図４は、本発明の第１の実施形態によるモジュール構成の一例の機能ブロック図を示す。図４の構成に対し、図１を用いて説明したキュアプロセッサ２００が共通して適用される。なお、図４では、セキュアプロセッサ２００は省略されている。
【００２９】
図４において、モジュール（＃１）１１０およびモジュール（＃２）１２０は、それぞれ本第１の実施形態によるモジュール切り替え機構を備える。ここでは、モジュール（＃１）１１０がアプリケーションモジュールであり、モジュール（＃２）１２０がライブラリモジュールであるものとする。モジュール（＃１）１１０およびモジュール（＃２）１２０は、協働して動作する。なお、アプリケーションモジュールは、初期化処理後にプログラム本体を実行するモジュールを指し、ライブラリモジュールは、初期化処理後に他のモジュールからの呼び出しを待つモジュールを指す。
【００３０】
モジュール（＃１）１１０は、初期化処理部１１１、プログラム（＃１）本体１１２、切替前処理部１０４Ａ、切替後処理部１０６Ａおよび切替履歴領域１１８を備える。同様に、モジュール（＃２）１２０は、初期化処理部１２１、プログラム（＃２）本体１２２および切替履歴領域１２８を備えると共に、それぞれモジュール（＃１）１１０の切替前処理部１０４Ａおよび切替後処理部１０６Ａと共通の処理を行う切替前処理部１０４Ｂおよび切替後処理部１０６Ｂを備える。また、連携するモジュール（＃１）１１０およびモジュール（＃２）１２０間では、メモリ２８０上にセキュア共有領域１８１を共有する。セキュア共有領域１８１は、モジュール（＃１）１１０とモジュール（＃２）１２０とで共有する共有領域１９０の一部である。
【００３１】
初期化処理部１１１および１２１は、切替前処理部１０４Ａおよび１０４Ｂ、ならびに、切替後処理部１０６Ａおよび１０６Ｂで利用するセキュア共有領域１８１を構築するための処理を行う。切替前処理部１０４Ａおよび１０４Ｂは、モジュールが他のモジュールへ切り替える直前の処理を行う。
【００３２】
切替後処理部１０６Ａおよび１０６Ｂは、モジュールが他のモジュールから切り替えられた直後の処理を行う。切替履歴領域１１８は、切替前処理１０４Ａおよび切替後処理１０６Ａが切替による復帰に必要とする情報を格納するための領域である。同様に、切替履歴領域１２８は、切替前処理１０４Ｂおよび切替後処理１０６Ｂが切替による復帰に必要とする情報を格納するための領域である。
【００３３】
セキュア共有領域１８１は、連携するモジュール（＃１）１１０およびモジュール（＃２）１２０の間でのみ共有すべき情報を格納するための領域である。セキュア共有領域１８１は、連携するモジュール以外からの正常な読み書きができないように構成される。
【００３４】
図５は、本第１の実施形態によるモジュール切り替え機構において利用する、セキュア共有領域１８１が構築されたメモリ２８０の一例のメモリマップを示す。セキュア共有領域１８１は、連携するモジュール毎にメモリ２８０上に構築され共有される。
【００３５】
図５の例では、連携するモジュール（＃１）１１０およびモジュール（＃２）１２０がセキュア共有領域１８１−１（Ｓｈ＿ｍｅｍ１）を共有し、連携するモジュール（＃３）１３０およびモジュール（＃４）１４０がセキュア共有領域１８１−２（Ｓｈ＿ｍｅｍ２）を共有している。セキュア共有領域１８１−１は、メモリ２８０上の開始アドレスＳｈ＿ｓｔａｒｔ１から終了アドレスＳｈ＿ｅｎｄ１の範囲とされる。また、セキュア共有領域１８１−２は、メモリ２８０上の開始アドレスＳｈ＿ｓｔａｒｔ２から終了アドレスＳｈ＿ｅｎｄ２の範囲とされる。
【００３６】
各セキュア共有領域１８１−１、１８１−２、…は、実行モジュール識別子フィールド１８２、切替フラグフィールド１８３、切替パラメータフィールド１８４および切替元モジュール識別子フィールド１８５を含み、それぞれ実行モジュール識別子、切替元モジュール識別子、切替フラグおよび切替パラメータが格納される。実行モジュール識別子は、ＯＳ上で動作するモジュールのモジュール識別子である。切替元モジュール識別子は、ＯＳ上で動作するモジュールを実行モジュール識別子が示すモジュールに切り替えた場合に、切り替える前にＯＳ上で動作していたモジュールのモジュール識別子である。なお、モジュール識別子とは、連携するモジュール間で互いのモジュールを一意に識別するための値である。
【００３７】
モジュール識別子として、セキュアプロセッサ２００で利用するタスク識別子を用いることができる。これに限らず、モジュール識別子として、連携するモジュール間で互いを識別可能に決定した値を用いることも可能である。切替フラグは、モジュールの切り替えの要因がモジュールの呼び出しによるものなのか、モジュールへの復帰によるものなのかを示す値を示す。切替パラメータは、モジュールの呼び出しの場合には呼び出し先の関数名と引数を示し、モジュールへの復帰の場合には実行結果を示す。
【００３８】
次に、本第１の実施形態によるモジュール切り替え機能を用いた各モジュールの一例の動作について説明する。ここでは、モジュール識別子としてタスク識別子を用いるものとする。また、モジュール（＃１）１１０は、モジュール識別子が「＃１」で、プログラムＡから生成されたアプリケーションモジュールであり、モジュール（＃２）１２０は、モジュール識別子が「＃２」で、プログラムＢから生成されたライブラリモジュールであるとする。
【００３９】
以下では、モジュール（＃１）１１０とモジュール（＃２）１２０とが連携動作して、モジュール（＃１）１１０からモジュール（＃２）１２０を呼び出し、その後、モジュール（＃２）１２０からモジュール（＃１）１１０に復帰する例を用いて説明する。
【００４０】
図６は、この、モジュール（＃１）１１０とモジュール（＃２）１２０との間で切り替えを行う処理の全体の流れを示す。ＯＳ１８０がモジュール（＃１）１１０およびモジュール（＃２）１２０の実行を開始すると、アプリケーションモジュールであるモジュール（＃１）１１０において、初期化処理部１１１が初期化処理を行う（ステップＳ１０）と共に、ライブラリモジュールであるモジュール（＃２）１２０において、初期化処理部１２１が初期化処理を行う（ステップＳ２０）。
【００４１】
初期化処理が終了すると、モジュール（＃２）１２０は、呼び出しを待機するスリープ状態となる。また、モジュール（＃１）１１０では、プログラム（＃１）本体１１２が実行される（ステップＳ１１）。
【００４２】
モジュール（＃１）１１０のプログラム（＃１）本体１１２において、モジュール（＃２）１２０の呼び出しを行うときには、切替前処理部１０４Ａでモジュール（＃１）１１０の切り替え前処理を実行し（ステップＳ１２）、モジュール（＃１）１１０からＯＳ１８０に対して切り替えを要求する。ＯＳ１８０は、この切り替え要求を受けて、スリープ状態にあるモジュール（＃２）１２０を呼び出して実行を再開させ、モジュール（＃２）１２０をスリープ状態から復帰させる。一方、モジュール（＃１）１１０は、呼び出しを待機するスリープ状態となる。
【００４３】
ＯＳ１８０からの実行再開によりモジュール（＃２）１２０が復帰すると、切替後処理部１０６Ｂでモジュール（＃２）１２０の切り替え後処理を実行する（ステップＳ２１）。そして、モジュール（＃２）１２０において、次のステップＳ２２で、呼び出し先すなわちプログラム（＃２）本体１２２が実行される。
【００４４】
モジュール（＃２）１２０のプログラム（＃２）本体１２２において、モジュール（＃１）１１０の呼び出しを行うときには、切替前処理部１０４Ｂでモジュール（＃２）１２０の切り替え前処理を実行し（ステップＳ２３）、モジュール（＃２）１２０からＯＳ１８０に対して切り替えを要求する。ＯＳ１８０は、この切り替え要求を受けて、スリープ状態にあるモジュール（＃１）１１０を呼び出して実行を再開させ、モジュール（＃１）１１０をスリープ状態から復帰させる。
【００４５】
ＯＳ１８０からの呼び出しによりモジュール（＃１）１１０が復帰されると、切替処理部１０６Ａでモジュール（＃１）１１０の切り替え後処理を実行する（ステップＳ１３）。そして、モジュール（＃１）１１０において、プログラム（＃１）本体１１２の実行が再開される（ステップＳ１４）。
【００４６】
このように、本第１の実施形態においては、例えばモジュール（＃１）１１０は、初期化処理部１１１による初期化処理の後に、プログラム（＃１）本体１１２の実行が開始される。また、モジュール（＃１）１１０は、他のモジュールを呼び出す際に、切替前処理部１０４Ａで切り替え前処理を実行する。また、他のモジュールから呼び出された場合は、切替後処理部１０６Ａで切り替え後処理を実行してから、プログラム（＃１）本体１１２が実行される。
【００４７】
以下、図６における各処理について、詳細に説明する。
【００４８】
先ず、モジュールの初期化処理について説明する。各モジュール（＃１）１１０およびモジュール（＃２）１２０は、ＯＳ１８０によって実行が開始されると、モジュール間での連携を行うためにそれぞれ初期化処理を実行する。図７は、アプリケーションモジュールが行う初期化処理の一例のフローチャートである。また、図８は、ライブラリモジュールが行う初期化処理の一例のフローチャートである。これら図７に示すアプリケーションモジュールの処理と、図８に示すライブラリモジュールの処理とは、互いに連携して実行される。以下、図７のフローチャートを中心に、必要に応じて図８のフローチャートを参照して説明を行う。
【００４９】
ＯＳ１８０により実行が開始されると、図７のステップＳ１１１−１および図８のステップＳ１２１−１で、連携しようとするモジュール（＃１）およびモジュール（＃２）の間でＡＫＥ（Ａｕｔｈｅｎｔｉｃａｔｉｏｎ  ａｎｄ  Ｋｅｙ  Ｅｘｃｈａｎｇｅ）を実施する。ＡＫＥの実施により、モジュール（＃１）１１０およびモジュール（＃２）１２０は、互いの正当性を検証すると共に、一時鍵Ｋｅｙ＿ＡＢを共有する。このように、ＡＫＥ実施により、連携する各モジュールは、適切な連携対象のプログラムのみが知り、他のモジュールが知ることができない鍵を共有する。
【００５０】
モジュール（＃１）１１０は、次のステップＳ１１１−２で、メモリ２８０上にセキュア共有領域１８１とするための領域を確保すると共に、モジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを生成する。モジュール共有鍵は、連携するモジュール間で共有する鍵であり、セキュア共有領域１８１を暗号化するために用いる。このモジュール共有鍵は、連携対象ではないモジュールが知ることができない値であればよく、その値はアプリケーションモジュール（この例ではモジュール（＃１）１１０）が決定してもよいし、乱数から生成してもよい。
【００５１】
次のステップＳ１１１−３および図８のステップＳ１２１−２で、モジュール（＃１）１１０およびモジュール（＃２）１２０は、ステップＳ１１１−２でモジュール（＃１）１１０がメモリ２８０上に確保した領域をセキュア共有領域１８１−１とするためのセキュア共有領域情報を交換する。より具体的には、先ず、モジュール（＃１）１１０がセキュア共有領域情報とモジュール（＃１）のモジュール識別子とを一時鍵Ｋｅｙ＿ＡＢで暗号化して、メモリ２８０を経由してモジュール（＃２）１２０に送付する。
【００５２】
ここで、セキュア共有領域情報は、ステップＳ１１１−２でモジュール（＃１）１１０がメモリ２８０上に確保した領域の先頭アドレス、末尾アドレスおよびモジュール共有鍵を含む。この例では、モジュール（＃１）１１０は、セキュア共有領域情報として、ステップＳ１１１−２で確保したメモリ２８０上の領域の先頭アドレスＳｈ＿ｓｔａｒｔ１および末尾アドレスＳｈ＿ｅｎｄ１、ならびに、モジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄをモジュール（＃２）１２０に送付する。それと共に、モジュール（＃１）１１０は、モジュール（＃１）１１０のモジュール識別子（この例ではタスク識別子「＃１」）をモジュール（＃２）１２０に送付する。
【００５３】
モジュール（＃２）１２０は、モジュール（＃１）１１０から送られてきたデータを一時鍵Ｋｅｙ＿ＡＢで復号し、セキュア共有領域情報（先頭アドレスＳｈ＿ｓｔａｒｔ１、末尾アドレスＳｈ＿ｅｎｄ１およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄ）と、モジュール（＃１）１１０のモジュール識別子とを取得する。
【００５４】
一方、モジュール（＃２）１２０は、モジュール（＃２）１２０のモジュール識別子を、モジュール（＃２）１２０のタスク識別子から「＃２」とし、このモジュール識別子を一時鍵Ｋｅｙ＿ＡＢで暗号化する。そして、モジュール識別子が暗号化されたこのデータを、モジュール（＃１）１１０にメモリ２８０を介して送付する。モジュール（＃１）１１０は、モジュール（＃２）１２０から送られてきたデータを一時鍵Ｋｅｙ＿ＡＢで復号することで、モジュール（＃２）１２０のモジュール識別子（この場合はタスク識別子の「＃２」）を得ることができる。
【００５５】
図７のステップＳ１１１−３および図８のステップＳ１２１−２の処理により、連携するモジュール間で特定のメモリ領域とその特定領域を暗号化するための鍵を共有すると共に、各モジュールに対して連携するモジュール間でそれぞれのモジュールを一意に識別するための値であるモジュール識別子を決定することができる。
【００５６】
モジュール（＃１）１１０は、次のステップＳ１１１−４で、セキュア共有領域情報を用いてセキュア共有領域１８１−１に対する暗号化設定を行う。これと並列的に、モジュール（＃２）１２０は、図８のステップＳ１２１−３で、セキュア共有領域情報を用いてセキュア共有領域１８１−１に対する暗号化設定を行う。具体的には、モジュール（＃１）１１０およびモジュール（＃２）１２０は、セキュアプロセッサ２００に対して、セキュア共有領域情報に含まれるセキュア共有領域１８１の先頭アドレスＳｈ＿ｓｔａｒｔ１、末尾アドレスＳｈ＿ｅｎｄ１および鍵値Ｋｅｙ＿ｓｈａｒｅｄを与えて暗号化設定を行う。
【００５７】
各モジュール（＃１）１１０およびモジュール（＃２）１２０それぞれがセキュアプロセッサ２００上で暗号化設定を行うと、セキュアプロセッサ２００は、鍵テーブル２２２を参照し、現タスク識別子に対応するエントリに対して、先頭アドレス、末尾アドレスおよび鍵値を書く。
【００５８】
具体的には、モジュール（＃１）１１０の暗号化設定によって、セキュアプロセッサ２００は、鍵テーブル２２２のモジュール（＃１）１１０に対応するインデックス「＃１」に対して、先頭アドレスＳｈ＿ｓｔａｒｔ１、末尾アドレスＳｈ＿ｅｎｄ１および鍵値Ｋｅｙ＿ｓｈａｒｅｄを書く。同様に、モジュール（＃２）１２０の暗号化設定によって、セキュアプロセッサ２００は、鍵テーブル２００のモジュール（＃２）１２０に対応するインデックス「＃２」に対して、先頭アドレスＳｈ＿ｓｔａｒｔ１、末尾アドレスＳｈ＿ｅｎｄ１および鍵値Ｋｅｙ＿ｓｈａｒｅｄを書く。
【００５９】
これらの設定により、モジュール（＃１）１１０やモジュール（＃２）１２０がメモリ２８０上の領域Ｓｈ＿ｍｅｍ１へ値を書く場合には、セキュアプロセッサ２００は、鍵Ｋｅｙ＿ｓｈａｒｅｄで暗号化した値をメモリ領域１８１に書く。また、モジュール（＃１）やモジュール（＃２）がメモリ２８０上の領域Ｓｈ＿ｍｅｍ１から値を読む場合には、セキュアプロセッサ２００は、領域Ｓｈ＿ｍｅｍ１から読み出したデータを鍵Ｋｅｙ＿ｓｈａｒｅｄで復号した値をコア２１０に与える。
【００６０】
モジュール（＃２）１２０は、ステップＳ１２１−３でセキュア共有領域情報を鍵テーブル２２２に書き込んだ後、モジュール（＃１）１１０からの呼び出しを待つために、後述する呼び出される側の処理の直前で処理を停止し、スリープ状態となる（図８のステップＳ１２１−４）。
【００６１】
一方、モジュール（＃１）１１０は、ステップＳ１１１−４でセキュア共有領域情報を鍵テーブル２２２に書き込んだ後、ステップＳ１１１−５で、自身のモジュール識別子（この場合は、タスク識別子の「＃１」）を、セキュア共有領域１８１−１の実行モジュール識別子フィールド１８２に対して実行モジュール識別子として書く。そして、次のステップＳ１１１−６で、モジュール（＃１）１１０におけるプログラム（＃１）本体１１２の実行を開始する。
【００６２】
このように、本第１の実施形態では、モジュール（＃１）１１０およびモジュール（＃２）１２０が、メモリ２８０上の同一の領域に対して同一の鍵を用いて暗号化設定を行う。これにより、モジュール（＃１）１１０およびモジュール（＃２）１２０は、当該領域から平文の値を読むことができ、ＯＳ１８０や、モジュール（＃１）１１０およびモジュール（＃２）１２０と連携していない他のモジュールからは、当該領域から暗号化された値しか読むことができない。つまり、連携するモジュール（この場合は、モジュール（＃１）１１０およびモジュール（＃２）１２０）は、メモリ２８０上の領域Ｓｈ＿ｍｅｍ１に対して、連携するモジュールだけにその平文の値がアクセス可能な、セキュアな共有領域を設けることができる。
【００６３】
次に、モジュールから他のモジュールを呼び出す際の処理について、図９〜図１１を用いて説明する。図６を用いて説明したように、モジュール（呼出元モジュール）から他のモジュール（呼び出し先モジュール）を呼び出す際には、切替前処理部１０４Ａまたは１０４Ｂにより呼出元モジュールに対して切り替え前処理が実行され、その後、切替後処理部１０６Ａまたは１０６Ｂにより呼び出し先モジュールに対して切り替え後処理が実行される。
【００６４】
以下では、モジュール（＃１）１１０からモジュール（＃２）１２０内のプログラム（＃２）本体１２２における関数ｓｕｂ（５）を呼び出す場合を例に説明する。なお、関数ｓｕｂ（５）において、「ｓｕｂ」は関数名であり、括弧内の数値「５」は、当該関数ｓｕｂ（）に渡す引数である。
【００６５】
図９は、切り替え前処理を示す一例のフローチャートである。図１０は、切り替え後処理を示す一例のフローチャートである。切り替え前処理および切り替え後処理は、呼出元モジュールから呼び出し先モジュールを呼び出す呼び出し処理と、呼び出し先モジュールから呼出元モジュールを呼び出して呼出元モジュールを復帰させる復帰処理とで処理内容が異なる。
【００６６】
図１１は、呼び出し処理および後述する復帰処理に伴う、セキュア共有領域１８１、ならびに、切替履歴領域１１８および１２８の状態の変化を概略的に示す。なお、図１１において、セキュア共有領域１８１内の「ＩＤ」、「フラグ」および「パラメータ」は、それぞれ実行モジュール識別子、切替フラグおよび切替パラメータを示す。上述した初期化処理の直後では、セキュア共有領域１８１には、図７のステップＳ１１１−５の処理で書き込まれた実行モジュール識別子「＃１」のみが保存されている。また、切替履歴領域１１８および１２８には、何も保存されていない。
【００６７】
先ず、呼び出し処理について説明する。モジュール（＃１）１１０において、切替前処理部１０４Ａは、モジュール（＃２）１２０を呼び出す直前に、モジュール切り替えの種別を判定する（ステップＳ１０４−１）。ここでは、切り替えの要因が呼び出しによると判定され、処理がステップＳ１０４−２に移行される。ステップＳ１０４−２では呼び出し先から復帰したときに正しい呼び出し元のアドレスに戻るために、呼び出し元のアドレスＡｄｄｒ１を、モジュール（＃１）１１０の切替履歴領域１１８に保存する。
【００６８】
次のステップＳ１０４−３で、切替前処理部１０４Ａは、セキュア共有領域１８１の切替フラグフィールド１８３に対して、切り替えの要因が「呼び出し」であることを示す切替フラグ「ｃａｌｌ」を書く。
【００６９】
次のステップＳ１０４−４で、切替前処理部１０４Ａは、切替パラメータフィールド１８４に対して、モジュール切り替えに必要な呼び出し情報として、呼び出し先の関数名「ｓｕｂ」とその引数「５」を書く。さらに、次のステップＳ１０４−５で、切替前処理部１０４Ａは、切替元モジュール識別子フィールド１８５に対して、自身のモジュール識別子「＃１」を書く。
【００７０】
処理は呼び出し処理および復帰処理で共通のステップＳ１０４−９に移行され、切替前処理部１０４Ａは、セキュア共有領域１８１にある実行モジュール識別子フィールド１８２に対して、呼び出し先のモジュール（この例ではモジュール（＃２）１２０）のモジュール識別子「＃２」を書く。そして、処理はステップＳ１０４−１０に移行され、スリープ状態となる。これは、呼び出し先から復帰する場合や、他のモジュールなどからの呼び出しに備えるためであり、モジュール（＃１）１１０は、自身をスリープ状態として、切り替え後処理の直前で処理を停止する。
【００７１】
なお、実行モジュール識別子フィールド１８２に対して実行モジュール識別子を書くことによって、モジュールの実行権が実行モジュール識別子で示されるモジュールに移ったと考えることができる。そのため、ステップＳ１０４−９による実行モジュール識別子の書き込みから、ステップＳ１０４−１０によるモジュールの処理停止までの期間は、可能な限り短くするのが好ましいと共に、その期間で当該モジュールの情報保護資産に関わる処理を行うことは、避けるのが望ましい。
【００７２】
ステップＳ１０４−１０によってモジュール（＃１）１１０がスリープ状態になると、実行権がＯＳ１８０に切り替わる。その後、ＯＳ１８０のスケジューラなどの制御によって実行権がモジュール（＃２）１２０に移り、モジュール（＃２）１２０が実行を再開する。
【００７３】
モジュールの実行権が切り替わると、図１０に示す手順に従い切り替え後処理が実行される。実行されるモジュールがモジュール（＃１）１１０からモジュール（＃２）１２０に切り替わると、モジュール（＃２）１２０の切替後処理部１０６Ｂは、セキュア共有領域１８１から実行モジュール識別子を得る（ステップＳ１０６−１）。そして、獲得した実行モジュール識別子の値が、モジュール（＃２）１２０のモジュール識別子の値と一致するか否かを判定する（ステップＳ１０６−２）。
【００７４】
若し、ステップＳ１０６−２で、実行モジュール識別子の値とモジュール（＃２）１２０のモジュール識別子の値とが一致しないと判定されたら、処理はステップＳ１０６−９に移行されてスリープ状態とされ、モジュール（＃２）１２０の状態が呼び出し処理の直前の状態に戻る。一方、ステップＳ１０６−２で、実行モジュール識別子の値とモジュール（＃２）１２０のモジュール識別子の値とが一致すると判定されたら、処理はステップＳ１０６−３に移行される。
【００７５】
この例では、セキュア共有領域１８１の実行モジュール識別子フィールド１８２に、モジュール識別子「＃２」が書き込まれているため、モジュール（＃２）１２０のモジュール識別子と値が一致すると判定される。したがって、切替後処理部１０６Ｂは、モジュール（＃２）１２０を実行すべきであることが分かるので、ステップＳ１０６−３に処理を移行させて、切り替え後処理を継続する。
【００７６】
ステップＳ１０６−３で、切替後処理部１０６Ｂは、セキュア共有領域１８１の切替フラグフィールド１８３から切替フラグを得る。次のステップＳ１０６−４で、獲得した切替フラグの値が「呼び出し」および「復帰」の何れを示すかが判定される。若し、切替フラグの値が「呼び出し」を示すと判定されたら、処理はステップＳ１０６−５に移行される。一方、切替フラグの値が「復帰」を示すと判定されたら、処理はステップＳ１０６−７に移行される。
【００７７】
この例では、上述したように図９のステップＳ１０４−３で「呼び出し」を示す切替フラグ「ｃａｌｌ」が切替フラグフィールド１８３に書き込まれているので、切替フラグの値が「呼び出し」を示すと判定され、関数呼び出しが要求されていることが分かる。したがって、処理がステップＳ１０６−５に移行される。
【００７８】
ステップＳ１０６−５で、切替後処理部１０６Ｂは、セキュア共有領域１８１の切替元モジュール識別子フィールド１８５から切替元モジュール識別子を取り出して、モジュール（＃２）１２０の切替履歴領域１２８に保存する。このように、切替元のモジュールを示すモジュール識別子を予め保存しておくことで、モジュール（＃２）１２０は、関数実行後に呼び出し元のモジュールに復帰することができる。
【００７９】
この例では、上述したように図９のステップＳ１０４−５でモジュール識別子「＃１」が切替元モジュール識別子フィールド１８５に書き込まれているので、このモジュール識別子「＃１」が切替元モジュール識別子として取り出され、切替履歴領域１８５に保存される。
【００８０】
次のステップＳ１０６−６で、切替後処理部１０６Ｂは、セキュア共有領域１８１の切替パラメータフィールド１８４から、呼び出し情報として書き込まれた関数名「ｓｕｂ」と、引数「５」とを得る。そして、これら関数名「ｓｕｂ」および引数「５」に従い、プログラム（＃２）本体１２２における関数ｓｕｂ（５）の実行を開始する。
【００８１】
図１１に例示されるように、呼び出し処理が終了した時点では、セキュア共有領域１８１には、切り替え前処理すなわち図９のステップＳ１０４−３、ステップＳ１０４−４およびステップＳ１０４−９で書き込まれた実行モジュール識別子「＃２」、切替フラグ「ｃａｌｌ」、ならびに、切替パラメータ「ｓｕｂ」および「５」が保存されている。また、モジュール（＃１）１１０の切替履歴領域１１８には、ステップＳ１０４−２で書き込まれた呼び出し元のアドレスＡｄｄｒ１が保存されている。モジュール（＃２）１２０の切替履歴領域１２８には、切り替え後処理すなわち図１０のステップＳ１０６−５で書き込まれたモジュール識別子「＃１」が保存されている。
【００８２】
次に、復帰処理について説明する。この例では、実行が呼び出し先のモジュール（＃２）１２０から、当該モジュール（＃２）１２０を呼び出した呼出元のモジュール（＃１）１１０に復帰する場合の処理となる。
【００８３】
モジュール（＃２）１２０の切替前処理部１０４Ｂは、モジュール（＃２）１２０から呼び出し元のモジュールに復帰する直前に、ステップＳ１０４−１で、モジュール切り替えの種別を判定する。ここでは、切り替えの要因が復帰によるものであると判定され、処理がステップＳ１０４−６に移行される。
【００８４】
ステップＳ１０４−６では、切替前処理部１０４Ｂは、切替履歴領域１２８から、呼び出された際（図９のステップＳ１０６−５）に保存しておいた切替元のモジュールのモジュール識別子「＃１」を得る。次のステップＳ１０４−７で、切替前処理部１０４Ｂは、セキュア共有領域１８１の切替フラグフィールド１８３に対して、切り替え要因が「復帰」であることを示す切替フラグ「ｒｅｔ」を書く。さらに、次のステップＳ１０４−８で、切替前処理部１０４Ｂは、セキュア共有領域１８１の切替パラメータフィールド１８４に対して、復帰処理に必要な呼び出し復帰情報として、切替前処理部１０４Ｂの実行の結果である実行結果Ｒｅｓｕｌｔ＿１を書く。
【００８５】
処理はステップＳ１０４−９に移行され、切替前処理部１０４Ｂは、セキュア共有領域１８１にある実行モジュール識別子フィールド１８２に対して、呼出元のモジュール（この例ではモジュール（＃１）１１０）のモジュール識別子「＃１」を書く。そして、処理はステップＳ１０４−１０に移行され、スリープ状態となり、切り替え後処理の直前で、処理を停止する。
【００８６】
ステップＳ１０４−１０によってモジュール（＃２）１２０がスリープ状態になると、実行権がＯＳ１８０に切り替わる。その後、ＯＳ１８０のスケジューラなどによって実行権がモジュール（＃１）１１０に移り、モジュール（＃１）１１０が実行を再開する。
【００８７】
モジュールの実行権が切り替わると、図１０に示す手順に従い切り替え後処理が実行される。実行されるモジュールがモジュール（＃２）１２０からモジュール（＃１）１１０に切り替わると、モジュール（＃１）１１０の切替後処理部１０６Ａは、セキュア共有領域１８１の実行モジュール識別子フィールド１８２からモジュール識別子「＃１」を取り出し（ステップＳ１０６−１）、取り出した値がモジュール（＃１）１１０のモジュール識別子と一致するため、切り替え後処理を継続する（ステップＳ１０６−２）。
【００８８】
ステップＳ１０６−３で、切替後処理部１０６Ａは、セキュア共有領域１８１の切替フラグフィールド１８３から切替フラグを得る。この例では、上述した図９のステップＳ１０４−７で切替フラグフィールド１８３に書かれた切替フラグ「ｒｅｔ」が得られるため、切替フラグの値が「復帰」を示すと判定し（ステップＳ１０６−４）、関数呼び出し復帰が要求されていることが分かる。したがって、処理がステップＳ１０６−７に移行する。
【００８９】
ステップＳ１０６−７で、切替後処理部１０６Ａは、切替履歴領域１１８から、上述のステップＳ１０４−２で保存しておいた呼び出し元のアドレスＡｄｄｒ１を得ると共に、切替履歴領域１１８に保存されている当該アドレスＡｄｄｒ１を削除する。次のステップＳ１０６−８で、切替後処理部１０６Ａは、セキュア共有領域１８１の切替パラメータフィールド１８４から呼び出し復帰情報を得る。そして、モジュール（＃１）１１０は、獲得した呼び出し復帰情報に含まれる実行結果Ｒｅｓｕｌｔ＿１を用いて、呼び出し元アドレスＡｄｄｒ１に戻って実行を再開する。
【００９０】
図１１に例示されるように、復帰処理が終了した時点では、セキュア共有領域１８１には、切り替え前処理すなわち図９のステップＳ１０４−７、ステップＳ１０４−８およびステップＳ１０４−９で書き込まれた切替フラグ「ｒｅｔ」、切替パラメータ「Ｒｅｓｕｌｔ＿１」および実行モジュール識別子「＃１」が保存されている。また、モジュール（＃１）１１０の切替履歴領域１１８は、切り替え後処理すなわち図１０のステップＳ１０６−７で呼び出し元のアドレスＡｄｄｒ１が削除され、何も保存されていない。同様に、モジュール（＃２）１２０の切替履歴領域１２８は、切り替え前処理すなわちステップＳ１０４−６で呼び出し元のモジュール識別子が削除され、何も保存されていない。
【００９１】
このように、連携するモジュール間でのみアクセス可能な領域を設け、実行が呼び出し元のモジュールが他のモジュールに切り替わる直前に、当該領域に呼び出し先のモジュールのモジュール識別子を書く。そして、呼び出し先のモジュールは、実行が呼出元モジュールから呼び出し先モジュールに切り替えられた直後に、当該領域に書かれた呼び出し先モジュールのモジュール識別子の値と自身のモジュール識別子とを比較することにより、実行順序の妥当性を保証することができる。この実行順序の妥当性が保証できることを示す具体的な例については、後述する。
【００９２】
図１２〜図１８を用いて、本第１の実施形態がモジュールの実行順序の妥当性を保証できることについて説明する。ここでは、プログラムＸ（Ｐｒｇ  Ｘ）によるアプリケーションモジュールであるモジュール＃１と、それぞれライブラリモジュールであるプログラムＹ（Ｐｒｇ  Ｙ）によるモジュール＃２およびプログラムＺ（Ｐｒｇ  Ｚ）によるモジュール＃３の３のモジュールが連携して実行されるものとする。このとき、モジュール＃１は、モジュール＃２を呼び出し、モジュール＃２は、モジュール＃３を呼び出すように構成されているものとする。
【００９３】
図１２は、正規の実行順序の例を示す。モジュール＃１〜＃３が実行開始されると、モジュール＃２および＃３がスリープ状態とされ、タイミングＡで実行するモジュールが切り替えられ、モジュール＃１からモジュール＃２が呼び出されると共に、モジュール＃１がスリープ状態とされる。タイミングＢで実行するモジュールが切り替えられ、モジュール＃２からモジュール＃３が呼び出されると共にモジュール＃２がスリープ状態とされる。次に、タイミングＣで実行するモジュールが切り替えられ、モジュール＃３からモジュール＃２が復帰されると共に、モジュール＃３がスリープ状態とされる。
【００９４】
以下、図１２に示した実行順序に対してなされる実行順序攻撃の例について、図１３〜図１５を用いて説明する。これらの実行順序攻撃は、通常、ＯＳのプログラムを利用や改変してモジュールの実行順序などを変更することで行われる。
【００９５】
図１３は、実行順序攻撃の第１の例を示す。第１の例では、スリープ状態のモジュールを、当該モジュールが正規の呼び出し元のモジュールから呼び出される前に、実行開始させる。図１３では、ＯＳのスケジューラなどを利用し、タイミングＡでモジュール＃１から呼び出されるべきモジュール＃２が、タイミングＡより前の、タイミングＤの時点で実行開始させる攻撃を示している。この場合、モジュール＃１がタイミングＡでモジュール＃２を呼び出した時点で、既に、モジュール＃２の先頭部分の実行が終了していることになる。一例として、モジュール＃２の先頭部分に認証処理を含む場合、この認証処理を介さずにモジュール＃２の残りの部分を実行できる。この第１の例を、タイミング攻撃と呼ぶ。
【００９６】
図１４は、実行順序攻撃の第２の例を示す。第２の例では、モジュールの呼び出し順序を正規の順序に対して変更する。正規には、図１２に例示するようにモジュール＃１からモジュール＃２が呼び出され、さらにモジュール＃２からモジュール＃３が呼び出される。これに対し、図１４では、ＯＳのスケジューラなどを利用し、モジュール＃１から呼び出すタイミングＡで、モジュール＃２ではなく、モジュール＃３を実行開始させる攻撃を示している。一例として、モジュール＃２での認証処理で認証された後に、モジュール＃３が実行可能となるような場合に、モジュール＃２での認証処理を介さずにモジュール＃３が実行されてしまうことになる。この第２の例を、呼び出し順序攻撃と呼ぶ。
【００９７】
図１５は、実行順序攻撃の第３の例を示す。第３の例では、ＯＳが予めモジュール＃１とは別のモジュール＃５とモジュール＃２とで実行を開始する。そして、モジュール＃５からモジュール＃２を呼び出して、例えば先頭部分のみを実行させて途中状態でモジュール＃５に復帰させる。モジュール＃２は、スリープ状態となる。このとき、ＯＳは、モジュール＃２の途中状態を保存しておき、その後、タイミングＡでモジュール＃１から途中状態のモジュール＃２を呼び出すようにすることができる。この場合においても、モジュール＃２の先頭部分に認証処理を含む場合、この認証処理を介さずにモジュール＃２の残り部分を実行できる。この第３の例を、途中状態モジュール挿入攻撃と呼ぶ。
【００９８】
図１６〜図１８を用いて、本第１の実施形態による構成で上述した実行順序攻撃の第１〜第３の例を回避できるか否かを検証する。なお、図１６〜図１８において、共有領域内ＣｕｒＩＤは、セキュア共有領域１８１に保存される実行モジュール識別子を示す。
【００９９】
図１６は、上述の図１３で示した第１の例すなわちタイミング攻撃に本第１の実施形態を適用させた例である。この場合、タイミングＡでモジュール＃１からモジュール＃２が呼び出されるまで、セキュア共有領域１８１には、実行モジュール識別子としてモジュール＃１を示す「＃１」が保存されている。一方、モジュール＃２をスリープ状態から実行再開させると、モジュール＃２は、上述した切り替え後処理により、図１０のステップＳ１０６−２で自身のモジュール識別子とセキュア共有領域１８１に保存されている実行モジュール識別子とが一致するか否かを判定する。
【０１００】
図１３に例示したタイミングＤでモジュール＃２を再開させた場合、セキュア共有領域１８１に保存される実行モジュール識別子は、値が「＃１」であり、モジュール＃２自身のモジュール識別子は値が「＃２」であり、両者が一致しない。そのため、処理がステップＳ１０６−９に移行されて、モジュール＃３がスリープ状態とされ、タイミング攻撃が回避される。
【０１０１】
図１７は、上述の図１４で示した第２の例すなわち呼び出し順序攻撃に本第１の実施形態を適用させた例である。この場合、モジュール＃１から呼び出されたモジュール＃３のモジュール識別子の値が「＃３」である。これに対し、セキュア共有領域１８１には、切り替え前処理により、図９のステップＳ１０４−９で次に実行すべき実行モジュール識別子として値「＃２」が保存されている。したがって、図１０を用いて上述した切り替え後処理のステップＳ１０６−２で、自身のモジュール識別子と、セキュア共有領域１８１に保存される実行モジュール識別子とが一致しないと判定される。したがって、処理がステップＳ１０６−９に移行されて、モジュール＃２がスリープ状態とされ、呼び出し順序攻撃が回避される。
【０１０２】
図１８は、上述の図１５で示した第３の例すなわち途中状態モジュール挿入攻撃に本第１の実施形態を適用させた例である。この場合、モジュール＃２およびモジュール＃５は、モジュール＃１の実行とは別系統で初期化されており、モジュール共有鍵Ｋｅｙ＿Ｓｈａｒｅｄ＿１を共有する。一方、モジュール＃１は、初期化によってモジュール共有鍵Ｋｅｙ＿Ｓｈａｒｅｄ＿２を持つ。そのため、モジュール＃２およびモジュール＃５の間で共有されるモジュール共有鍵Ｋｅｙ＿Ｓｈａｒｅｄ＿１は、モジュール＃１とは共有されないことになる。したがって、モジュール＃１がモジュール＃２を呼び出す際に、モジュール＃２は、セキュア共有領域１８１に保存された情報を、平文ではない状態で読むことになる。
【０１０３】
このように、モジュール＃１とモジュール＃２は、セキュア共有領域１８１に書かれた情報を共有することができないため、モジュール間で連携することができない。すなわち、途中状態のモジュールを挿入することを回避できる。
【０１０４】
このように、本第１の実施形態では、モジュールが実行再開された際に、切り替え後処理により、自身のモジュール識別子と、セキュア共有領域１８１に保存される、実行されるべきモジュールを示す実行モジュール識別子とが一致しているか否かを判定することにより、実行順序攻撃を回避できる。
【０１０５】
なお、本第１の実施形態は、本発明の主旨を逸脱しない範囲で、上述以外にも様々な変形が可能である。例えば、上述では、セキュア共有領域１８１として、セキュアプロセッサ２００とバス２８１で接続されるメモリ２８０を利用したが、これは適用可能な記憶装置の一例を示したに過ぎない。例えば、セキュア共有領域１８１として、セキュアプロセッサ２００が内蔵するキャッシュメモリを用いてもよいし、フラッシュメモリといった不揮発性のメモリを用いてもよい。さらに、セキュア共有領域１８１は、半導体メモリに限られず、例えばハードディスクを用いてもよい。
【０１０６】
同様に、上述では、初期化処理におけるＡＫＥやセキュア共有領域情報などの交換をメモリ２８０を用いて行うように説明したが、これは適用可能な記憶装置の一例を示したに過ぎない。すなわち、ＡＫＥやセキュア共有領域情報などの交換を、キャッシュメモリ、フラッシュメモリ、ハードディスクなどを介して行ってもよい。
【０１０７】
上述では、セキュアプロセッサ２００がコア２１０と暗号復号管理部２２０のみを含むように説明したが、これはこの例に限定されない。例えば、セキュアプロセッサ２００は、内部メモリ、ＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）コントローラなどを含んでいてもよい。さらに、上述では、暗号復号管理部２２０内の鍵テーブル２２２を動的に設定していたが、これはこの例に限定されず、予め作成され、セキュアプロセッサ２００内の不揮発性の記憶領域に埋め込まれた鍵であってもよい。
【０１０８】
上述の第１の実施形態では、ＡＫＥをアプリケーションモジュール側から開始したが、ＡＫＥをライブラリモジュール側から開始してもよい。
【０１０９】
上述の第１の実施形態では、各モジュールの実行開始時に初期化処理を実行するように説明したが、これはこの例に限定されない。すなわち、本発明では、初期化処理をプログラムの実行開始時に限定するものではない。例えば、アプリケーションモジュールとライブラリモジュールとが連携する直前に初期化処理を実行してもよい。また、初期化処理は、モジュールが連携する直前までであれば、どの時点で実行してもよい。
【０１１０】
上述の第１の実施形態では、アプリケーションモジュールと連携するライブラリモジュールの個数を２乃至３に限定して説明したが、これはこの例に限られない。すなわち、４以上のライブラリモジュールがアプリケーションモジュールと連携する場合にも、第１の実施形態を適用することができる。
【０１１１】
すなわち、本題１の実施形態は、アプリケーションモジュールが複数のライブラリモジュールと連携する場合、ライブラリモジュールから他のライブラリモジュールを呼び出す場合、ならびに、ライブラリモジュールからアプリケーションモジュールを呼び出す場合などにも適用可能である。これらの何れの場合でも、全てのモジュールで同じ鍵を共有し、その鍵を用いてセキュア共有領域を構築することにより、４以上のモジュールがセキュア共有領域を共有することが可能になる。
【０１１２】
上述の第１の実施形態では、１のアプリケーションモジュールに対して１つのセキュア共有領域を設けたが、１のアプリケーションモジュールが複数のセキュア共有領域を利用してもよい。例えば、アプリケーションモジュールと連携するあるモジュールとはセキュア共有領域Ｓｈ＿ｍｅｍ３を共有し、連携する別のモジュールとはセキュア共有領域Ｓｈ＿ｍｅｍ４を共有する。また、モジュール＃１、＃２および＃３が連携する場合に、モジュール＃１および＃２間、モジュール＃２および＃３間、ならびに、モジュール＃１および＃３間でそれぞれ１つずつセキュア共有領域を確保してもよい。
【０１１３】
上述の第１の実施形態では、暗号復号管理部２２０が独立したユニットとして構成されているように説明したが、これはこの例に限定されない。例えば、ＢＩＵ（Ｂｕｓ  Ｉｎｔｅｒｆａｃｅ  Ｕｎｉｔ）やＤＭＡコントローラなどの、プロセッサ外とのアクセスを行うユニットに内包してもよい。
【０１１４】
上述の第１の実施形態では、セキュアプロセッサ２００のデータ暗号化機構を用いて、連携するモジュール間でのみアクセス可能なセキュア共有領域１８１を構築したが、これはこの例に限定されない。すなわち、データ暗号化機構に限らず、セキュアプロセッサ２００のサポートによって連携するモジュール間でのみアクセス可能な領域が構築可能であれば、他の方法を用いてセキュア共有領域１８１を構築してもよい。
【０１１５】
上述の第１の実施形態では、ＯＳ１８０のサポートを得ることによってモジュールの切り替えを行っているが、これはこの例に限定されず、例えばハードウェア機構を用いてモジュールを直接的に切り替えるようにした場合（特許文献１参照）にも、本発明を適用することができる。
【０１１６】
上述の第１の実施形態では、切替履歴領域１１８および１２８を、独立したデータ領域として管理しているが、これはこの例に限定されない。すなわち、切替履歴領域１１８および１２８は、必ずしも独立した構成である必要はなく、各モジュールに含まれるスタックに包含するように構成してもよい。
【０１１７】
上述の第１の実施形態では、モジュール識別子としてタスク識別子を利用したが、これはこの例に限られず、モジュール識別子は、連携するモジュール間でユニークな値であれば、他の値を用いてもよい。例えば、各モジュールは、それぞれモジュール識別子を乱数によって生成してもよい。また、セキュアプロセッサ２００が複数のプロセッサコアを持ち、各プロセッサコアに対してユニークな識別子が付与されている場合も考えられる。この場合、各モジュールは、プロセッサコアを識別するコア識別子とタスク識別子とを組み合わせた値を、モジュール識別子として用いることができる。これに限らず、連携するモジュール間での取り決めによって、何方か一方のモジュールだけがモジュール識別子としてタスク識別子を用い、他方のモジュールは、モジュール識別子として乱数から得た値を用いる方法でもよい。
【０１１８】
＜第２の実施形態＞
次に、本発明の第２の実施形態について説明する。上述の第１の実施形態では、連携するモジュールでのみ読み書き可能にするセキュア共有領域１８１を、メモリ２８０上の一部の領域を用いて構成している。これに対し、本第２の実施形態では、セキュア共有領域を、セキュアプロセッサ上にハードウェアとして持つようにする。
【０１１９】
図１９は、本第２の実施形態に係るシステムの一例の構成を模式的に示す。図１９では、概略的なハードウェア構成と、システムビューとが同時に表されている。なお、図１９において、上述した図１と共通する部分には同一の符号を付し、詳細な説明を省略する。
【０１２０】
図１９において、本第２の実施形態によるセキュアプロセッサ４００は、コア４１０、ＢＩＵ４３０、モジュール切替管理部４２０を備える。モジュール切替管理部４２０は、モジュール切替管理テーブル４２２とテーブルアクセス制御部４２４とを備える。
【０１２１】
テーブルアクセス制御部４２４は、コア４１０からモジュール切替管理テーブル４２２に対するアクセスを許可するか否かを判定し、許可しない場合は、例外などを発行する。ＢＩＵ４３０は、外部のバス２８１に接続され、セキュアプロセッサ４００の内部からバス２８１に接続するためのバスインターフェイスユニットである。コア４１０は、ＢＩＵ４３０を介してバス２８１に接続され、例えばメモリ２８０にアクセスすることができる。
【０１２２】
なお、この第２の実施形態によるセキュアプロセッサ４００は、上述した第１の実施形態によるセキュアプロセッサ２００と異なり、鍵テーブルや暗号／復号器を持つ暗号／復号管理部を含まない。
【０１２３】
図２０は、モジュール切替管理テーブル４２２の一例のデータ構成を示す。モジュール切替管理テーブル４２２は、共有領域番号を示すインデクス（Ｉｄｘ）が「＃１」から「＃ｎ」までのｎ個のエントリを有する。各エントリは、モジュール共有鍵フィールド、実行モジュール識別子フィールド、切替元モジュール識別子フィールド、切替フラグフィールド、切替パラメータフィールドおよび有効ビットを有する。なお、有効ビットは、図２０においては「Ｖ」として表されている。これらのうち、実行モジュール識別子フィールド、切替元モジュール識別子フィールド、切替フラグフィールドおよび切替パラメータフィールドは、図５を用いて説明したセキュア共有領域１８１における名称が対応するフィールドと共通である。
【０１２４】
モジュール共有鍵フィールドは、当該フィールドにアクセス可能なモジュールのみが知り得る値を格納する。有効ビットは、そのエントリが有効か無効かを示すフラグである。
【０１２５】
図２１は、本第２の実施形態によるモジュール構成の一例の機能ブロック図を示す。なお、図２１において、上述した図４と共通する部分には同一の符号を付し、詳細な説明を省略する。
【０１２６】
図２１において、アプリケーションモジュールであるモジュール（＃１）３１０は、初期化処理部３１１、プログラム（＃１）本体１１２、切替前処理部３０４Ａ、切替後処理部３０６Ａおよび切替履歴領域１１８を備える。また、ライブラリモジュールであるモジュール（＃２）３２０は、初期化処理部３２１、プログラム（＃２）本体１２２および切替履歴領域１２８を備えると共に、それぞれモジュール（＃１）３１０の切替前処理部３０４Ａおよび切替後処理部３０６Ａと共通の処理を行う切替前処理部３０４Ｂおよび切替後処理部３０６Ｂを備える。
【０１２７】
なお、本第２の実施形態においては、上述した第１の実施形態とは異なり、メモリ２８０上には、モジュール（＃１）３１０およびモジュール（＃２）３２０とで共有するセキュア共有領域を設けない。
【０１２８】
次に、本第２の実施形態によるモジュール切り替え機能を用いた各モジュールの一例の動作について説明する。ここでは、モジュール識別子としてタスク識別子を用いるものとする。また、モジュール（＃１）３１０は、モジュール識別子が「＃１」で、プログラムＡから生成されたアプリケーションモジュールであり、モジュール（＃２）３２０は、モジュール識別子が「＃２」で、プログラムＢから生成されたライブラリモジュールであるとする。
【０１２９】
以下では、モジュール（＃１）１１０とモジュール（＃２）１２０とが連携動作して、モジュール（＃１）１１０からモジュール（＃２）１２０を呼び出し、その後、モジュール（＃２）１２０からモジュール（＃１）１１０に復帰する例を用いて説明する。
【０１３０】
ここで、例えばモジュール（＃１）３１０において、初期化処理部３１１、切替前処理部３０４Ａおよび切替後処理部３０６Ａによる処理は、上述した第１の実施形態による初期化処理部１１１、切替前処理部１０４Ａおよび切替後処理部１０６Ａによる処理に対して、初期化処理で共有した共有領域番号とモジュール共有鍵とを用いてモジュール切替管理テーブルへのアクセスを行う点が異なる。これは、モジュール（＃２）３２０でも同様である。
【０１３１】
図２２は、モジュール切替管理部４２４の一例の処理を示すフローチャートである。モジュール切替管理部４２４は、モジュール切替管理テーブル４２２に対してアクセスされたときに、この図２２のフローチャートに従い処理を行う。
【０１３２】
各モジュール（＃１）３１０およびモジュール（＃２）３２０がモジュール切替管理テーブル４２２上のフィールドにアクセスする場合には、コア４１０がアクセス先の共有領域番号とモジュール共有鍵とを指定する。例えばモジュール（＃１）３１０からモジュール切替管理テーブル４２２に対してアクセスがなされた場合、先ず、コア４１０からモジュール切替管理部４２０内のテーブルアクセス制御部４２４に対して、アクセス先の共有領域番号とモジュール共有鍵とが指定される。
【０１３３】
ステップＳ４２４−１で、テーブルアクセス制御部４２４は、モジュール切替管理テーブル４２２を参照して、指定された共有領域番号に対応する有効ビットの値を取得する。次のステップＳ４２４−２で、テーブルアクセス制御部４２４は、取得した有効ビットが「無効を示す値」であるか否かを判定する（ステップＳ４２４−２）。
【０１３４】
若し、取得した有効ビットが「無効を示す値」だと判定されたら、処理はステップＳ４２４−３に移行され、テーブルアクセス制御部４２４は、コア４１０から指定されたアクセスの要求が書き込み要求か否かを判定する。判定の結果、若し、アクセス要求が書き込み要求以外の要求だと判定されたら、処理はステップＳ４２４−６に移行され、テーブルアクセス制御部４２４は、例外を発行する。
【０１３５】
一方、ステップＳ４２４−３で、アクセス要求が書き込み要求であると判定されたら、処理はステップＳ４２４−４に移行される。ステップＳ４２４−４で、テーブルアクセス制御部４２４は、指定された共有領域番号に対応する有効ビットを「有効を示す値」に書き換える。そして、次のステップＳ４２４−５で、指定されたモジュール切替管理テーブル４２２の指定された共有領域番号に対して、指定された書き込みを実行する。
【０１３６】
上述したステップＳ４２４−２により、有効ビットが「無効を示す値」以外であると判定された場合、処理はステップＳ４２４−７に移行される。ステップＳ４２４−７では、テーブルアクセス制御部４２４は、モジュール切替管理テーブル４２２から、指定された共有領域番号に対応するモジュール共有鍵を得る。
【０１３７】
次のステップＳ４２４−８で、テーブルアクセス制御部４２４は、獲得したモジュール共有鍵の値が、各モジュール（＃１）３１０またはモジュール（＃２）３２０から与えられたモジュール共有鍵と一致するか否かを判定する。若し、一致すると判定されたら、処理はステップＳ４２４−９に移行され、テーブルアクセス制御部４２４は、モジュール切替管理テーブル４２２に対して指定された読み書きを実行する（Ｓ４２４−９）。一方、一致しないと判定されたら、処理はステップＳ４２４−６に移行され、テーブルアクセス制御部４２４は例外を発行する。
【０１３８】
次に、本第２の実施形態によるモジュールの初期化処理について説明する。各モジュール（＃１）３１０およびモジュール（＃２）３２０は、ＯＳ１８０によって実行が開始されると、モジュール間での連携を行うためにそれぞれ初期化処理を実行する。図２３は、アプリケーションモジュールであるモジュール（＃１）３１０が行う初期化処理を示す一例のフローチャートである。また、図２４は、ライブラリモジュールであるモジュール（＃２）３２０が行う初期化処理を示す一例のフローチャートである。これら図２３に示すアプリケーションモジュールの処理と、図２４に示すライブラリモジュールの処理とは、互いに連携して実行される。
【０１３９】
以下、図２３のフローチャートを中心に、必要に応じて図２４のフローチャートを参照して説明を行う。なお、図２３および図２４のフローチャートにおいて、上述した図７および図８のフローチャートと共通する処理には同一の符号を付し、詳細な説明を省略する。
【０１４０】
ＯＳ１８０により実行が開始されると、図２３のステップＳ１１１−１および図２４のステップＳ１２１−１で、モジュール（＃１）３１０およびモジュール（＃２）３２０のそれぞれにおいて、互いの間でＡＫＥを実施する。これにより、モジュール（＃１）１１０およびモジュール（＃２）１２０は、互いのプログラムの正当性を検証し、一時鍵Ｋｅｙ＿ＡＢを共有する。
【０１４１】
図２３において、次のステップＳ３１１−２で、モジュール（＃１）３１０の初期化処理部３１１は、モジュール切替管理テーブル４２２内の特定のエントリ（以下、共有領域と呼ぶ）へのアクセスを許可するためのモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを、乱数などから生成する。
【０１４２】
次のステップＳ３１１−３で、初期化処理部３１１は、特定の共有領域番号（例えは「＃１」）に対して、モジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄと自身のモジュールを示すモジュール識別子（値が「＃１」とする）とを指定する。ここで、共有領域番号とは、モジュール間で共有する、モジュール切替管理テーブル４２２内のエントリのインデックスを指す。これにより、モジュール切替管理テーブル４２２の空き領域を確保され、モジュール（＃２）３２０との間で共有する共有領域がモジュール切替管理テーブル４２２上に確保される。
【０１４３】
このステップＳ３１１−３において、モジュール切替管理テーブル４２２に対するアクセスがなされるため、モジュール切替管理部４２０は、上述した図２２のフローチャートに従い当該アクセスの制御を行う。この場合、指定された共有領域番号に対する有効ビットが「無効を示す値」であり、かつ、書き込み要求である。したがって、モジュール切替管理部４２０は、指定されたモジュール共有鍵とモジュール識別子とを、それぞれモジュール切替管理テーブル４２２におけるモジュール共有鍵フィールドと実行モジュール識別子フィールドに書くと共に、有効ビットを「有効を示す値」にセットする。
【０１４４】
次のステップＳ３１１−４で、モジュール（＃１）３１０は、セキュア共有領域情報とモジュール識別子とを一時鍵Ｋｅｙ＿ＡＢで暗号化して、メモリ２８０を経由してモジュール（＃２）３２０に送付する。ここで、セキュア共有領域情報は、ステップＳ３１１−３で確保した共有領域の共有領域番号およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指す。
【０１４５】
この例では、モジュール（＃１）３１０は、セキュア共有領域情報として、ステップＳ３１１−３で確保した共有領域の共有領域番号「＃１」と共有鍵Ｋｅｙ＿ｓｈａｒｅｄとを暗号化してモジュール（＃２）３２０に送付する。それと共に、モジュール（＃１）３１０は、自身を示すモジュール識別子として、タスク識別子「＃１」を暗号化してモジュール（＃２）３２０に送付する。
【０１４６】
図２４のステップＳ３２１−２で、モジュール（＃２）３２０は、モジュール（＃１）３１０から送付されたデータを一時鍵Ｋｅｙ＿ＡＢで復号し、セキュア共有領域に関する情報（共有領域番号「＃１」および共有鍵Ｋｅｙ＿ｓｈａｒｅｄ）と、モジュール識別子「＃１」とを取得する。これにより、モジュール（＃２）３２０側で、モジュール（＃１）３１０の情報を共有できる。
【０１４７】
また、モジュール（＃２）３２０は、自身を示すモジュール識別子として、タスク識別子「＃２」を鍵Ｋｅｙ＿ＡＢで暗号化して、メモリ２８０を介してモジュール（＃１）３１０に送付する。モジュール（＃１）３１０は、モジュール（＃２）３２０から送付されたデータを一時鍵Ｋｅｙ＿ＡＢで復号することで、モジュール（＃２）３２０を示すモジュール識別子「＃２」を得ることができる。これにより、モジュール（＃１）３１０側で、モジュール（＃２）３２０の情報を共有できる。
【０１４８】
図２４において、ステップＳ１２１−４で、モジュール（＃２）３２０は、後述の呼び出される側の処理の直前で処理を停止してスリープ状態となり、モジュール（＃１）３１０からの呼び出しを待機する。また、図２３において、ステップＳ１１１−６で、モジュール（＃１）は、プログラム（＃１）本体１１２の実行を開始する。
【０１４９】
次に、モジュールから他のモジュールを呼び出すときの処理を、図２５〜図２７を用いて説明する。上述の第１の実施形態と同様に、モジュール（呼出元モジュール）から他のモジュール（呼び出し先モジュール）を呼び出す際には、切替前処理部３０４Ａまたは３０４Ｂにより呼出元モジュールに対して切り替え前処理が実行され、その後、切替後処理部３０６Ａまたは３０６Ｂにより呼び出し先モジュールに対して切り替え後処理が実行される。
【０１５０】
以下では、モジュール（＃１）３１０からモジュール（＃２）３２０内のプログラム（＃２）本体１２２における関数ｓｕｂ（５）を呼び出す場合を例に説明する。なお、関数ｓｕｂ（５）において、「ｓｕｂ」は関数名であり、括弧内の数値「５」は、当該関数ｓｕｂ（）に渡す引数である。
【０１５１】
図２５は、本第２の実施形態による切り替え前処理を示す一例のフローチャートである。図２６は、本第２の実施形態による切り替え後処理を示す一例のフローチャートである。切り替え前処理および切り替え後処理は、呼出元モジュールから呼び出し先モジュールを呼び出す呼び出し処理と、呼び出し先モジュールから呼出元モジュールを呼び出して呼出元モジュールを復帰させる復帰処理とで処理内容が異なる。
【０１５２】
図２７は、呼び出し処理および後述する復帰処理に伴う、モジュール切替管理テーブル４２２、ならびに、切替履歴領域１１８および１２８の状態の変化を概略的に示す。なお、図２７において、モジュール切替管理テーブル４２２内の「Ｋｅｙ」、「ＣＭＩＤ」、「フラグ」、「パラメータ」および「Ｖ」は、それぞれモジュール共有鍵、実行モジュール識別子、切替フラグ、切替パラメータおよび有効フラグを示す。また、モジュール切替管理テーブル４２２は、共有領域番号「＃１」に対応するエントリの状態を示す。
【０１５３】
上述した初期化処理の直前では、モジュール切替管理テーブル４２２のモジュール共有鍵、実行モジュール識別子、切替フラグおよび切替パラメータの各フィールドには何も保存されていない。また、有効ビットフィールドは、「無効を示す値」である値「０」が保存されている。初期化処理を行うことで、モジュール切替管理テーブル４２２のモジュール共有鍵フィールドおよび実行モジュール識別子フィールドに対し、それぞれモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄおよび実行モジュール識別子「＃１」が保存される。また、有効ビットフィールドに「有効を示す値」である値「１」が保存される。
【０１５４】
先ず、呼び出し処理について説明する。モジュール（＃１）３１０において、切替前処理部３０４Ａは、モジュール（＃２）３２０を呼び出す直前に、モジュール切り替えの種別を判定する（ステップＳ３０４−１）。ここでは、切り替えの要因が呼び出しによると判定され、処理がステップＳ３０４−２に移行される。ステップＳ３０４−２では呼び出し先から復帰したときに正しい呼び出し元のアドレスに戻るために、呼び出し元のアドレスＡｄｄｒ１を、モジュール（＃１）３１０の切替履歴領域１１８に保存する。
【０１５５】
次のステップＳ３０４−３で、切替前処理部３０４Ａは、モジュール切替管理テーブル４２２の切替フラグフィールドに対して、切り替えの要因が「呼び出し」であることを示す切替フラグ「ｃａｌｌ」を書く処理を行う。このとき、上述した図２２のフローチャートに従い、モジュール切替管理部４２０が有効ビットおよびモジュール共有鍵による判定を行い、モジュール切替管理テーブル４２２に対する書き込みを制御する。
【０１５６】
すなわち、先ず、モジュール（＃１）３１０は、共有領域番号「＃１」、モジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄおよび切替フラグ「ｃａｌｌ」を指定する。セキュアプロセッサ４００（モジュール切替管理部４２０）は、上述した図２２のフローチャートに従い、モジュール切替管理テーブル４２２から、モジュール（＃１）３１０から指定された共有領域番号「＃１」で示されるエントリに保存されている有効ビットを取得する（図２２のステップＳ４２４−１）。有効ビットは、図２３で説明した初期化処理において「有効を示す値」に書き換えられている（ステップＳ４２４−４）。したがって、モジュール切替管理部４２０は、図２２のステップＳ４２４−７により、モジュール切替管理テーブル４２２から当該共有領域番号「＃１」で示されるエントリに保存されているモジュール共有鍵を取得する。
【０１５７】
モジュール切替管理部４２０は、このモジュール切替管理テーブル４２２から取得したモジュール共有鍵と、モジュール（＃１）３１０から与えられたモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄとが一致するか否かを判定する。この例では、これらモジュール共有鍵とモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄとが一致するため、モジュール切替管理部４２０は、モジュール切替管理テーブル４２２における共有領域番号「＃１」に対応するエントリの切替フラグフィールドに対して切替フラグ「ｃａｌｌ」を書く。
【０１５８】
次のステップＳ３０４−４で、切替前処理部３０４Ａは、モジュール切替管理テーブル４２２の切替パラメータフィールドに対して、モジュール切り替えに必要な呼び出し情報として、呼び出し先の関数名「ｓｕｂ」とその引数「５」を書く。この場合にも、上述したようにして、モジュール切替管理部４２０が、有効ビットおよびモジュール共有鍵による判定結果に基づきモジュール切替管理テーブル４２２に対する書き込みを制御する。
【０１５９】
処理は呼び出し処理および復帰処理で共通のステップＳ３０４−８に移行され、切替前処理部３０４Ａは、モジュール切替管理テーブル４２２の切替元モジュール識別子フィールドに対して、自身のモジュール識別子「＃１」を書く。さらに、次のステップＳ３０４−９で、切替前処理部３０４Ａは、モジュール切替管理テーブル４２２の実行モジュール識別子フィールドに対して、呼び出し先のモジュール（この例ではモジュール（＃２）３２０）のモジュール識別子「＃２」を書く。
【０１６０】
これらステップＳ３０４−８およびステップＳ３０４−９の処理においても、上述したようにして、モジュール切替管理部４２０が、有効ビットおよびモジュール共有鍵による判定結果に基づきモジュール切替管理テーブル４２２に対する書き込みを制御する。
【０１６１】
そして、処理はステップＳ３０４−１０に移行され、モジュール（＃１）３１０がスリープ状態となる。これは、呼び出し先から復帰する場合や、他のモジュールなどからの呼び出しに備えるためであり、モジュール（＃１）３１０は、自身をスリープ状態として、切り替え後処理の直前で処理を停止する。
【０１６２】
ステップＳ３０４−１０によってモジュール（＃１）３１０がスリープ状態になると、実行権がＯＳ１８０に切り替わる。その後、ＯＳ１８０のスケジューラなどの制御によって実行権がモジュール（＃２）３２０に移り、モジュール（＃２）３２０が実行を再開する。
【０１６３】
モジュールの実行権が切り替わると、図２６に示す手順に従い切り替え後処理が実行される。実行されるモジュールがモジュール（＃１）３１０からモジュール（＃２）３２０に切り替わると、ステップＳ３０６−１で、モジュール（＃２）３２０の切替後処理部３０６Ｂは、共有領域情報「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定して、セキュアプロセッサ４００に対して実行モジュール識別子の取得を要求する。
【０１６４】
すなわち、先ず、モジュール（＃２）３２０は、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定する。セキュアプロセッサ４００（モジュール切替管理部４２０）は、上述した図２２のフローチャートに従い、モジュール切替管理テーブル４２２から、モジュール（＃１）３１０から指定された共有領域番号「＃１」で示されるエントリに保存されている有効ビットを取得する（図２２のステップＳ４２４−１）。有効ビットは、図２３で説明した初期化処理において「有効を示す値」に書き換えられている（ステップＳ４２４−４）。したがって、モジュール切替管理部４２０は、図２２のステップＳ４２４−７により、モジュール切替管理テーブル４２２から当該共有領域番号「＃１」で示されるエントリに保存されているモジュール共有鍵を取得する。
【０１６５】
モジュール切替管理部４２０は、このモジュール切替管理テーブル４２２から取得したモジュール共有鍵と、モジュール（＃１）３１０から与えられたモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄとが一致するか否かを判定する。この例では、これらモジュール共有鍵とモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄとが一致するため、モジュール切替管理部４２０は、モジュール切替管理テーブル４２２における共有領域番号「＃１」に対応するエントリの実行モジュール識別子フィールドから実行モジュール識別子「＃２」を取得する。取得された実行モジュール識別子「＃２」は、モジュール（＃２）３２０に送信される。
【０１６６】
モジュール（＃２）３２０の切替後処理部３０６Ｂは、セキュアプロセッサ４００から送信された実行モジュール識別子の値「＃２」と、モジュール（＃２）３２０のモジュール識別子の値とが一致するか否かを判定する（ステップＳ３０６−２）。
【０１６７】
若し、ステップＳ３０６−２で、実行モジュール識別子の値とモジュール（＃２）３２０のモジュール識別子の値とが一致しないと判定されたら、処理はステップＳ３０６−９に移行されてスリープ状態とされ、モジュール（＃２）３２０の状態が呼び出し処理の直前の状態に戻る。一方、ステップＳ３０６−２で、実行モジュール識別子の値とモジュール（＃２）３２０のモジュール識別子の値とが一致すると判定されたら、処理はステップＳ３０６−３に移行される。
【０１６８】
この例では、セキュア共有領域１８１の実行モジュール識別子フィールド１８２に、モジュール識別子「＃２」が書き込まれているため、モジュール（＃２）３２０のモジュール識別子と値が一致すると判定される。したがって、切替後処理部３０６Ｂは、モジュール（＃２）３２０を実行すべきであることが分かるので、ステップＳ３０６−３に処理を移行させて、切り替え後処理を継続する。
【０１６９】
ステップＳ３０６−３で、切替後処理部３０６Ｂは、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定して、モジュール切替管理テーブル４２２から切替フラグを得る。この場合にも、上述したようにして、モジュール切替管理部４２０が、共有領域番号「＃１」が示すエントリに対する有効ビットおよびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄによる判定結果に基づき、モジュール切替管理テーブル４２２からの読み出しを制御する。
【０１７０】
次のステップＳ３０６−４で、獲得した切替フラグの値が「呼び出し」および「復帰」の何れを示すかが判定される。若し、切替フラグの値が「呼び出し」を示すと判定されたら、処理はステップＳ３０６−５に移行される。一方、切替フラグの値が「復帰」を示すと判定されたら、処理はステップＳ３０６−７に移行される。
【０１７１】
この例では、上述したように図２５のステップＳ３０４−３で「呼び出し」を示す切替フラグ「ｃａｌｌ」がモジュール切替管理テーブル４２２の切替フラグフィールドに書き込まれている。そのため、切替フラグの値が「呼び出し」を示すと判定され、関数呼び出しが要求されていることが分かる。したがって、処理がステップＳ３０６−５に移行される。
【０１７２】
ステップＳ３０６−５で、切替後処理部３０６Ｂは、呼び出し元に復帰するために、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定して、モジュール切替管理テーブル４２２の切替元モジュール識別子フィールドから切替元モジュール識別子を得る。この場合にも、上述したようにして、モジュール切替管理部４２０が、共有領域番号「＃１」が示すエントリに対する有効ビットおよびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄによる判定結果に基づき、モジュール切替管理テーブル４２２からの読み出しを制御する。取り出された切替元モジュール識別子は、モジュール（＃２）３２０の切替履歴領域１２８に保存される。
【０１７３】
次のステップＳ３０６−６で、切替後処理部３０６Ｂは、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定して、モジュール切替管理テーブル４２２の切替パラメータフィールドから、呼び出し情報として書き込まれた関数名「ｓｕｂ」と、引数「５」とを得る。この場合にも、上述したようにして、モジュール切替管理部４２０が、共有領域番号「＃１」が示すエントリに対する有効ビットおよびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄによる判定結果に基づき、モジュール切替管理テーブル４２２からの読み出しを制御する。取り出された関数名「ｓｕｂ」および引数「５」に従い、プログラム（＃２）本体１２２における関数ｓｕｂ（５）の実行を開始する。
【０１７４】
図２７に例示されるように、呼び出し処理が終了した時点では、モジュール切替管理テーブル４２２には、切り替え前処理すなわち図２５のステップＳ３０４−３、ステップＳ３０４−４およびステップＳ３０４−９で書き込まれた実行モジュール識別子「＃２」、切替フラグ「ｃａｌｌ」、ならびに、切替パラメータ「ｓｕｂ」および「５」が保存されている。有効ビットフィールドの値は、「１」のままである。また、モジュール（＃１）３１０の切替履歴領域１１８には、ステップＳ３０４−２で書き込まれた呼び出し元のアドレスＡｄｄｒ１が保存されている。モジュール（＃２）１２０の切替履歴領域１２８には、切り替え後処理すなわち図２６のステップＳ３０６−５で書き込まれたモジュール識別子「＃１」が保存されている。
【０１７５】
次に、復帰処理について説明する。この例では、実行が呼び出し先のモジュール（＃２）３２０から、当該モジュール（＃２）３２０を呼び出した呼出元のモジュール（＃１）３１０に復帰する場合の処理となる。
【０１７６】
モジュール（＃２）３２０の切替前処理部３０４Ｂは、モジュール（＃２）３２０から呼び出し元のモジュールに復帰する直前に、ステップＳ３０４−１で、モジュール切り替えの種別を判定する。ここでは、切り替えの要因が復帰によるものであると判定され、処理がステップＳ３０４−５に移行される。ステップＳ３０４−５では、切替前処理部３０４Ｂは、切替履歴領域１２８から、呼び出された際（図２６のステップＳ３０６−５）に保存しておいた切替元のモジュールのモジュール識別子「＃１」を得る。
【０１７７】
次のステップＳ３０４−６で、切替前処理部３０４Ｂは、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定して、復帰を示すフラグ「ｒｅｔ」を切替フラグとして、モジュール切替管理テーブル４２２の切替フラグフィールドに書く。この場合にも、上述したようにして、モジュール切替管理部４２０が、共有領域番号「＃１」が示すエントリに対する有効ビットおよびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄによる判定結果に基づき、モジュール切替管理テーブル４２２に対する書き込みを制御する。
【０１７８】
次のステップＳ３０４−７で。切替前処理部３０４Ｂは、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定して、モジュール切替管理テーブル４２２の切替パラメータフィールドに対して、復帰処理に必要な呼び出し復帰情報として、モジュール（＃２）３２０の実行の結果である実行結果「Ｒｅｓｕｌｔ＿１」を書く。
【０１７９】
処理は、呼び出し処理および復帰処理で共通のステップＳ３０４−８に移行され、切替前処理部３０４Ａは、モジュール切替管理テーブル４２２の切替元モジュール識別子フィールドに対して、自身のモジュール識別子「＃２」を書く。さらに、次のステップＳ３０４−９で、切替前処理部３０４Ａは、モジュール切替管理テーブル４２２の実行モジュール識別子フィールドに対して、呼び出し先のモジュール（この例ではモジュール（＃２）３１０）のモジュール識別子「＃１」）を書く。
【０１８０】
これらステップＳ３０４−８およびステップＳ３０４−９の処理においても、上述したようにして、モジュール切替管理部４２０が、有効ビットおよびモジュール共有鍵による判定結果に基づきモジュール切替管理テーブル４２２に対する書き込みを制御する。
【０１８１】
そして、処理はステップＳ３０４−１０に移行され、モジュール（＃１）３１０がスリープ状態となる。これは、呼び出し先から復帰する場合や、他のモジュールなどからの呼び出しに備えるためであり、モジュール（＃１）３１０は、自身をスリープ状態として、切り替え後処理の直前で処理を停止する。
【０１８２】
ステップＳ３０４−１０によってモジュール（＃２）３２０がスリープ状態になると、実行権がＯＳ１８０に切り替わる。その後、ＯＳ１８０のスケジューラなどによって実行権がモジュール（＃１）３１０に移り、モジュール（＃１）３１０が実行を再開する。
【０１８３】
モジュールの実行権が切り替わると、図２６に示す手順に従い切り替え後処理が実行される。実行されるモジュールがモジュール（＃２）３２０からモジュール（＃１）３１０に切り替わると、モジュール（＃１）３１０の切替後処理部３０６Ａは、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定して、セキュアプロセッサ４００に対して実行モジュール識別子の取得を要求する。セキュアプロセッサ４００は、この要求に応じてモジュール切替管理テーブル４２２の実行モジュール識別子フィールドに書き込まれた実行モジュール識別子「＃１」を取り出し、モジュール（＃１）３１０に返す。
【０１８４】
すなわち、先ず、モジュール（＃１）３１０は、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定する。セキュアプロセッサ４００（モジュール切替管理部４２０）は、上述した図２２のフローチャートに従い、モジュール切替管理テーブル４２２から、モジュール（＃１）３１０から指定された共有領域番号「＃１」で示されるエントリに保存されている有効ビットを取得する（図２２のステップＳ４２４−１）。有効ビットは、図２３で説明した初期化処理において「有効を示す値」に書き換えられている（ステップＳ４２４−４）。したがって、モジュール切替管理部４２０は、図２２のステップＳ４２４−７により、モジュール切替管理テーブル４２２から当該共有領域番号「＃１」で示されるエントリに保存されているモジュール共有鍵を取得する。
【０１８５】
モジュール切替管理部４２０は、このモジュール切替管理テーブル４２２から取得したモジュール共有鍵と、モジュール（＃１）３１０から与えられたモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄとが一致するか否かを判定する。この例では、これらモジュール共有鍵とモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄとが一致するため、モジュール切替管理部４２０は、モジュール切替管理テーブル４２２における共有領域番号「＃１」に対応するエントリの実行モジュール識別子フィールドから実行モジュール識別子「＃１」を取得する。
【０１８６】
切替後処理部３０６Ａは、セキュアプロセッサ４００から実行モジュール識別子「＃１」が返されると、次のステップＳ３０６−２で、このセキュアプロセッサ４００から返された実行モジュール識別子「＃１」と、モジュール（＃１）３１０のモジュール識別子の値とが一致するか否かを判定する。
【０１８７】
若し、ステップＳ３０６−２で、実行モジュール識別子の値とモジュール（＃１）３１０のモジュール識別子の値とが一致しないと判定されたら、処理はステップＳ３０６−９に移行されてスリープ状態とされ、モジュール（＃１）３１０の状態が呼び出し処理の直前の状態に戻る。一方、ステップＳ３０６−２で、実行モジュール識別子の値とモジュール（＃１）３１０のモジュール識別子の値とが一致すると判定されたら、処理はステップＳ３０６−３に移行される。
【０１８８】
この例では、セキュア共有領域１８１の実行モジュール識別子フィールド１８２に、モジュール識別子「＃１」が書き込まれているため、モジュール（＃１）３１０のモジュール識別子と値が一致すると判定される。したがって、切替後処理部３０６は、モジュール（＃１）３１０を実行すべきであることが分かるので、ステップＳ３０６−３に処理を移行させて、切り替え後処理を継続する。
【０１８９】
ステップＳ３０６−３で、切替後処理部３０６Ａは、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定して、モジュール切替管理テーブル４２２から切替フラグを得る。この場合にも、上述したようにして、モジュール切替管理部４２０が、共有領域番号「＃１」が示すエントリに対する有効ビットおよびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄによる判定結果に基づき、モジュール切替管理テーブル４２２からの読み出しを制御する。
【０１９０】
次のステップＳ３０６−４で、獲得した切替フラグの値が「呼び出し」および「復帰」の何れを示すかが判定される。若し、切替フラグの値が「呼び出し」を示すと判定されたら、処理はステップＳ３０６−５に移行される。一方、切替フラグの値が「復帰」を示すと判定されたら、処理はステップＳ３０６−７に移行される。
【０１９１】
この例では、上述したように図２５のステップＳ３０４−６で「復帰」を示す切替フラグ「ｒｅｔ」が切替フラグフィールド１８３に書き込まれているので、切替フラグの値が「復帰」を示すと判定され、関数呼び出しが要求されていることが分かる。したがって、処理がステップＳ３０６−７に移行される。
【０１９２】
ステップＳ３０６−７で、切替後処理部３０６Ａは、切替履歴領域１１８から、上述のステップＳ３０４−２で保存しておいた呼び出し元のアドレスＡｄｄｒ１を得ると共に、切替履歴領域１１８に保存されている当該アドレスＡｄｄｒ１を削除する。次のステップＳ３０６−８で、切替後処理部３０６Ａは、共有領域番号「＃１」およびモジュール共有鍵Ｋｅｙ＿ｓｈａｒｅｄを指定して、モジュール切替管理テーブル４２２の切替パラメータフィールド１８４から、呼び出し復帰情報を得る。そして、モジュール（＃１）３１０は、獲得した呼び出し復帰情報に含まれる実行結果「Ｒｅｓｕｌｔ＿１」を用いて、呼び出し元アドレスＡｄｄｒ１に戻って実行を再開する。
【０１９３】
このように、本第２の実施形態では、モジュール（＃１）３１０およびモジュール（＃２）３２０がモジュール共有鍵を共有し、モジュール切替管理部４２０がそのモジュール共有鍵によってモジュール切替管理テーブル４２２のエントリへのアクセス制御を行っている。これにより、モジュール切替管理テーブル４２２のエントリに書かれた値の読み書きを、モジュール（＃１）およびモジュール（＃２）３２０からは可能とし、ＯＳ１８０や他のモジュールからは不可能とすることができる。このように、悪意により改変されたＯＳ１８０や他のモジュールからでは、モジュール切替管理テーブル４２２に書かれた値を書き換えることができない。そのため、モジュール切替管理部４２０は、第１の実施形態のセキュア共有領域１８１と同等の役割を果たしているといえる。
【０１９４】
図２７に例示されるように、復帰処理が終了した時点では、モジュール切替管理テーブル４２２には、切り替え前処理すなわち図２５のステップＳ３０４−６、ステップＳ３０４−７およびステップＳ３０４−９で書き込まれた切替フラグ「ｒｅｔ」、切替パラメータ「Ｒｅｓｕｌｔ＿１」および実行モジュール識別子「＃１」が保存されている。また、モジュール（＃１）３１０の切替履歴領域１１８は、切り替え後処理すなわち図２６のステップＳ３０６−７で呼び出し元のアドレスＡｄｄｒ１が削除され、何も保存されていない。同様に、モジュール（＃２）１２０の切替履歴領域１２８は、切り替え前処理すなわちステップＳ３０４−５で呼び出し元のモジュール識別子が削除され、何も保存されていない。
【０１９５】
なお、本第２の実施形態では、セキュアプロセッサ４００上にモジュール切替管理部４２０を設けたが、これはこの例に限定されない。すなわち、図２８に例示されるように、信頼できる仮想マシンモニタ（Ｔｒｕｓｔｅｄ  ＶＭＭ）４４０が同様の機構を設けるように構成することができる。
【０１９６】
例えば、プロセッサ４５０は、本第２の実施形態に特有のモジュール切替管理部４２０などを含まない一般的なプロセッサとし、仮想マシンモニタ４４０内部にモジュール切替管理部４２０を備える方法が考えられる。各モジュール（＃１）３１０、モジュール（＃２）３２０、モジュール（＃３）３３０およびモジュール（＃４）３４０は、仮想マシンモニタ４４０にあるモジュール切替管理部４２０を利用して、本第２の実施形態と同様の方法でモジュール切替を行うことが可能である。図２８の例では、仮想マシンモニタ４４０上で複数のＯＳ（ＯＳ１８０、ＯＳ＿ｙ１８１およびＯＳ＿ｚ１８２）が動作し、各モジュールは、ＯＳ１８０上で動作している。また、モジュール切替管理部４２０をハードウェアではなく、ＯＳ上に構成することも可能である。
【０１９７】
また、本第２の実施形態では、モジュール切替管理テーブル４２２における全ての値をセキュアプロセッサ４００内に格納するように説明したが、これはこの例に限定されない。すなわち、モジュール切替管理テーブル４２２の情報の一部をセキュアプロセッサ４００内に格納し、残りの部分を、第１の実施形態で示したメモリ２８０上のセキュア共有領域１８１へ格納するように構成することもできる。
【０１９８】
さらに、本第２の実施形態では、モジュール切替管理テーブル４２２へのアクセスにおいて、１フィールド単位で読み書きを行うように説明したが、これはこの例に限定されず、例えば一度に複数フィールドを読み書きするようにしてもよい。
【０１９９】
＜第３の実施形態＞
次に、本発明の第３の実施形態について説明する。上述した第１および第２の実施形態は、モジュールの呼び出しを一般的な呼び出し処理により行っていた。これに対して、本第３の実施形態は、モジュールの呼び出しを、言語例外により行う場合の例である。
【０２００】
ここで、言語例外について説明する。コンピュータの分野において、例外という用語は、ハードウェア例外と言語例外の２種類がある。ハードウェア例外とは、ハードウェア割り込みや不正命令実行などの事象を指す。ハードウェア例外に対しては、ハードウェア例外に対応する割り込みハンドラへ制御を移すといった、プロセッサの機構により処理する。
【０２０１】
一方、言語例外とは、ファイルが見つからないといった例外的な事象を指し、言語例外はＣ＋＋やＪａｖａ（登録商標）などのプログラミング言語環境で提供される。ライブラリなどの、言語例外が発生した関数からその呼び出し元関数を辿って言語例外に対応する例外ハンドラへ制御を移すといった機構により、言語例外を処理する。本第３の実施形態では、後者の言語例外を対象とする。
【０２０２】
また、このような言語例外を扱うための機構を、言語例外処理機構と呼ぶ。言語例外処理機構とは、呼び出し先の関数ではそれらの処理を記述せずに、呼び出し元の関数で言語例外が起きた場合の処理を記述して、呼び出し元の関数に合わせたエラー処理を実行可能とするための仕組みである。このような仕組みは、例えば「Ｂｊａｒｎｅ  Ｓｔｒｏｕｓｔｒｕｐ著  “Ｃ＋＋の設計と進化”」などに記載されている。Ｃ＋＋やＣ＃などのプログラミング言語環境では、ｔｒｙ〜ｃａｔｃｈの形式で記述され、多くのアプリケーションで利用されており、その仕組みはよく知られている。
【０２０３】
図２９は、言語例外処理機構８００による動作を模式的に示す。モジュール内のある関数で言語例外が発生すると、言語例外処理機構８００が例外処理ライブラリを呼び出す。例外処理ライブラリは、まず、言語例外が発生した関数内で、発生した言語例外に対応する例外ハンドラを探索する。例外ハンドラの探索は、例えば発生した言語例外の型に基づき行うことができる。若し、対応する例外ハンドラが見つかれば当該例外ハンドラに制御を移し、例外ハンドラが見つからなければ、関数の巻き戻しを行う。
【０２０４】
関数の巻き戻しとは、呼び出し元関数に戻るための処理を指し、スタックなどに含まれるフレーム情報に基づいて、スタックを呼び出し前の状態に戻し、呼び出し元のアドレスを特定して、そのアドレスに制御を移す。呼び出し元関数に戻ると、例外処理ライブラリは、言語例外に対応する例外ハンドラを探索する。このように、例外処理ライブラリは、言語例外に対応する例外ハンドラが見つかるまで関数の巻き戻しを行って、呼び出し元関数に遡る。
【０２０５】
図２９の例では、モジュール＃１〜＃３の３のモジュールが動作し、モジュール＃１からモジュール＃２、モジュール＃３の順にモジュールを呼び出している。モジュール＃３の実行中に言語例外が発生し、その言語例外をキャッチする例外ハンドラがモジュール＃１にある場合を示している。図中の実線は、プログラムの実行の流れを示し、波線は、言語例外処理機構８００が関数の巻き戻しを行う際に探索される関数の順番を示す。
【０２０６】
モジュール＃３で言語例外が発生すると、処理が言語例外処理機構８００に移行する。言語例外処理機構８００は、先ず、言語例外が発生したモジュール＃３内の関数で、言語例外に対応する例外ハンドラを探索する。この例では、言語例外に対応する例外ハンドラが見つからないため、関数の巻き戻しを行ってモジュール＃３内の呼び出し元関数に戻る。同様に、呼び出し元関数でも言語例外に対応する例外ハンドラを探索する。言語例外処理機構８００は、言語例外に対応する例外ハンドラが見つかるまで、これを繰り返し行う。
【０２０７】
図２９の例では、モジュール＃３からモジュール＃２に戻り、モジュール＃２で例外ハンドラを探索する。モジュール＃２で例外ハンドラが見つからなければ、さらにモジュール＃１に戻って、例外ハンドラを探索する。この例では、モジュール＃１の関数まで戻ることで、発生した言語例外に対応する例外ハンドラが探索されている。例外ハンドラが探索されると、言語例外処理機構８００は、探索された例外ハンドラに実行制御を移す。
【０２０８】
このような言語例外処理機構８００による言語例外に対する処理を上述した第１または第２の実施形態に適用する場合について考える。セキュアプロセッサでは、図３を用いて説明したように、各モジュールが別々にスタックを管理するため、モジュール内で関数の巻き戻しを行う場合と、モジュールを跨って関数の巻き戻しを行う場合とでは処理が異なる。モジュール内で関数の巻き戻しを行う場合には、通常通り、そのモジュールのスタックなどを調査することで、その関数の呼び出し元の関数を特定することができる。一方、モジュールを跨って関数の巻き戻しを行う場合には、別のモジュールがそのスタックを直接的に見ることができないため、呼び出し元の関数を特定することができない。したがって、本発明の前提となるセキュアプロセッサでは、複数モジュールで構成されると、従来の言語例外処理機構８００の関数の巻き戻しが正しく動作しない場合がある。
【０２０９】
図３０は、本発明の第３の実施形態に適用可能なシステムの一例の構成を模式的に示す。図３０では、概略的なハードウェア構成と、システムビューとを同時に表している。なお、図３０において、上述した図１の構成と共通する部分には同一の符号を付し、詳細な説明を省略する。
【０２１０】
ターゲットシステムは、ハードウェア的には、図１で説明した構成をそのまま適用できるので、ここでの説明を省略する。ターゲットシステムにおいて、セキュアプロセッサ２００のコア２１０上で単一のＯＳ（オペレーティングシステム）１８０が動作し、ＯＳ１８０上で１または複数のモジュールが動作する。図３０の例では、複数のモジュール（＃１）５１０、モジュール（＃２）５２０、モジュール（＃３）５３０およびモジュール（＃４）５４０が動作している。
【０２１１】
図３０の例では、モジュール（＃１）５１０は、タスク識別子が「＃１」であって、プログラムＡ（Ｐｒｇ  Ａ）から生成されていることが示されている。モジュール（＃２）５２０は、タスク識別子が「＃２」であって、プログラムＢ（Ｐｒｇ  Ｂ）から生成されている。モジュール(＃３)５３０は、タスク識別子が「＃３」であって、プログラムＣ（Ｐｒｇ  Ｃ）から生成されている。また、モジュール（＃４）５４０は、タスク識別子が「＃４」であって、プログラムＢから生成されている。
【０２１２】
図３１は、本第３の実施形態によるモジュール構成の一例の機能ブロック図を示す。図３１において、モジュール（＃１）５１０、モジュール（＃２）５２０およびモジュール（＃３）５３０は、協働して動作し、それぞれ本第３の実施形態によるモジュール切り替え機構を備える。ここでは、モジュール（＃１）５１０がアプリケーションモジュールであり、モジュール（＃２）５２０およびモジュール（＃３）５３０がライブラリモジュールであるものとする。
【０２１３】
モジュール（＃１）５１０は、上述の図４の構成と同様に初期化処理部１１１、プログラム（＃１）本体１１２、切替前処理部１０４Ａ、切替後処理部１０６Ａおよび切替履歴領域１１８を備えると共に、例外通知部５０５Ａおよび例外受付部５０７Ａをさらに備える。同様に、モジュール（＃２）５２０は、初期化処理部１２１、プログラム（＃２）本体１２２、切替前処理部１０４Ｂ、切替後処理部１０６Ｂおよび切替履歴領域１２８を備えると共に、それぞれモジュール（＃１）５１０の例外通知部５０５Ａおよび例外受付部５０７Ａと共通の処理を行う例外通知部５０５Ｂおよび例外受付部５０７Ｂをさらに備える。また、連携するモジュール（＃１）５１０およびモジュール（＃２）５２０間では、メモリ２８０上にセキュア共有領域１８１を共有する。
【０２１４】
また、図３１では詳細を省略しているが、モジュール（＃３）５３０も、モジュール（＃１）５１０およびモジュール（＃２）５２０と同様の構成を備える。また、モジュール（＃３）５３０も、モジュール（＃１）５１０およびモジュール（＃２）５２０とメモリ２８０上のセキュア共有領域１８１を共有する。
【０２１５】
図３２は、本第３の実施形態を適用したモジュール間で言語例外が発生した場合の一例の処理を、模式的に示す。図３２において、長破線は、本第３の実施形態を適用したことによって発生するプログラム実行の流れの例を示す。
【０２１６】
以下では、図３２に例示されるように、モジュール（＃１）５１０、モジュール（＃２）５２０およびモジュール（＃３）５３０が連係動作し、モジュール（＃１）５１０からモジュール（＃２）５２０を経由してモジュール（＃３）５３０を呼び出す。このとき、モジュール（＃２）５２０から呼び出されたモジュール（＃３）において言語例外が発生し、モジュール（＃３）５３０からモジュール（＃１）５１０にある例外ハンドラまで関数を巻き戻す場合を例に説明する。ここで、各モジュール（＃１）５１０、モジュール（＃２）５２０およびモジュール（＃３）５３０は、それぞれ言語例外処理機構８００Ａ、８００Ｂおよび８００Ｃを有する。
【０２１７】
本第３の実施形態では、第１の実施形態で示したモジュール間の切り替え処理に多少の変更を加えた処理を行うことにより、モジュールを跨いだ関数の巻き戻し処理を実現する。初期化処理は、第１の実施形態で図７および図８を用いて説明した処理と同一の処理を適用可能であるため、ここでの説明を省略する。初期化処理によって、モジュール（＃１）５１０、モジュール（＃２）５２０およびモジュール（＃３）５３０は、メモリ２８０上に設けられたセキュア共有領域１８１を共有できるようになる。
【０２１８】
また、本第３の実施形態において、言語例外が発生していない通常の状態における、モジュールから他のモジュールを呼び出す際の処理や、他のモジュールを呼び出したモジュールが復帰する際の処理は、上述した第１の実施形態において図６〜図１０を用いて説明した処理をそのまま適用可能であるため、ここでの説明を省略する。
【０２１９】
図３３〜図３５を用いて、本第３の実施形態による、モジュールを跨いで関数の巻き戻しを行う際の処理について説明する。図３３は、本第３の実施形態による一例の例外通知処理を示すフローチャートである。図３４は、本第３の実施形態による一例の例外受付処理を示すフローチャートである。
【０２２０】
また、図３５は、上述した図１１と対応し、言語例外発生の場合の、呼び出し処理および復帰処理、ならびに、言語例外通知処理および言語例外受付処理に伴うセキュア共有領域１８１、ならびに、各モジュール（＃１）５１０、モジュール（＃２）５２０およびモジュール（＃３）５３０の切替履歴領域の状態の変化を概略的に示す。
【０２２１】
モジュール（＃１）５１０から順次モジュールが呼び出され、モジュール（＃３）５３０に実行権が移るまでは、第１の実施形態で図１１を用いて説明したのと同様にして、セキュア共有領域１８１および各切替履歴領域の状態が変化する。図３５の例では、初期化処理の直後では、セキュア共有領域１８１には、実行モジュール識別子「＃１」のみが保存されている。また、各切替履歴領域には、何も保存されていない。
【０２２２】
この状態からモジュール（＃２）５２０が呼び出されると、セキュア共有領域１８１の実行モジュール識別子フィールド１８２および切替フラグフィールド１８３に対して、それぞれ実行モジュール識別子「＃２」、切替フラグ「ｃａｌｌ」が保存されると共に、切替パラメータフィールド１８４に対して切替パラメータとして関数名「ｓｕｂ」および引数「５」が保存される。また、切替履歴領域１１８には呼び出し元アドレスＡｄｄｒ１が、切替履歴領域１２８にはモジュール識別子「＃１」がそれぞれ保存される。モジュール（＃３）５３０の切替履歴領域には何も保存されない。
【０２２３】
さらに、モジュール（＃３）５３０が呼び出されると、セキュア共有領域１８１の実行モジュール識別子フィールド１８２および切替フラグフィールド１８３に対して、それぞれ実行モジュール識別子「＃３」、切替フラグ「ｃａｌｌ」が保存されると共に、切替パラメータフィールド１８４に対して切替パラメータとして関数名「ｈｅｌｌｏ」が保存される。また、切替履歴領域１１８には呼び出し元アドレスＡｄｄｒ１が、切替履歴領域１２８にはモジュール識別子「＃１」および呼び出し元アドレスＡｄｄｒ２が、モジュール（＃３）５３０の切替履歴領域にはモジュール識別子「＃２」が、それぞれ保存される。
【０２２４】
図３３を参照し、モジュール（＃３）５３０において言語例外が発生すると、通常の言語例外と同様に、モジュール（＃３）５３０に含まれる言語例外処理機構８００Ｃに制御を移す。言語例外処理機構８００Ｃは、言語例外が発生した関数から当該言語例外に対応する例外ハンドラを探索する。一例として、言語例外処理機構８００Ｃは、発生した言語例外の型に基づき例外ハンドラを探索することができる。
【０２２５】
図３２の例では、言語例外処理機構８００Ｃは、当該関数から対応する例外ハンドラを見つけることができない。そのため、言語例外処理機構８００Ｃは、関数の巻き戻しを実行してモジュール（＃３）内の呼び出し元関数に戻り、当該呼び出し元関数で例外ハンドラを探索する。この例では、この呼び出し元関数からも例外ハンドラが見つからないため、言語例外処理機構８００Ｃは、モジュール（＃３）５３０の例外通知部に制御を移す。例外通知部５０５は、モジュール（＃３）５３０の呼び出し元であるモジュール（＃２）５２０に戻るための処理を行う。
【０２２６】
図３３において、ステップＳ５０５−１で、モジュール（＃３）５３０の例外通知部は、モジュール（＃３）５３０の切替履歴領域から、呼び出された際に保存しておいた切り替え元（すなわち、巻き戻し先）のモジュールを示すモジュール識別子「＃２」を得る。そして、モジュール（＃３）５３０の切替履歴領域から当該モジュール識別子「＃２」を削除する。
【０２２７】
次のステップＳ５０５−２で、モジュール（＃３）５３０は、セキュア共有領域１８１にある切替フラグフィールド１８３に対して、モジュール（＃２）５２０への切り替えの要因が「言語例外」であることを示すフラグｅｘｃｅｐｔｉｏｎを書く。このフラグｅｘｃｅｐｔｉｏｎは、換言すれば、通常の呼び出しまたは復帰以外を示す値であるといえる。
【０２２８】
次のステップＳ５０５−３で、モジュール（＃３）５３０は、セキュア共有領域１８１の切替パラメータフィールド１８４に対して、言語例外情報ｅｘｃＤａｔａを書く。この言語例外情報ｅｘｃＤａｔａには、言語例外の型や言語例外の内容やメッセージなどが含まれる。すなわち、この言語例外情報ｅｘｃＤａｔａは、切り替えの要因の内容を示す情報である。
【０２２９】
次のステップＳ５０５−４で、モジュール（＃３）５３０は、セキュア共有領域１８１の実行モジュール識別子フィールド１８２に対して、巻き戻し先のモジュールを示すモジュール識別子「＃２」を書く。そして、次のステップＳ５０５−５で、モジュール（＃３）５３０は、再度の呼び出しに備え、切り替え後処理の直前で処理を停止し、スリープ状態となる。
【０２３０】
ステップＳ５０５−５でモジュール（＃３）５３０がスリープ状態になると、実行権がＯＳ１８０に切り替わる。その後、ＯＳ１８０のスケジューラなどによって実行権がモジュール（＃２）５２０に移り、モジュール（＃２）５２０が実行を再開する。
【０２３１】
この時点では、図３５に例示されるように、セキュア共有領域１８１には、例外通知処理で書き込まれた実行モジュール識別子「＃２」、切替フラグ「ｅｘｃｅｐｔｉｏｎ」（図３５では「ｅｘｃ」と略記）、ならびに、切替パラメータ「ｅｘｃＤａｔａ」が保存されている。また、切替履歴領域１１８には呼び出し元アドレスＡｄｄｒ１が、モジュール（＃２）５２０の切替履歴領域１２８には呼び出し元アドレスＡｄｄｒ２とモジュール識別子「＃１」とが、それぞれ保存されている。一方、モジュール（＃３）５３０の切替履歴領域には何も保存されない。
【０２３２】
モジュール（＃２）５２０は、割り込みなどによりモジュール（＃３）５３０の例外通知部からの例外通知を受け取ると、モジュール（＃２）５２０内の例外受付部５０７Ｂに制御を移す。
【０２３３】
図３４において、例外受付部５０７は、セキュア共有領域１８１の実行モジュール識別子フィールド１８２から、実行モジュール識別子を得る（ステップＳ５０７−１）。そして、次ステップＳ５０７−２で、獲得した実行モジュール識別子の値がモジュール（＃２）５２０のモジュール識別子「＃２」と一致するか否かを判定する。若し、一致しないと判定されたら、処理はステップＳ５０７−９に移行され、モジュール（＃２）５２０がスリープ状態とされて、次の呼び出しが待機される。呼び出しがあると、処理がステップＳ５０７−１に戻され、処理が再開される。
【０２３４】
一方、ステップＳ５０７−２で、獲得した実行モジュール識別子の値とモジュール（＃２）５２０のモジュール識別子「＃２」とが一致すると判定されたら、処理はステップＳ５０７−３に移行される。この例では、セキュア共有領域１８１のモジュール識別子フィールド１８２に対して実行モジュール識別子「＃２」が保存されており、これは、モジュール（＃２）５２０のモジュール識別子「＃２」と一致するため、モジュール（＃２）５２０は実行すべきであると判断でき、処理がステップＳ５０７−３に移行される。
【０２３５】
ステップＳ５０７−３で、モジュール（＃２）５２０は、セキュア共有領域１８１の切替フラグフィールド１８３から、切替フラグを取り出し、次のステップＳ５０７−４で、獲得した切替フラグの値が例外を示す値「ｅｘｃｅｐｔｉｏｎ」であるか否かを確認する。
【０２３６】
切替フラグの値が例外を示す値「ｅｘｃｅｐｔｉｏｎ」であることが確認されたら、次のステップＳ５０７−５で、モジュール（＃２）５２０は、切替履歴領域１２８から、保存しておいた呼び出し元アドレスＡｄｄｒ２を獲得し、獲得した呼び出し元アドレスＡｄｄｒ２を切替履歴領域１２８から削除する。
【０２３７】
そして、次のステップＳ５０７−６で、モジュール（＃２）５２０は、セキュア共有領域１８１の切替パラメータフィールド１８４から言語例外情報ｅｘｃＤａｔａを獲得し、獲得した言語例外情報ｅｘｃＤａｔａの値を用いて、呼び出し元アドレスＡｄｄｒ２に対して擬似的に言語例外を発行する。
【０２３８】
言語例外が発行されると、モジュール（＃２）５２０は、モジュール（＃２）５２０に含まれる言語例外処理機構８００Ｂに制御を移す。言語例外処理機構８００Ｂは、モジュール（＃２）５２０内で、発生した言語例外に対応する例外ハンドラの探索を行う。若し、当該例外ハンドラが見つかったら、この例外ハンドラによる処理を実行する。一方、当該例外ハンドルが見つからなかった場合には、関数の巻き戻しを実行する。この例では、言語例外処理機構８００Ｂは、モジュール（＃２）５２０内で当該言語例外に対応する例外ハンドラを見つけることができないため、例外通知部５０５Ｂに制御を移す。
【０２３９】
そして、例外通知部５０５Ｂは、上述した、モジュール（＃３）５３０からモジュール（＃２）５２０に言語例外の発生を通知する場合と同様にして、モジュール（＃２）５２０からモジュール（＃１）５１０に対して言語例外の発生を通知する。言語例外の発生がモジュール（＃１）５１０に通知されると、実行制御がモジュール（＃１）５１０に移され、モジュール（＃１）５１０の例外受付部５０７Ａにおいて、擬似的に言語例外が発行される。
【０２４０】
この時点では、図３５に例示されるように、セキュア共有領域１８１には、例外通知処理で書き込まれた実行モジュール識別子「＃１」、切替フラグ「ｅｘｃｅｐｔｉｏｎ」、ならびに、切替パラメータ「ｅｘｃＤａｔａ」が保存されている。また、各モジュールの切替履歴領域には、何も保存されていない。
【０２４１】
言語例外が発行されると、制御がモジュール（＃１）５１０に含まれる言語例外処理機構８００Ａに移される。言語例外処理機構８００Ａは、上述したようにして、言語例外に対応する例外ハンドラの探索を行う。この探索によって該当する例外ハンドラを見つけると、当該例外ハンドラに制御を移す。
【０２４２】
このように、モジュールの切り替え前後で言語例外用の処理を追加することにより、別々のコンテキストで保護されたモジュール間であって、他のモジュールが直接コンテキストを操作することができなくても、言語例外における関数の巻き戻し処理を実現することができる。
【０２４３】
なお、本第３の実施形態では、例外通知部と切替前処理部とを別々に扱ってきたが、これはこの例に限られず、切替前処理部が例外通知部の機能を含むように構成することもできる。すなわち、切替前処理の内部で、通常呼び出しの場合には通常の切り替え前処理を行い、言語例外による呼び出しの場合には例外通知部の機能による処理を行う。
【０２４４】
同様に、本第３の実施形態では、例外受付部と切替後処理部とを別々に扱ってきたが、これはこの例に限られず、切替後処理部が例外受付部の機能を含むように構成することもできる。すなわち、切替後処理部の内部で、通常呼び出しの場合には通常の切り替え後処理を行い、言語例外による呼び出しの場合には例外受付部の処理を行う。
【０２４５】
また、本第３の実施形態では、各モジュールそれぞれが言語例外処理機構を保持するように説明したが、これはこの例に限定されない。例えば、言語例外処理機構を各モジュール内に保持せずに、モジュールが実行するプラットフォーム内に言語例外処理機構を含んで、各モジュールがそのインスタンスを生成し、実行する形式であってもよい。
【０２４６】
さらに、本第３の実施形態では、例外ハンドラを探索するために各モジュールが擬似的に言語例外を発行して言語例外処理機構を呼び出すように説明したが、これはこの例に限定されない。例えば、各モジュールの例外受付部がｃａｌｌ命令といった命令を用いて明示的に言語例外処理機構を呼び出して実行してもよい。
【０２４７】
＜第４の実施形態＞
次に、本発明の第４の実施形態について説明する。本第４の実施形態では、Ｃライブラリとして提供されている関数ｓｅｔｊｍｐおよび関数ｌｏｎｇｊｍｐに対する処理について説明する。これら関数ｓｅｔｊｍｐおよび関数ｌｏｎｇｊｍｐは、関数の外のジャンプする機構を実現するために設けられたものである。
【０２４８】
図３６は、関数ｓｅｔｊｍｐ／ｌｏｎｇｊｍｐによる一例の動作を模式的に示す。図３６の例では、３のモジュール＃１〜＃３が動作し、モジュール＃１からモジュール＃２、モジュール＃３の順にモジュールを呼び出している。モジュール＃１の実行途中で関数ｓｅｔｊｍｐを行い、モジュール＃３の実行途中で関数ｌｏｎｇｊｍｐを行っている。
【０２４９】
関数ｓｅｔｊｍｐは、関数ｓｅｔｊｍｐが実行された場所でのプログラムカウンタやスタックポインタなどのコンテキスト情報を保持する。関数ｌｏｎｇｊｍｐは、関数ｓｅｔｊｍｐで保存しておいたコンテキスト情報を用いて、関数ｓｅｔｊｍｐを実行した直前の状態に戻る。図３６の例では、関数ｓｅｔｊｍｐでモジュール＃１における当該関数ｓｅｔｊｍｐが実行される直前の状態を保存し、関数ｌｏｎｇｊｍｐでモジュール＃３からモジュール＃１に戻り、モジュール＃１の状態を復元する。このように、関数の外にジャンプする機構は、戻り先のコンテキスト情報を獲得し、現在のコンテキストをそのコンテキスト情報で上書きすることにより実現される。
【０２５０】
本発明の前提であるセキュアプロセッサにおいては、図３を用いて説明したように、各モジュールが別々にスタック（コンテキスト）を管理しているため、このような、モジュールを跨って関数外へのジャンプを行う機構が正しく動作しない。
【０２５１】
この点についてより具体的に説明する。モジュール内で関数ｓｅｔｊｍｐ／ｌｏｎｇｊｍｐを行う場合であれば、従来通り、関数ｓｅｔｊｍｐでコンテキスト情報を獲得し、関数ｌｏｎｇｊｍｐで当該コンテキストに切り替えることができる。一方、複数モジュールを跨いで関数ｓｅｔｊｍｐ／ｌｏｎｇｊｍｐを行う場合には、モジュール間で別々にコンテキストが管理されていると、あるモジュールとは別のモジュールのコンテキストを、直接的に上書きすることができない。したがって、モジュールで別々にコンテキスト管理することを前提とした場合、関数ｓｅｔｊｍｐで得たコンテキストに切り替えることができない場合がある。
【０２５２】
また、モジュールが個別にコンテキストを管理するため、関数ｌｏｎｇｊｍｐのようにコンテキストを切り替える場合には、関数ｓｅｔｊｍｐを実行したモジュールから関数ｌｏｎｇｊｍｐを実行するまでに呼び出したモジュールの全てに対して、コンテキストを関数ｓｅｔｊｍｐを実行する前の状態に戻す必要がある。これは、若し、関数ｓｅｔｊｍｐを実行したモジュールのコンテキストのみを関数ｌｏｎｇｊｍｐによって変更した場合、それ以外のモジュールは、関数ｌｏｎｇｊｍｐしたときの状態のコンテキストままとなるからである。
【０２５３】
本第４の実施形態は、コンテキストを別々に管理するモジュール間で関数ｓｅｔｊｍｐ／ｌｏｎｇｊｍｐを実現する。本第４の実施形態では、モジュール識別子と、コンテキスト毎にユニークなコンテキスト番号とによってコンテキスト情報を管理し、モジュール間でのコンテキスト情報の直接的なやり取りを行わない。コンテキスト情報には、他のモジュールには秘匿すべき情報が含まれている可能性が多いため、その代わりとなるモジュール識別子とコンテキスト番号とを利用する。
【０２５４】
セキュアプロセッサを用いる本第４の実施形態では、関数ｓｅｔｊｍｐに相当するコンテキスト登録処理により、現在のコンテキスト情報を登録してコンテキスト情報を示すコンテキスト番号を取得する。関数ｌｏｎｇｊｍｐに相当するコンテキスト設定処理により、モジュール識別子およびコンテキスト番号を指定して、登録されたコンテキスト情報におけるコンテキストを設定する。
【０２５５】
図３７は、本発明の第４の実施形態によるモジュール構成の一例の機能ブロック図を示す。なお、図３７において、上述した図１の構成と共通する部分には同一の符号を付し、詳細な説明を省略する。なお、セキュアプロセッサを含むハードウェアの構成は、図１で説明した構成をそのまま適用できるので、ここでの説明を省略する。
【０２５６】
図３７において、モジュール（＃１）９１０およびモジュール（＃２）９２０は、それぞれ本第４の実施形態によるモジュール切り替え機構を備える。ここでは、モジュール（＃１）９１０がアプリケーションモジュールであり、モジュール（＃２）９２０がライブラリモジュールであるものとする。モジュール（＃１）９１０およびモジュール（＃２）９２０は、後述するモジュール（＃３）９３０と共に、互いに協働して動作する。
【０２５７】
モジュール（＃１）９１０は、上述の図４の構成と同様に初期化処理部１１１、プログラム（＃１）本体９１２、切替前処理部１０４Ａおよび切替履歴領域１１８を備えると共に、図４の切替後処理部１０６Ａとは部分的に異なる処理を行う切替後処理部９０６Ａを備える。モジュール（＃１）９１０は、さらに、コンテキスト変更通知部９０５Ａ、コンテキスト変更受付部９０７Ａおよびコンテキスト管理テーブル９１９を備える。
【０２５８】
同様に、モジュール（＃２）９２０は、初期化処理部１２１、プログラム（＃１）本体９２２、切替前処理部１０４Ｂおよび切替履歴領域１２８を備えると共に、図４の切替後処理部１０６Ｂとは部分的に異なる処理を行う切替後処理部９０６Ｂを備える。モジュール（＃１）９１０は、さらに、コンテキスト管理テーブル９２９を備えると共に、モジュール（＃１）９１０のコンテキスト変更通知部９０５Ａおよびコンテキスト変更受付部９０７Ａと共通の処理を行うコンテキスト変更通知部９０５Ｂおよびコンテキスト変更受付部９０７Ｂを備える。
【０２５９】
また、アプリケーションモジュールであるプログラム（＃１）本体９１２は、コンテキスト登録部９０８およびコンテキスト設定部９０９Ａを含む。一方、ライブラリモジュールであるモジュール（＃２）９２０は、コンテキスト設定部０９０Ｂを含み、コンテキスト登録部９０８を含まない。これは、ライブラリモジュールであるモジュール（＃３）９３０においても同様である。コンテキスト登録部９０８は、関数ｓｅｔｊｍｐに相当する。コンテキスト設定部９０９Ａは、関数ｌｏｎｇｊｍｐに相当する。
【０２６０】
また、図３７では詳細を省略しているが、モジュール（＃３）９３０も、モジュール（＃１）９１０およびモジュール（＃２）９２０と同様の構成を備える。モジュール（＃１）９１０、モジュール（＃２）９２０およびモジュール（＃３）９３０は、メモリ２８０上にセキュア共有領域１８１を共有する。
【０２６１】
図３８は、コンテキスト管理テーブル９１９および９２９、ならびに、モジュール（＃３）９３０の図示されないコンテキスト管理テーブルの一例のデータ構成を示す。以下では、特に記載のない限り、コンテキスト管理テーブル９１９および９２９、ならびに、モジュール（＃３）９３０の図示されないコンテキスト管理テーブルを、コンテキスト管理テーブルで代表させて説明する。
【０２６２】
コンテキスト管理テーブルは、コンテキスト番号を示すインデクスが「＃１」から「＃ｎ」までのｎ個のエントリを有する。各エントリは、モジュール識別子フィールドおよびコンテキスト情報フィールドを有する。コンテキスト情報フィールドは、コンテキスト情報としてプログラムカウンタやスタックポインタなどが格納される。
【０２６３】
図３９〜図４４を用いて、本第４の実施形態による、コンテキストの登録／設定を行う際の処理について説明する。ここでは、モジュール（＃１）９１０でコンテキスト登録を実行し、モジュール（＃１）９１０からモジュール（＃２）９２０を呼び出し、さらにモジュール（＃２）９２０からモジュール（＃３）９３０を呼び出す。そして、モジュール（＃３）９３０でコンテキスト設定を実行する例について説明する。なお、各モジュールの初期化処理については、図７および図８を用いて説明した第１の実施形態による処理と同様なので、ここでの詳細な説明を省略する。
【０２６４】
図３９は、上述した図１１に対応し、コンテキスト登録／設定の実行に伴うセキュア共有領域１８１、ならびに、各モジュール（＃１）９１０、モジュール（＃２）９２０およびモジュール（＃３）９３０の切替履歴領域の状態の変化を概略的に示す。初期化処理が終了した時点では、セキュア共有領域１８１において実行モジュール識別子フィールド１８２に対して実行モジュール識別子「＃１」が保存され、切替フラグフィールド１８３および切替パラメータフィールド１８４には、何も保存されていない。また、各モジュール（＃１）９１０、モジュール（＃２）９２０およびモジュール（＃３）９３０それぞれの切替履歴領域にも、何も保存されていない。
【０２６５】
コンテキスト登録処理について説明する。図４０は、本第４の実施形態による一例のコンテキスト登録処理を示すフローチャートである。モジュール（＃１）９１０においてプログラム（＃１）本体９１２が実行開始され、関数ｓｅｔｊｍｐ相当の処理を行うため、モジュール（＃１）９１０は、コンテキスト登録部９０８に制御を移す。コンテキスト登録部９０８は、ステップＳ９０８−１で、一般的な関数ｓｅｔｊｍｐと同様に、現在のコンテキスト情報Ｃを取得する。
【０２６６】
次のステップＳ９０８−２で、コンテキスト登録部９０８は、コンテキスト管理テーブル９１９内の空いているエントリのコンテキスト番号「＃ｍ」を決定する。決定されたコンテキスト番号「＃ｍ」は、モジュール（＃１）９１０に返される。そして、コンテキスト登録部９０８は、ステップＳ９０８−１で取得したコンテキスト情報Ｃを、コンテキスト管理テーブル９１９の当該コンテキスト番号「＃ｍ」のエントリにおけるコンテキスト情報フィールドに保存する。
【０２６７】
なお、一般的な関数ｓｅｔｊｍｐ／ｌｏｎｇｊｍｐでは、他のモジュールに対して直接的にコンテキストを渡す。これに対して、本第４の実施形態では、コンテキスト管理テーブルによってコンテキストを管理し、他のモジュールには、コンテキスト設定情報を渡す。ここでいうコンテキスト設定情報とは、コンテキスト情報をコンテキスト管理テーブルに登録した際の、当該コンテキストが由来するモジュールを識別するモジュール識別子と、コンテキスト登録部９０８が決定したコンテスト番号とを指す。
【０２６８】
本第４の実施形態では、各モジュールがコンテキストを設定するときは、コンテキスト情報を直接的に指定するのではなく、コンテキスト設定情報を指定する。
【０２６９】
次に、モジュールの呼び出し処理について説明する。モジュール（＃１）９１０においてコンテキストの登録が終了された後、モジュール（＃１）９１０からモジュール（＃２）９２０を呼び出し、さらに、モジュール（＃２）９２０からモジュール（＃３）９３０を呼び出す。切替前処理部１０４Ａによる処理は、図９を用いて説明した処理と同様であるので、ここでの詳細な説明を省略する。
【０２７０】
切り替え前処理により、呼び出し元のアドレスＡｄｄｒ１と、呼び出し処理を示す切替フラグ「ｃａｌｌ」と、実行モジュールを示す実行モジュール識別子「＃２」とが、セキュア共有領域１８１も呼び出し元アドレスフィールドＡｄｄｒ１、切替フラグフィールド１８３および実行モジュール識別子フィールド１８２に対してそれぞれ書き込まれる。
【０２７１】
切替パラメータとして、呼び出し先の関数の関数名「ｓｕｂ」と引数「５」とがセキュア共有領域１８１の切替パラメーラフィールド１８３に対して書き込まれる。本第４の実施形態においては、さらに、コンテキスト設定情報、すなわち、コンテキスト登録が実行されたモジュールを示すモジュール識別子「＃１」と、コンテキスト番号「＃ｍ」とが、セキュア共有領域１８１の切替パラメーラフィールド１８３に対して書き込まれる。これにより、呼び出し先のモジュールにおいてコンテキスト設定が実行可能となる。
【０２７２】
これらモジュール識別子「＃１」およびコンテキスト番号「＃ｍ」は、切り替え前処理および切り替え後処理により、呼び出し先のモジュールに対して順次、渡される。
【０２７３】
図４１は、本第４の実施形態による切り替え後処理を示す一例のフローチャートである。なお、図４１において、上述した図１０と共通する処理については同一の符号を付し、詳細な説明を省略する。モジュール（＃１）９１０からモジュール（＃２）９２０が呼び出されると、モジュール（＃２）９２０の切替後処理部９０６Ｂは、セキュア共有領域１８１の実行モジュール識別子フィールド１８２の値が「＃２」であることを確認する（ステップＳ１０６−１、ステップＳ１０６−２）。
【０２７４】
次に、切替後処理部１０６Ｂは、セキュア共有領域１８１の切替フラグフィールド１８３から切替フラグを得る（ステップＳ１０６−３）。切替後処理部１０６Ｂは、獲得した値「ｃａｌｌ」から、関数呼び出しが要求されていることが分かる（ステップＳ１０６−４）。そして、切替後処理部１０６Ｂは、ステップＳ１０６−５で切替元モジュール識別子フィールド１８５からモジュール識別子「＃１」を取り出し、切替履歴領域１１８に保存する。
【０２７５】
次のステップＳ１０６−６で、切替後処理部１０６Ｂは、セキュア共有領域１８１の切替パラメータフィールド１８４から、呼び出し情報として書き込まれた関数名「ｓｕｂ」と、引数「５」とを得ると共に、コンテキスト登録処理が実行されたモジュールを示すモジュール識別子「＃１」とコンテキスト番号「＃ｍ」とを得る。
【０２７６】
次のステップＳ９０６−７で、切替後処理部９０６Ｂは、取得した切替パラメータがコンテキスト設定情報を含むか否かを判定する。若し、含まないと判定されたら、処理はステップＳ９０６−９に移行される。一方、含むと判定されたら、処理はステップＳ９０６−８に移行される。ステップＳ９０６−８で、切替後処理部９０６Ｂは、図４１のステップＳ１０６−６で取得された切替パラメータのうち、コンテキスト設定情報に含まれる各情報を、コンテキスト管理テーブル９２９に保存する。
【０２７７】
より具体的には、ステップＳ９０６−８において、コンテキスト設定情報に含まれるモジュール識別子およびコンテキスト番号がコンテキスト管理テーブル９２９に保存される。それと共に、後述するコンテキスト設定処理により呼び出し元のモジュールに戻るためのコンテキスト情報を、コンテキスト管理テーブル９２９のコンテキスト情報フィールドに保存する。このコンテキスト情報は、後述するコンテキスト変更通知処理により用いられる。
【０２７８】
この時点では、図３９に例示されるように、セキュア共有領域１８１には、切り替え前処理で書き込まれた実行モジュール識別子「＃２」および切替フラグ「ｃａｌｌ」が保存されている。それと共に、セキュア共有領域１８１には、切替パラメータとして、関数名「ｓｕｂ」および引数「５」、ならびに、モジュール識別子「＃１」およびコンテキスト番号「＃ｍ」が保存されている。また、モジュール（＃１）９１０の切替履歴領域１１８には呼び出し元アドレスＡｄｄｒ１が保存され、モジュール（＃２）９２０の切替履歴領域１２８にはモジュール識別子「＃１」が保存されている。
【０２７９】
次のステップＳ９０６−９で、切替後処理部９０６Ｂは、上述のステップＳ１０６−６で取得した切替パラメータのうち、呼び出し先の関数名「ｓｕｂ」と引数「５」に基づき、プログラム（＃２）本体１２２における関数「ｓｕｂ」の実行を開始させる。
【０２８０】
モジュール（＃２）９２０からモジュール（＃３）９３０を呼び出す際にも、同様の処理を行う。モジュール（＃３）９３０の呼び出しまで完了すると、モジュール（＃１）９１０、モジュール（＃２）９２０およびモジュール（＃３）９３０それぞれのコンテキスト管理テーブルは、モジュール識別子「＃１」、コンテキスト番号「＃ｍ」のエントリが含まれる状態になる。
【０２８１】
また、コンテキスト管理テーブル９１９には、図４０に示した処理に従いコンテキスト登録を行った時点のコンテキスト情報が保存される。さらに、コンテキスト管理テーブル９２９およびモジュール（＃３）９３０のコンテキスト管理テーブルには、それぞれが呼び出し元のモジュールに戻るためのコンテキスト情報が含まれる。
【０２８２】
この時点では、図３９に例示されるように、セキュア共有領域１８１には、切り替え前処理で書き込まれた実行モジュール識別子「＃３」および切替フラグ「ｃａｌｌ」が保存されている。それと共に、セキュア共有領域１８１には、切替パラメータとして、関数名「ｈｅｌｌｏ」、ならびに、モジュール識別子「＃１」およびコンテキスト番号「＃ｍ」が保存されている。また、モジュール（＃２）９２０の切替履歴領域１２８には、モジュール識別子「＃１」および呼び出し元アドレスＡｄｄｒ２が保存される。モジュール（＃３）９３０の切替履歴領域には、モジュール識別子「＃２」が保存されている。モジュール（＃１）９１０の切替履歴領域１１８には、呼び出し元アドレスＡｄｄｒ１が保存される。
【０２８３】
次に、コンテキスト設定処理について説明する。この例では、図３６に例示されるように、モジュール（＃３）９３０においてコンテキスト設定処理が実行される。
【０２８４】
図４２は、第４の実施形態による一例のコンテキスト設定処理を示すフローチャートである。ステップＳ９０９−１で、モジュール（＃３）９３０のコンテキスト設定部は、図４１のステップＳ１０６−５でセキュア共有領域１８１から取得した切替パラメータ中の、コンテキスト設定情報に含まれるモジュール識別子「＃１」およびコンテキスト番号「＃ｍ」に基づき、モジュール（＃３）９３０のコンテキスト管理テーブルを参照する。そして、これらモジュール識別子「＃１」およびコンテキスト番号「＃ｍ」に対応するコンテキスト情報を取得する。それと共に、当該コンテキスト情報を、コンテキスト管理テーブルから削除する。
【０２８５】
次のステップＳ９０９−２で、モジュール（＃３）９３０のコンテキスト設定部は、ステップＳ９０９−１で取得したコンテキスト情報を、モジュール（＃３）９３０における現在のコンテキスト情報に対して上書きする。この場合、ステップＳ９０９−１で取得したコンテキスト情報は、モジュール（＃３）９３０の呼び出し元であるモジュール（＃２）９２０に戻るためのものである。そのため、モジュール（＃３）９３０は、モジュール（＃３）９３０のコンテキスト変更通知部に制御を移す。
【０２８６】
図４３は、第４の実施形態による一例のコンテキスト変更通知処理を示すフローチャートである。ステップＳ９０５−１で、コンテキスト変更通知部は、モジュール（＃３）９３０の切替履歴領域から、モジュール（＃２）９２０から呼び出された際に保存しておいた呼び出し元のモジュールを示すモジュール識別子「＃２」を取り出し、当該切替履歴領域から、獲得したモジュール識別子を削除する。
【０２８７】
次のステップＳ９０５−２で、モジュール（＃３）９３０のコンテキスト変更通知部は、セキュア共有領域１８１の切替フラグフィールド１８３に対し、モジュール切替の要因が「コンテキスト設定」であることを示す切替フラグ「Ｌｊ」を書く。この切替フラグ「Ｌｊ」は、換言すれば、通常の呼び出し、呼び出し復帰または言語例外以外を示す値といえる。さらに、コンテキスト変更通知部は、ステップＳ９０５−３で、切替パラメータフィールド１８４に対して、モジュール識別子「＃１」とコンテキスト番号「＃ｍ」とを、コンテキスト設定情報として書く。このコンテキスト設定情報は、換言すれば、モジュール切替の要因を示す情報といえる。
【０２８８】
次のステップＳ９０５−４で、モジュール（＃３）９３０のコンテキスト変更通知部は、セキュア共有領域１８１の実行モジュール識別子フィールド１８２に対し、呼び出し元のモジュールを示すモジュール識別子「＃２」を書く。さらに、モジュール（＃３）９３０のコンテキスト変更通知部は、ステップＳ９０５−６で、モジュール（＃３）９３０をスリープ状態とする。切り替え後処理の直前でスリープ状態として処理を停止させることで、再度の呼び出しに備える。
【０２８９】
この時点では、図３９に例示されるように、セキュア共有領域１８１には、コンテキスト変更通知処理で書き込まれた実行モジュール識別子「＃２」、切替フラグ「Ｌｊ」が保存されていると共に、切替パラメータとしてモジュール識別子「＃１」とコンテキスト番号「＃ｍ」とが保存されている。また、モジュール（＃１）９１０の切替履歴領域１１８には呼び出し元アドレスＡｄｄｒ１が、モジュール（＃２）９２０の切替履歴領域１２８には呼び出し元アドレスＡｄｄｒ２が、それぞれ保存されている。一方、モジュール（＃３）９３０の切替履歴領域には、何も保存されていない。
【０２９０】
ステップＳ９０５−５でモジュール（＃３）９３０がスリープ状態となると、実行権がＯＳに切り替わる。その後、ＯＳのスケジューラなどによって実行権がモジュール（＃２）９２０に移り、モジュール（＃２）９２０が実行を再開する。モジュール（＃２）９２０は、実行が再開され呼び出し元のモジュール（＃３）９３０のコンテキスト変更通知部から変更通知を受けとると、制御をコンテキスト変更受付部９０７Ｂに移す。
【０２９１】
図４４は、第４の実施形態による一例のコンテキスト変更受付処理を示すフローチャートである。コンテキスト変更受付部９０７Ｂは、ステップＳ９０７−１で、セキュア共有領域１８１の実行モジュール識別子フィールド１８２から実行モジュール識別子を得る。次のステップＳ９０７−２で、コンテキスト変更受付部９０７Ｂは、獲得した実行モジュール識別子の値が、モジュール（＃２）９２０のモジュール識別子「＃２」と一致するか否かを判定する。もし、一致しないと判定されたら、処理はステップＳ９０７−９に移行され、モジュール（＃２）９２０がスリープ状態とされて、次の呼び出しが待機される。呼び出しがあると、処理がステップＳ９０７−１に戻され、処理が再開される。
【０２９２】
一方、ステップＳ９０７−２で、獲得した実行モジュール識別子の値とモジュール（＃２）９２０のモジュール識別子「＃２」とが一致すると判定されたら、処理はステップＳ９０７−３に移行される。この例では、セキュア共有領域１８１のモジュール識別子フィールド１８２に対して実行モジュール識別子「＃２」が保存されており、これは、モジュール（＃２）９２０のモジュール識別子「＃２」と一致する。したがって、モジュール（＃２）９２０を実行すべきであると判断でき、処理がステップＳ９０７−３に移行される。
【０２９３】
ステップＳ９０７−３で、コンテキスト変更受付部９０７Ｂは、セキュア共有領域１８１の切替フラグフィールド１８３から切替フラグを取り出し、次のステップＳ９０７−４で、獲得した切替フラグの値がモジュール切替の要因が「コンテキスト設定」であることを示す値「Ｌｊ」であるか否かを確認する。切替フラグの値が値「Ｌｊ」であることが確認されたら、処理はステップＳ９０７−５に移行される。
【０２９４】
ステップＳ９０７−５で、コンテキスト変更受付部９０７Ｂは、セキュア共有領域１８１の切替パラメータフィールド１８４からコンテキスト設定情報を取得する。その後、コンテキスト設定部９０９Ｂに制御を移す。
【０２９５】
図４２を参照し、ステップＳ９０９−１で、コンテキスト設定部９０９Ｂは、セキュア共有領域１８１に保存される切替パラメータ中の、コンテキスト設定情報に含まれるモジュール識別子「＃１」およびコンテキスト番号「＃ｍ」に基づき、コンテキスト管理テーブル９２９を参照する。そして、これらモジュール識別子「＃１」およびコンテキスト番号「＃ｍ」に対応するコンテキスト情報を取得する。それと共に、当該コンテキスト情報を、コンテキスト管理テーブルから削除する。
【０２９６】
次のステップＳ９０９−２で、モジュール（＃２）９２０は、ステップＳ９０９−１で取得したコンテキスト情報がモジュール（＃２）９２０の呼び出し元であるモジュール（＃１）９１０に戻るための情報であるため、コンテキスト設定部９０９Ｂからコンテキスト変更通知部９０５Ｂに制御を移す。
【０２９７】
図４３を参照し、コンテキスト変更通知部９０５Ｂは、上述したモジュール（＃３）９３０のコンテキスト変更通知部による処理と同様の処理を行い、セキュア共有領域１８１の切替フラグフィールド１８３に対して切替フラグ「Ｌｊ」を、切替パラメータフィールド１８４に対してモジュール識別子「＃１」とコンテキスト番号「＃ｍ」とを、実行モジュール識別子フィールド１８２に対して、呼び出し元のモジュールを示すモジュール識別子「＃１」を、それぞれ書く。そして、コンテキスト変更通知部９０５Ｂは、モジュール（＃２）９２０をスリープ状態とする（図４３のステップＳ９０５−１〜ステップＳ９０５−６参照）。
【０２９８】
この時点では、図３９に例示されるように、セキュア共有領域１８１には、コンテキスト変更通知処理で書き込まれた実行モジュール識別子「＃１」、切替フラグ「Ｌｊ」が保存されていると共に、切替パラメータとしてモジュール識別子「＃１」とコンテキスト番号「＃ｍ」とが保存されている。また、モジュール（＃１）９１０の切替履歴領域１１８には呼び出し元アドレスＡｄｄｒ１が保存されている。一方、他のモジュールの切替履歴領域には、何も保存されていない。
【０２９９】
モジュール（＃２）９２０がスリープ状態となると、実行権がＯＳに切り替わる。その後、ＯＳのスケジューラなどによって実行権がモジュール（＃１）９１０に移り、モジュール（＃１）９１０が実行を再開する。モジュール（＃１）９１０は、実行が再開され呼び出し元のモジュール（＃２）９２０のコンテキスト変更通知部から変更通知を受けとると、制御をコンテキスト変更受付部９０７Ａに移す。
【０３００】
コンテキスト変更受付部９０７Ａは、上述したモジュール（＃２）９２０のコンテキスト変更受付部９０７Ｂと同様の処理を行う。図４４を参照し、コンテキスト変更受付部９０７Ａは、セキュア共有領域１８１の実行モジュール識別子フィールド１８２の値が「＃１」であることを確認する（ステップＳ９０７−１、ステップＳ９０７−２）。
【０３０１】
次に、コンテキスト変更受付部９０７Ｂは、セキュア共有領域１８１の切替フラグフィールド１８３から切替フラグを獲得し、獲得した切替フラグの値がモジュール切替の要因が「コンテキスト設定」であることを示す値「Ｌｊ」であることを確認する（ステップＳ９０７−３、ステップＳ９０７−４）。
【０３０２】
次のステップＳ９０７−５で、コンテキスト変更受付部９０７Ａは、セキュア共有領域１８１の切替パラメータフィールド１８４から切替パラメータに含まれるコンテキスト設定情報を得て、コンテキスト設定情報からモジュール識別子とコンテキスト番号とを獲得する。そして、コンテキスト設定情報から獲得したモジュール識別子とコンテキスト番号とを指定して、コンテキスト設定部９０９Ａに制御を移す。
【０３０３】
図４２を参照し、ステップＳ９０９−１で、コンテキスト設定部９０Ａは、セキュア共有領域１８１に保存される切替パラメータ中の、コンテキスト設定情報に含まれるモジュール識別子「＃１」およびコンテキスト番号「＃ｍ」に基づきコンテキスト管理テーブル９１９を参照する。そして、コンテキスト管理テーブル９１９から、これらモジュール識別子「＃１」およびコンテキスト番号「＃ｍ」に対応するコンテキスト情報を取得し、当該コンテキスト情報を、コンテキスト管理テーブルから削除する。
【０３０４】
ステップＳ９０９−１で取得したコンテキスト情報は、モジュール(＃１)９１０内でコンテキスト登録処理によりコンテキストを登録した場所のものである。そのため、次のステップＳ９０９−２で、モジュール(＃１)９１０は、実行位置がコンテキスト登録処理で登録された場所まで戻り、実行を再開する。
【０３０５】
このように、コンテキスト登録を行ったモジュールでは、コンテキスト登録した時点でのコンテキスト情報を保存しておく。また、コンテキスト登録を行った以外のモジュールでは、コンテキスト設定のための値を書いて、呼び出し元に実行を切り替える際の切り替え前処理におけるコンテキスト情報を保存する。これにより、コンテキスト設定で戻るときには、コンテキスト管理テーブルに保存されるコンテキスト情報で上書きし続けるだけで、コンテキストを登録した場所に戻れることが可能とされる。
【０３０６】
なお、本第４の実施形態では、コンテキスト変更通知部と切替前処理部とを別々に扱ってきたが、これはこの例に限られず、切替前処理部がコンテキスト変更通知部の機能を含むように構成することもできる。すなわち、切替処理部の内部で、通常呼び出しの場合には通常の切り替え前処理を行い、コンテキスト設定であればコンテキスト変更通知部の機能による処理を行う。
【０３０７】
同様に、本第４の実施形態では、コンテキスト変更受付部と切替後処理部とを別々に扱ってきたが、これはこの例に限定されず、切替後処理部がコンテキスト変更受付部の機能を含むように構成することもできる。すなわち、切替後処理部の内部で、通常呼び出しの場合には通常の切り替え後処理を行い、コンテキスト設定であればコンテキスト変更受付部の機能による処理を行う。
【０３０８】
また、本第４の実施形態では、コンテキスト管理テーブルをモジュール単位で保持するように説明したが、これはこの例に限定されない。例えば、セキュア共有領域と同じように、連携するモジュール間で共有する領域にコンテキスト管理テーブルを設けることも可能である。さらに、本第４の実施形態では、モジュール識別子とコンテキスト番号によりコンテキスト情報を管理しているが、これはこの例に限定されない。すなわち、モジュール識別子とコンテキスト番号は、モジュール間でユニークな値を１つ持つ方法であってもよい。
【０３０９】
＜第５の実施形態＞
次に、本発明の第５の実施形態について説明する。本第５の実施形態は、上述した第４の実施形態の、Ｃライブラリとして提供されている関数ｓｅｔｊｍｐおよび関数ｌｏｎｇｊｍｐに対する処理についての変形例である。ここでは、上述と同様に、アプリケーションモジュールであるモジュール＃１でコンテキストを登録し、それぞれライブラリモジュールであるモジュール＃２を経由して、モジュール＃３でコンテキストを設定する場合を例に説明する。
【０３１０】
本第５の実施形態では、上述の第４の実施形態と同様に、モジュール識別子とコンテキスト番号とによりコンテキスト情報を管理する。また、本第５の実施形態では、関数ｓｅｔｊｍｐ相当のコンテキスト登録処理により、コンテキスト情報を示すコンテキスト番号を取得し、関数ｌｏｎｇｊｍｐ相当のコンテキスト設定処理により、モジュール識別子およびコンテキスト番号を指定して、コンテキストを切り替える。
【０３１１】
図４５は、本発明の第５の実施形態によるモジュール構成の一例の機能ブロック図を示す。なお、図４５において、上述した図３７の構成と共通する部分には同一の符号を付し、詳細な説明を省略する。なお、セキュアプロセッサを含むハードウェアの構成は、図１で説明した構成をそのまま適用できるので、ここでの説明を省略する。
【０３１２】
図４５において、モジュール（＃１）７１０およびモジュール（＃２）７２０は、それぞれ本第５の実施形態によるモジュール切り替え機構を備える。ここでは、モジュール（＃１）７１０がアプリケーションモジュールであり、モジュール（＃２）７２０がライブラリモジュールであるものとする。モジュール（＃１）７１０およびモジュール（＃２）７２０は、後述するモジュール（＃３）７３０と共に、互いに協働して動作する。
【０３１３】
モジュール（＃１）７１０は、初期化処理部１１１、プログラム（＃１）本体７１２、切替前処理部１０４Ａ、切替後処理部７０６Ａ、切替履歴領域１１８、コンテキスト変更通知部９０５Ａ、コンテキスト変更受付部  ９０７Ａおよびコンテキスト管理テーブル７１９を備える。また、プログラム（＃１）本体７１２は、コンテキスト登録部９０８およびコンテキスト設定部７０２Ａを備える。コンテキスト登録部９０８は、関数ｓｅｔｊｍｐに相当し、コンテキスト設定部７０２Ａは、関数ｌｏｎｇｊｍｐに相当する。
【０３１４】
これらのうち、コンテキスト設定部７０２Ａおよびコンテキスト管理テーブル７１９は、図３７を用いて説明した、第４の実施形態におけるコンテキスト設定部９０２Ａおよびコンテキスト管理テーブル９１９にそれぞれ対応し、一部の機能が異なる。
【０３１５】
同様に、モジュール（＃２）７２０は、初期化処理部１２１、プログラム（＃１）本体７２２、切替前処理部１０４Ｂ、切替後処理部１０６Ｂ、切替履歴領域１２８、コンテキスト変更通知部９０５Ｂ、コンテキスト変更受付部９０７Ｂおよびコンテキスト管理テーブル７２９を備える。また、プログラム（＃１）本体７２２は、コンテキスト設定部７０２Ｂを備える。コンテキスト設定部７０２Ｂは、関数ｌｏｎｇｊｍｐに相当する。
【０３１６】
上述のモジュール（＃１）７１０と同様に、これらのうち、コンテキスト設定部７０２Ｂおよびコンテキスト管理テーブル７２９は、図３７を用いて説明した、第４の実施形態におけるコンテキスト設定部９０２Ｂおよびコンテキスト管理テーブル９２９にそれぞれ対応し、一部の機能が異なる。
【０３１７】
また、図４５では詳細を省略しているが、モジュール（＃３）７３０も、モジュール（＃２）７２０と同様の構成を備え、プログラム（＃３）本体がコンテキスト設定部を有する（図示しない）。モジュール（＃１）７１０、モジュール（＃２）７２０およびモジュール（＃３）７３０は、メモリ２８０上に例えば領域Ｓｈ＿ｍｅｍ１としてセキュア共有領域１８１を共有する。
【０３１８】
図４６は、コンテキスト管理テーブル７１９および７２９、ならびに、モジュール（＃３）７３０の図示されないコンテキスト管理テーブルの一例のデータ構成を示す。以下では、特に記載のない限り、コンテキスト管理テーブル７１９および７２９、ならびに、モジュール（＃３）７３０の図示されないコンテキスト管理テーブルを、コンテキスト管理テーブルで代表させて説明する。
【０３１９】
コンテキスト管理テーブルは、コンテキスト番号を示すインデクスが「＃１」から「＃ｎ」までのｎ個のエントリを有する。各エントリは、コンテキスト情報フィールドを有する。コンテキスト情報フィールドは、コンテキスト情報としてプログラムカウンタやスタックポインタなどが格納される。
【０３２０】
図４３、図４４、図４７および図４８を用いて、本第５の実施形態による、コンテキスト登録／設定を行う際の処理について説明する。ここでは、モジュール（＃１）７１０でコンテキスト登録を実行し、モジュール（＃１）７１０からモジュール（＃２）７２０を呼び出し、さらにモジュール（＃２）７２０からモジュール（＃３）７３０を呼び出す。そして、モジュール（＃３）７３０でコンテキスト設定を実行する例について説明する。なお、各モジュールの初期化処理については、図７および図８を用いて説明した第１の実施形態による処理と同様なので、ここでの詳細な説明を省略する。
【０３２１】
図４７は、上述した図１１に対応し、コンテキスト登録／設定の実行に伴うセキュア共有領域１８１、ならびに、各モジュール（＃１）７１０、モジュール（＃２）７２０およびモジュール（＃３）７３０の切替履歴領域の状態の変化を概略的に示す。初期化処理が終了した時点では、セキュア共有領域１８１において実行モジュール識別子フィールド１８２に対して実行モジュール識別子「＃１」が保存され、切替フラグフィールド１８３および切替パラメータフィールド１８４には、何も保存されていない。また、各モジュール（＃１）７１０、モジュール（＃２）７２０およびモジュール（＃３）７３０それぞれの切替履歴領域には、何も保存されていない。
【０３２２】
先ず、アプリケーションモジュールであるモジュール（＃１）７１０においてコンテキストの登録処理が行われる。このコンテキスト登録処理は、図４０を用いて説明した、第４の実施形態によるコンテキスト登録処理と同一の手順により行われる。このとき、コンテキスト管理テーブル７１９のエントリ（＃ｍ）に対して、コンテキスト登録処理を実行した際のコンテキストが登録される。
【０３２３】
モジュール（＃１）７１０においてコンテキストの登録が終了された後、モジュール（＃１）７１０からモジュール（＃２）７２０を呼び出し、さらに、モジュール（＃２）７２０からモジュール（＃３）７３０を呼び出す。モジュール（＃１）７１０からモジュール（＃２）７２０を呼び出す際の切替前処理部１０４Ａによる処理、ならびに、モジュール（＃２）７２０からモジュール（＃３）７３０を呼び出す際の切替前処理部１０４Ｂによる処理は、図７を用いて説明した処理と同様であるので、ここでの詳細な説明を省略する。
【０３２４】
切り替え前処理により、呼び出し元のアドレスＡｄｄｒ１と、呼び出し処理を示す切替フラグ「ｃａｌｌ」と、実行モジュールを示す実行モジュール識別子「＃２」とが、セキュア共有領域１８１も呼び出し元アドレスフィールドＡｄｄｒ１、切替フラグフィールド１８３および実行モジュール識別子フィールド１８２に対してそれぞれ書き込まれる。
【０３２５】
切替パラメータとして、呼び出し先の関数の関数名「ｓｕｂ」と引数「５」とがセキュア共有領域１８１も切替パラメーラフィールド１８３に対して書く。本第５の実施形態においては、さらに、コンテキスト設定情報、すなわち、コンテキスト登録が実行されたモジュールを示すモジュール識別子「＃１」と、コンテキスト番号「＃ｍ」とが、セキュア共有領域１８１の切替パラメーラフィールド１８３に対して書き込まれる。これにより、呼び出し先のモジュールにおいてコンテキスト設定が実行可能となる。
【０３２６】
これらモジュール識別子「＃１」およびコンテキスト番号「＃ｍ」は、切り替え前処理および切り替え後処理により、呼び出し先のモジュールに対して順次、渡される。
【０３２７】
切替前処理部１０４Ａまたは切替前処理部１０４Ｂにおける切り替え前処理が終了すると、呼び出し先のモジュールが呼び出され、実行するモジュールが切り替えられる。呼び出されたモジュールに制御が移ると、当該モジュールにおいて切り替え後処理が行われる。切り替え後処理は、上述の第４の実施形態において、図４１を用いて第１の実施形態による処理と同様であるとして説明した処理と異なるところがないため、ここでの詳細な説明を省略する。
【０３２８】
モジュールの呼び出し処理に伴うセキュア共有領域１８１および各モジュールの切替履歴領域の状態の変化について、図４７を参照しながら説明する。モジュール（＃１）７１０からモジュール（＃２）７２０に制御が切り替わり、モジュール（＃２）７２０において切り替え後処理が終了した時点では、セキュア共有領域１８１に対して、実行モジュール識別子「＃２」および切替フラグ「ｃａｌｌ」が保存されている。それと共に、セキュア共有領域１８１に対して、切替パラメータとして、関数名「ｓｕｂ」および引数「５」、ならびに、モジュール識別子「＃１」およびコンテキスト番号「＃ｍ」が保存されている。また、モジュール（＃１）７１０の切替履歴領域１１８には呼び出し元アドレスＡｄｄｒ１が保存され、モジュール（＃２）７２０の切替履歴領域１２８にはモジュール識別子「＃１」が保存されている。
【０３２９】
また、モジュール（＃２）７２０からモジュール（＃３）７３０に制御が切り替わり、モジュール（＃３）７３０において切り替え後処理が終了した時点では、セキュア共有領域１８１に、実行モジュール識別子「＃３」および切替フラグ「ｃａｌｌ」が保存される。それと共に、セキュア共有領域１８１の切替パラメータに、関数名「ｈｅｌｌｏ」、ならびに、モジュール識別子「＃１」およびコンテキスト番号「＃ｍ」が保存される。また、モジュール（＃２）７２０の切替履歴領域１２８には、モジュール識別子「＃１」および呼び出し元アドレスＡｄｄｒ２が保存される。モジュール（＃３）７３０の切替履歴領域には、モジュール識別子「＃２」が保存されている。モジュール（＃１）７１０の切替履歴領域１１８には、呼び出し元アドレスＡｄｄｒ１が保存される。
【０３３０】
このとき、モジュール（＃１）７１０のコンテキスト管理テーブル７１９は、コンテキスト番号「＃ｍ」のエントリが含まれる状態となる。一方、モジュール（＃２）７２０およびモジュール（＃３）７３０それぞれのコンテキスト管理テーブルは、何も含まない状態である。本第５の実施形態は、この点で、上述した第４の実施形態と異なる。
【０３３１】
次に、本第５の実施形態によるコンテキスト設定処理について説明する。この例では、図３６に例示されるように、モジュール（＃３）７３０においてコンテキスト設定処理が実行される。
【０３３２】
図４８は、第５の実施形態によるコンテキスト設定処理を示す一例のフローチャートである。先ず、モジュール（＃３）７３０のコンテキスト設定部は、呼び出し元のモジュールから、セキュア共有領域１８１を介して渡されたコンテキスト設定情報（モジュール識別子およびコンテキスト番号）を用いて、コンテキスト設定処理を実行する。先ず、ステップＳ７０７−１で、モジュール識別子の値が自身のモジュールを示すモジュール識別子の値と一致しているか否かを判定する。若し、モジュール識別子の値と自身のモジュールを示すモジュール識別子の値とが一致していると判定されたら、処理はステップＳ７０７−２に移行される。
【０３３３】
ステップＳ７０７−２では、コンテキスト番号に対応するコンテキスト情報を取得すると共に、当該コンテキスト情報を、コンテキスト管理テーブルから削除する。そして、次のステップＳ７０７−３で、モジュール（＃３）７３０のコンテキスト設定部は、ステップＳ７０７−１で取得したコンテキスト情報を、モジュール（＃３）７３０における現在のコンテキスト情報に対して上書きする。
【０３３４】
一方、ステップＳ７０７−１で、モジュール識別子が自身のモジュールを示していないと判定されたら、処理はステップＳ７０７−４に移行される。この場合、呼び出し元のモジュールに戻る必要があると判断できる。そこで、ステップＳ７０７−４で、モジュール（＃３）７３０のコンテキスト設定部は、モジュール（＃３）７３０のスタックなどのコンテキストを、切り替え直後の状態に戻す。そして、制御をモジュール（＃３）７３０のコンテキスト変更通知部に移す。
【０３３５】
この例では、モジュール識別子「＃１」が自身のモジュールを示すモジュール識別子「＃３」と異なっているため、処理がステップＳ７０７−４に移行され、モジュール（＃３）７３０のスタックなどのコンテキストを、切り替え前の状態に戻す。そして、制御をモジュール（＃３）のコンテキスト変更通知部に移す。モジュール（＃３）７３０のコンテキスト変更通知部による処理は、図４３を用いて説明した、第４の実施形態によるコンテキスト変更通知部による処理と同一であるので、ここでの説明を省略する。
【０３３６】
この時点では、図４７に例示されるように、セキュア共有領域１８１には、コンテキスト変更通知処理で書き込まれた実行モジュール識別子「＃２」、切替フラグ「Ｌｊ」が保存されていると共に、切替パラメータとしてモジュール識別子「＃１」とコンテキスト番号「＃ｍ」とが保存されている。また、モジュール（＃１）７１０の切替履歴領域１１８には呼び出し元アドレスＡｄｄｒ１が、モジュール（＃２）７２０の切替履歴領域１２８には呼び出し元のモジュール識別子「＃１」が、それぞれ保存されている。一方、モジュール（＃３）７３０の切替履歴領域には、何も保存されていない。
【０３３７】
モジュール（＃３）７３０がスリープ状態となると（図４３のステップＳ９０５−５参照）、実行権がＯＳに切り替わる。その後、ＯＳのスケジューラなどによって実行権がモジュール（＃２）７２０に移り、モジュール（＃２）７２０が実行を再開する。モジュール（＃２）７２０は、実行が再開され呼び出し元のモジュール（＃３）７３０のコンテキスト変更通知部から変更通知を受けとると、制御をコンテキスト変更受付部９０７Ｂに移す。
【０３３８】
コンテキスト変更受付部９０７Ｂによる処理は、図４４を用いて説明した、第４の実施形態によるコンテキスト変更受付部での処理と同一であるので、ここでの説明を省略する。最後に、コンテキスト変更通知部９０７Ｂは、取得した切替パラメータに含まれるコンテキスト設定情報を指定して、コンテキスト設定部７０２Ｂに制御を移す（図４４のステップＳ９０７−５参照）。
【０３３９】
図４８を参照し、コンテキスト設定部７０２Ｂは、ステップＳ７０７−１で、コンテキスト変更受付部９０７Ｂで取得された切替パラメータから獲得したモジュール識別子が値「＃１」であり、自身のモジュールを示すモジュール識別子が値「＃２」であって、両者は一致しないため、処理がステップＳ７０７−４に移行されることになる。
【０３４０】
ステップＳ７０７−４で、コンテキスト設定部７０２Ｂは、モジュール（＃２）７２０のスタックなどのコンテキストを、切り替え直後の状態に戻す。そして、制御をモジュール（＃２）７２０のコンテキスト変更通知部９０５Ｂに移す。コンテキスト変更通知部９０５Ｂによる処理は、図４３を用いて説明した、第４の実施形態によるコンテキスト変更通知部での処理と同一なので、ここでの説明を省略する。
【０３４１】
この時点では、図４７に例示されるように、セキュア共有領域１８１には、コンテキスト変更通知処理で書き込まれた実行モジュール識別子「＃１」、切替フラグ「Ｌｊ」が保存されていると共に、切替パラメータとしてモジュール識別子「＃１」とコンテキスト番号「＃ｍ」とが保存されている。また、モジュール（＃１）７１０の切替履歴領域１１８には、呼び出し元アドレスＡｄｄｒ１が保存されている。一方、モジュール（＃２）７２０およびモジュール（＃３）７３０の各切替履歴領域には、何も保存されていない。
【０３４２】
モジュール（＃２）７２０がスリープ状態となると（図４３のステップＳ９０５−５参照）、実行権がＯＳに切り替わる。その後、ＯＳのスケジューラなどによって実行権がモジュール（＃１）７１０に移り、モジュール（＃１）７１０が実行を再開する。モジュール（＃１）７１０は、実行が再開され呼び出し元のモジュール（＃２）７２０のコンテキスト変更通知部から変更通知を受けとると、制御をコンテキスト変更受付部９０７Ａに移す。
【０３４３】
コンテキスト変更受付部９０７Ａによる処理は、図４４を用いて説明した、第４の実施形態によるコンテキスト変更受付部での処理と同一であるので、ここでの説明を省略する。最後に、コンテキスト変更通知部９０７Ａは、取得した切替パラメータに含まれるコンテキスト設定情報を指定して、コンテキスト設定部７０２Ａに制御を移す（図４４のステップＳ９０７−５参照）。
【０３４４】
図４８を参照し、コンテキスト設定部７０２Ａは、呼び出し元のモジュールから、セキュア共有領域１８１を介して渡されたコンテキスト設定情報に含まれるモジュール識別子の値が、自身のモジュールを示すモジュール識別子の値と一致しているか否かを判定する。この場合には、コンテキスト設定情報に含まれるモジュール識別子が値「＃１」であり、モジュール（＃１）７１０を示すモジュール識別子が値「＃１」であるので、両者が一致する。そのため、コンテキスト設定部７０２Ａは、自身のモジュール内で発行されたコンテキスト登録の時点まで戻るべきと判断できる。
【０３４５】
処理はステップＳ７０７−２に移行され、コンテキスト設定部７０２Ａは、コンテキスト設定情報からコンテキスト番号を取り出し、コンテキスト管理テーブル９１９から、獲得したコンテキスト番号に対応するコンテキスト情報を取得する。そして、コンテキスト設定部７０２Ａは、コンテキスト管理テーブル９１９から、獲得したコンテキスト情報を削除する。そして、次のステップＳ７０７−３で、コンテキスト設定部７０２Ａは、ステップＳ７０７−２で取得したコンテキスト情報を、モジュール（＃１）７１０における現在のコンテキスト情報に対して上書きし、コンテキスト登録を行った場所まで戻る。
【０３４６】
このように、本第５の実施形態では、コンテキスト登録において、コンテキストの代わりにコンテキスト設定情報としてモジュール識別子とコンテキスト番号を提供する。そして、コンテキスト設定において、コンテキスト登録で提供されたコンテキスト設定情報に含まれるモジュール識別子とコンテキスト番号とを指定し、呼び出し元に順番に戻っていく。これにより、個別にコンテキストを持ち保護されたモジュール間であっても、関数ｓｅｔｊｍｐ／ｌｏｎｇｊｍｐに相当する機能を実現できる。
【０３４７】
なお、本第５の実施形態では、コンテキスト変更通知部と切替前処理部とを別々に扱ってきたが、これはこの例に限られず、切替前処理部がコンテキスト変更通知部の機能を含むように構成することもできる。すなわち、切替処理部の内部で、通常呼び出しの場合には通常の切り替え前処理を行い、コンテキスト設定であればコンテキスト変更通知部の処理を行う。
【０３４８】
また、本第５の実施形態では、コンテキスト変更受付部と切替後処理部とを別々に扱ってきたが、切替後処理部がコンテキスト変更受付部の機能を含むように構成することもできる。すなわち、切替後処理部の内部で、通常呼び出しの場合には通常の切り替え切替後を行い、コンテキスト設定であればコンテキスト変更受付部の機能による処理を行う。
【０３４９】
また、本第５の実施形態では、コンテキスト管理テーブルをモジュール単位で保持するように説明したが、これはこの例に限定されない。例えば、セキュア共有領域と同様に、連携するモジュール間で共有する領域にコンテキスト管理テーブルを設けるようにすることも可能である。
【０３５０】
さらに、本第５の実施形態では、モジュール識別子とコンテキスト番号とによりコンテキスト情報を管理するように説明したが、これはこの例に限定されない。すなわち、このモジュール識別子とコンテキスト番号は、モジュール間でユニークな値を持つためのものであればよく、２つの番号を持たない方法が考えられる。例えば、初期化処理において、モジュール間で利用するコンテキスト番号の範囲を決定し、モジュール＃１はコンテキスト番号＃１〜＃１００を、モジュール＃２はコンテキスト番号＃１０１〜＃２００を利用して、コンテキスト番号のみを利用する方法が考えられる。
【０３５１】
また、各モジュールが利用するコンテキスト番号は、初期化処理で決定するだけでなく、各モジュールが利用しているコンテキスト番号から衝突しないように調整して、コンテキスト番号を決定する方法であってもよい。
【０３５２】
＜各実施形態の他の対応＞
上述の各実施形態の他の対応によれば、プログラムは、第１処理ステップが自モジュールから他のモジュールへの動作の切替を行う直前に、切替の要因が呼び出しによるものである場合に、呼び出し元のアドレスを切替履歴領域に保存し、第２処理ステップが他のモジュールからの動作の切替が行われた直後に、切替フラグが呼び出し復帰を示す場合に、切替履歴領域から呼び出し元のアドレスを取得し、そのアドレスから実行を再開することを特徴とする。
【０３５３】
また、プログラムは、初期化ステップがモジュールの識別子をマイクロプロセッサがモジュールを識別するためのタスク識別子を用いて決定することを特徴とする。
【０３５４】
また、プログラムは、初期化ステップがモジュールの識別子を乱数を用いて決定すると共に、連携するモジュール間で識別子が重複しないことを確認することを特徴とする。
【０３５５】
また、プログラムは、第１処理ステップが自モジュールから他のモジュールへの切替を行う直前に、共有鍵を指定して切替フラグおよび切替パラメータをそれぞれ暗号化して共有領域に格納し、第２処理ステップが他のモジュールから自モジュールへの切替が行われた直後に、共有鍵を指定して共有領域に格納される切替フラグおよび切替パラメータを復号し、復号された切替フラグおよび切替パラメータとに従い自モジュール内の機能を実行させることを特徴とする。
【０３５６】
また、共有領域と共有領域へのアクセスを制御するアクセス制御部がマイクロプロセッサ上に設けられ、プログラムは、アクセス制御部を介して共有領域にアクセスすることを特徴とする。
【０３５７】
また、共有領域と共有領域へのアクセスを制御するアクセス制御部が、マイクロプロセッサ上で動作し、連携するモジュールを複数動作させる仮想マシンモニタ上に設けられ、プログラムは、仮想マシンモニタからアクセス制御部を介して共有領域にアクセスすることを特徴とする。
【符号の説明】
【０３５８】
１０４Ａ，１０４Ｂ，１０４Ｃ  切替前処理部
１０６Ａ，１０６Ｂ，１０６Ｃ，９０６Ａ，９０６Ｂ  切替後処理部
１１１，１２１  初期化処理部
１１２，９１２  プログラム（＃１）本体
１１０，３１０，５１０，７１０，９１０  モジュール（＃１）
１１８，１２８  切替履歴領域
１２０，３２０，５２０，７２０，９２０  モジュール（＃２）
１２２，９２２  プログラム（＃２）本体
１３０，３３０，５３０，７３０，９３０  モジュール（＃３）
１４０，３４０，５４０，７４０，９４０  モジュール（＃４）
１８０  ＯＳ
１８１  セキュア共有領域
１８２  実行モジュール識別子フィールド
１８３  切替フラグフィールド
１８４  切替パラメータフィールド
１８５  切替元モジュール識別子
１９０  共有領域
２００，４００  セキュアプロセッサ
２１０，４１０  コア
２１２，４１２  現タスク識別子レジスタ
２２０  暗号復号管理部
２２２  鍵テーブル
２２４  セレクタ
２２６  暗号／復号器
２８０  メモリ
４２０  モジュール切替管理部
４２２  モジュール切替管理テーブル
４２４  テーブルアクセス制御部
５０５Ａ，５０５Ｂ  例外通知部
５０７Ａ，５０７Ｂ  例外受付部
７０２Ａ，７０２Ｂ，９０９Ａ，９０９Ｂ  コンテキスト設定部
９０５Ａ，９０５Ｂ  コンテキスト変更通知部
９０７Ａ，９０７Ｂ  コンテキスト変更受付部
７１９，７２９，９１９，９２９  コンテキスト管理テーブル
９０８  コンテキスト登録部
【図１】
2011101972.tif 000003
【図２】
2011101972.tif 000004
【図３】
2011101972.tif 000005
【図４】
2011101972.tif 000006
【図５】
2011101972.tif 000007
【図６】
2011101972.tif 000008
【図７】
2011101972.tif 000009
【図８】
2011101972.tif 000010
【図９】
2011101972.tif 000011
【図１０】
2011101972.tif 000012
【図１１】
2011101972.tif 000013
【図１２】
2011101972.tif 000014
【図１３】
2011101972.tif 000015
【図１４】
2011101972.tif 000016
【図１５】
2011101972.tif 000017
【図１６】
2011101972.tif 000018
【図１７】
2011101972.tif 000019
【図１８】
2011101972.tif 000020
【図１９】
2011101972.tif 000021
【図２０】
2011101972.tif 000022
【図２１】
2011101972.tif 000023
【図２２】
2011101972.tif 000024
【図２３】
2011101972.tif 000025
【図２４】
2011101972.tif 000026
【図２５】
2011101972.tif 000027
【図２６】
2011101972.tif 000028
【図２７】
2011101972.tif 000029
【図２８】
2011101972.tif 000030
【図２９】
2011101972.tif 000031
【図３０】
2011101972.tif 000032
【図３１】
2011101972.tif 000033
【図３２】
2011101972.tif 000034
【図３３】
2011101972.tif 000035
【図３４】
2011101972.tif 000036
【図３５】
2011101972.tif 000037
【図３６】
2011101972.tif 000038
【図３７】
2011101972.tif 000039
【図３８】
2011101972.tif 000040
【図３９】
2011101972.tif 000041
【図４０】
2011101972.tif 000042
【図４１】
2011101972.tif 000043
【図４２】
2011101972.tif 000044
【図４３】
2011101972.tif 000045
【図４４】
2011101972.tif 000046
【図４５】
2011101972.tif 000047
【図４６】
2011101972.tif 000048
【図４７】
2011101972.tif 000049
【図４８】
2011101972.tif 000050
【国際調査報告】
2011101972.tif 000051
2011101972.tif 000052
2011101972.tif 000053
2011101972.tif 000054