JP5377748B2 - プログラム - Google Patents
プログラム Download PDFInfo
- Publication number
- JP5377748B2 JP5377748B2 JP2012500425A JP2012500425A JP5377748B2 JP 5377748 B2 JP5377748 B2 JP 5377748B2 JP 2012500425 A JP2012500425 A JP 2012500425A JP 2012500425 A JP2012500425 A JP 2012500425A JP 5377748 B2 JP5377748 B2 JP 5377748B2
- Authority
- JP
- Japan
- Prior art keywords
- module
- switching
- context
- identifier
- call
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/461—Saving or restoring of program or task context
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Debugging And Monitoring (AREA)
Description
本発明は、複数のモジュールが連携動作する際の実行順序の変更を防止する技術に関する。
オープンシステムでは、コンピュータのハードウェアやオペレーティングシステム(OS)のソースコードが開示されているので、ユーザがオペレーティングプログラムを改変して所望のプログラムを得ることができる。そのため、オープンシステムでは、OSのプログラムを改変してアプリケーションプログラムを攻撃することが想定される。OSに対してアプリケーションプログラムへの攻撃を防ぐための処理を施すだけでは、このような第三者による攻撃を防ぐことが困難である。
一方、ハードウェアは、ユーザによる改変が困難である。OSなどの改変によるプログラムへの攻撃を防ぐように構成したセキュアプロセッサが既に提案されている(特許文献1、非特許文献1)。このようなセキュアプロセッサは、マルチタスク環境でプログラムと当該プログラムで利用される情報とを暗号化することで、プログラムおよび情報の第三者への漏洩やプログラムの改変を防止し、プログラムから生成されたプロセス単体が正しい順序で実行可能となる。
また、複数モジュールが連携して動作するように構成されたアプリケーションが多く存在する。セキュアプロセッサでは、各モジュールは別のモジュールを一部分しか信用しない状況が考えられる。例えば、各モジュールは別々の鍵で暗号化保護され、別々のコンテキストで動作し、各コンテキストはOSや他のモジュールから隔離される。モジュール間で交換したデータは、潜在的に敵対的なOSや連携しないモジュールに渡さない。このモデルでは、他のモジュールからコンテキストを隔離してモジュール内のプライベートデータを保護する一方で、モジュール間で連係動作するためのデータのやりとりには共有領域を利用する。
このようなモジュール構成によるアプリケーション形態の一つとして、共有ライブラリを用いる方法が挙げられる。マルチプロセスで実現する場合、各プロセスは互いに独立して動作することから、各プロセス間において動作の同期を取るための記述が必要となる。一方、共有ライブラリは、単体のアプリケーションを作成する場合と同じように、通常の呼び出し規約に従って記述するだけでよい。また、動作も逐次的になるため、簡単に記述できるといった利点がある。
セキュアプロセッサで共有ライブラリを用いる場合、連携しようとするモジュールが適切かどうかを検証する必要がある。特許文献2では、共有ライブラリを呼び出すプログラムが共有ライブラリの初期化時に認証鍵交換を行って共有ライブラリの正当性を検証している。そして、共有ライブラリを呼び出す際に、共有ライブラリ内の特定のエントリポイントを必ず実行する。また、特許文献3では、呼び出し元となるモジュールと、呼び出し先となるモジュールがそれぞれ正当であるか否かを、そのモジュールを復号するための鍵によって検証するようにしている。
リー他著 "コピー及び耐タンパソフトウェアに対するアーキテクチャ支援"、コンピュータアーキテクチャーニュース、28(5)、p.168
ところで、各モジュールが別々にコンテキストを持ち、実行制御はOSが管理することから、モジュールは、OSの実行制御により動作が開始可能となる。このとき、他のモジュールからの呼び出し待ち状態のモジュールでも、当該モジュールは動作を開始してしまう。このように、呼び出し待ち状態のモジュールであっても、OSの実行制御によって動作開始する。
上述した特許文献2および3は、呼び出し先のモジュールの正当性は検証できるが、呼び出されたモジュールが動作すべきタイミングであるか否かを判断することができない。したがって、複数モジュールが連携しながら動作する場合に、その実行順序を変更することが可能となり、共有ライブラリのような決められた順番で逐次的に動作することを保証できないという問題点があった。
本発明は、上記に鑑みてなされたものであって、第三者による実行順序の変更を、より確実に防止するプログラムを提供することを目的とする。
上述した課題を解決し、目的を達成するために、本発明は、コンピュータに実行させるための複数のモジュールを含むプログラムであって、コンピュータは、連係して動作するモジュールのみがアクセス可能な領域であって、連係して動作するモジュールのうち、OS上で動作するモジュールの識別子を示す実行モジュール識別子を格納する共有領域を含むメモリを備え、モジュールのそれぞれは、連携する他のモジュールへの動作の切替を行う直前に、他のモジュールの識別子を実行モジュール識別子として共有領域に格納する第1処理ステップと、他のモジュールからの動作の切替が行われた直後に、共有領域に格納されている実行モジュール識別子と自モジュールの識別子とが一致した場合に、自モジュール内の機能を実行させる第2処理ステップとを有することを特徴とする。
本発明によれば、第三者による実行順序の変更を、効率的にかつ確実に防止することができる効果がある。
<第1の実施形態>
以下、図面を参照しながら本発明の第1の実施形態について説明する。先ず、本発明の第1の実施形態を適用可能な一例のシステムについて説明する。図1は、本発明の第1の実施形態に適用可能なシステムの一例の構成を模式的に示す。図1では、概略的なハードウェア構成と、システムビューとを同時に表している。
以下、図面を参照しながら本発明の第1の実施形態について説明する。先ず、本発明の第1の実施形態を適用可能な一例のシステムについて説明する。図1は、本発明の第1の実施形態に適用可能なシステムの一例の構成を模式的に示す。図1では、概略的なハードウェア構成と、システムビューとを同時に表している。
ターゲットシステムは、ハードウェア的には、セキュアプロセッサ200と、メモリ280とを備えており、各部はバス281で接続されている。セキュアプロセッサ200は、コア210と暗号復号管理部220とを備える。コア210は、このセキュアプロセッサ200の中核をなし各種プログラムの実行を司る部分であって、現タスク識別子レジスタ212を備える。現タスク識別子レジスタ212は、コア210で現在実行しているモジュールのタスク識別子(現タスク識別子と呼ぶ)を格納する。また、暗号復号管理部220は、鍵テーブル222、セレクタ224および暗号/復号器226を備える、暗号復号管理部220は、セキュアプロセッサ200外へのアクセスに同期して動作する。セレクタ224は、コア210の制御により、鍵テーブル222に格納される各値の、暗号・復号器226に対する供給を制御する。
ターゲットシステムにおいて、セキュアプロセッサ200のコア210上で単一のOS(オペレーティングシステム)180が動作し、OS180上で1または複数のモジュールが動作する。図1の例では、複数のモジュール(#1)110、モジュール(#2)120、モジュール(#3)130およびモジュール(#4)140が動作している。OS180上で動作する各モジュールは、そのモジュールの由来となるプログラムがある。また、各モジュールは、セキュアプロセッサ200内のコア210において各モジュールを一意に識別するための値である、タスク識別子を持つ。
図1の例では、モジュール(#1)110は、タスク識別子が「#1」であって、プログラムA(Prg A)から生成されていることが示されている。モジュール(#2)120は、タスク識別子が「#2」であって、プログラムB(Prg B)から生成されている。モジュール(#3)130は、タスク識別子が「#3」であって、プログラムC(Prg C)から生成されている。また、モジュール(#4)140は、タスク識別子が「#4」であって、プログラムBから生成されている。モジュール(#2)120とモジュール(#4)140のように、1つのプログラムから複数のモジュールを生成することができ、由来を同一とする複数のモジュールが異なるタスク識別子を持つことがある。
図2は、鍵テーブル222の一例のデータ構成を示す。鍵テーブル222は、タスク識別子をインデクスとして、インデクス(ID)が「#1」から「#n」までのn個のエントリを有する。各エントリは、鍵値フィールド、先頭アドレスフィールドおよび末尾アドレスフィールドを有する。鍵値フィールドは、暗号/復号器226で暗号化や復号を行う際に用いる鍵を格納する。先頭アドレスフィールドおよび末尾アドレスフィールドは、鍵値フィールドに格納される鍵で暗号化や復号を行う対象となるデータの、メモリ280上での先頭アドレスおよび末尾アドレスをそれぞれ格納する。
各モジュール(#1)110〜モジュール(#4)140のこの鍵テーブル222へのアクセスは、アクセスを行うモジュールのタスク識別子に対応するエントリに限定して行われ、他のタスク識別子に対応するエントリにはアクセスできないように制御される。例えば、モジュール(#1)110は、鍵テーブルのID「#1」にのみアクセス可能であって、それ以外のID「#2」〜「#n」にはアクセスできないように制御される。
あるモジュール(#m)がコア210上で実行されているときに、鍵テーブル222に対して先頭アドレスP、末尾アドレスQおよび鍵値Kの書き込みを行う場合について考える。この場合、セキュアプロセッサ200は、コア210にある現タスク識別子レジスタ212を参照してコア210上で実行されているモジュール(#m)のタスク識別子を特定する。そして、特定されたタスク識別子に対応する鍵テーブル222内のエントリ#mに対して、鍵値Kと先頭アドレスPおよび末尾アドレスQを書く。
次に、そのモジュール(#m)が、メモリ280上のデータにアクセスする方法について説明する。以下では、鍵テーブル222のエントリのうちID「#m」に対して、既に先頭アドレスP、末尾アドレスQ、鍵Kが登録されており、モジュール(#m)がメモリ280上のアドレスXにあるデータへアクセスする場合を例に説明する。
モジュール(#m)がメモリ280のアドレスXからデータを読み出すときには、セキュリティプロセッサ200は、メモリ280からアドレスXに対応するデータD1を取得する。次に、暗号復号管理部220は、現タスク識別子レジスタ212から取り出したタスク識別子(#m)に対応する鍵値などを鍵テーブル222から取得する。暗号復号管理部220は、読み出し先のアドレスXが鍵テーブル222に書かれた先頭アドレスPと末尾アドレスQの間であれば、暗号/復号器226でデータD1を復号した値をコア210に返す。一方、読み出し先のアドレスXが鍵テーブル222に書かれた先頭アドレスPと末尾アドレスQの間でなければ、データD1をコア210に返す。
同様に、モジュール(#m)がメモリ280にデータD2を書くとき、セキュアプロセッサ200は、書き出し先アドレスYがアドレスPからアドレスQの間であれば、データD2を鍵値Kで暗号化したデータをメモリ280上に書く。一方、書き出し先アドレスYがアドレスPからアドレスQの間でなければ、データD2をメモリ280上に書く。
ここで、セキュアプロセッサ200上で複数のモジュールが連係動作する場合のモジュール構成について、概略的に説明する。セキュアプロセッサ200上で動作する複数のモジュールは、それぞれ他のモジュールを一部分しか信用しないように構成される。各モジュールは、別々の鍵で暗号化されて保護されて、別々のコンテキストで動作する。各モジュールのコンテキストは、OSや他のモジュールから隔離されると共に、モジュール間で交換したデータは、潜在的に敵対的なOSや連携しないモジュールに渡さない。
図3は、セキュアプロセッサ200上で複数のモジュールが動作する場合の、一例のモジュール構成を概念的に示す。図3の例では、モジュール(#1)110およびモジュール(#2)120は、それぞれ別々のスタック(#1)119およびスタック(#2)129などのコンテキストを保持し、それらのコンテキストは、他のモジュールから直接的に見ることができないようにされる。
モジュール(#1)110とモジュール(#2)120との間でデータをやり取りするために、共有領域190が設けられる。すなわち、セキュアプロセッサ200上で複数のモジュールが動作する場合には、他のモジュールからコンテキストを隔離してモジュール内のプライベートデータを保護すると共に、モジュール間で連係動作するためのデータのやり取りには共有領域190を利用する。
図4は、本発明の第1の実施形態によるモジュール構成の一例の機能ブロック図を示す。図4の構成に対し、図1を用いて説明したキュアプロセッサ200が共通して適用される。なお、図4では、セキュアプロセッサ200は省略されている。
図4において、モジュール(#1)110およびモジュール(#2)120は、それぞれ本第1の実施形態によるモジュール切り替え機構を備える。ここでは、モジュール(#1)110がアプリケーションモジュールであり、モジュール(#2)120がライブラリモジュールであるものとする。モジュール(#1)110およびモジュール(#2)120は、協働して動作する。なお、アプリケーションモジュールは、初期化処理後にプログラム本体を実行するモジュールを指し、ライブラリモジュールは、初期化処理後に他のモジュールからの呼び出しを待つモジュールを指す。
モジュール(#1)110は、初期化処理部111、プログラム(#1)本体112、切替前処理部104A、切替後処理部106Aおよび切替履歴領域118を備える。同様に、モジュール(#2)120は、初期化処理部121、プログラム(#2)本体122および切替履歴領域128を備えると共に、それぞれモジュール(#1)110の切替前処理部104Aおよび切替後処理部106Aと共通の処理を行う切替前処理部104Bおよび切替後処理部106Bを備える。また、連携するモジュール(#1)110およびモジュール(#2)120間では、メモリ280上にセキュア共有領域181を共有する。セキュア共有領域181は、モジュール(#1)110とモジュール(#2)120とで共有する共有領域190の一部である。
初期化処理部111および121は、切替前処理部104Aおよび104B、ならびに、切替後処理部106Aおよび106Bで利用するセキュア共有領域181を構築するための処理を行う。切替前処理部104Aおよび104Bは、モジュールが他のモジュールへ切り替える直前の処理を行う。
切替後処理部106Aおよび106Bは、モジュールが他のモジュールから切り替えられた直後の処理を行う。切替履歴領域118は、切替前処理104Aおよび切替後処理106Aが切替による復帰に必要とする情報を格納するための領域である。同様に、切替履歴領域128は、切替前処理104Bおよび切替後処理106Bが切替による復帰に必要とする情報を格納するための領域である。
セキュア共有領域181は、連携するモジュール(#1)110およびモジュール(#2)120の間でのみ共有すべき情報を格納するための領域である。セキュア共有領域181は、連携するモジュール以外からの正常な読み書きができないように構成される。
図5は、本第1の実施形態によるモジュール切り替え機構において利用する、セキュア共有領域181が構築されたメモリ280の一例のメモリマップを示す。セキュア共有領域181は、連携するモジュール毎にメモリ280上に構築され共有される。
図5の例では、連携するモジュール(#1)110およびモジュール(#2)120がセキュア共有領域181−1(Sh_mem1)を共有し、連携するモジュール(#3)130およびモジュール(#4)140がセキュア共有領域181−2(Sh_mem2)を共有している。セキュア共有領域181−1は、メモリ280上の開始アドレスSh_start1から終了アドレスSh_end1の範囲とされる。また、セキュア共有領域181−2は、メモリ280上の開始アドレスSh_start2から終了アドレスSh_end2の範囲とされる。
各セキュア共有領域181−1、181−2、…は、実行モジュール識別子フィールド182、切替フラグフィールド183、切替パラメータフィールド184および切替元モジュール識別子フィールド185を含み、それぞれ実行モジュール識別子、切替元モジュール識別子、切替フラグおよび切替パラメータが格納される。実行モジュール識別子は、OS上で動作するモジュールのモジュール識別子である。切替元モジュール識別子は、OS上で動作するモジュールを実行モジュール識別子が示すモジュールに切り替えた場合に、切り替える前にOS上で動作していたモジュールのモジュール識別子である。なお、モジュール識別子とは、連携するモジュール間で互いのモジュールを一意に識別するための値である。
モジュール識別子として、セキュアプロセッサ200で利用するタスク識別子を用いることができる。これに限らず、モジュール識別子として、連携するモジュール間で互いを識別可能に決定した値を用いることも可能である。切替フラグは、モジュールの切り替えの要因がモジュールの呼び出しによるものなのか、モジュールへの復帰によるものなのかを示す値を示す。切替パラメータは、モジュールの呼び出しの場合には呼び出し先の関数名と引数を示し、モジュールへの復帰の場合には実行結果を示す。
次に、本第1の実施形態によるモジュール切り替え機能を用いた各モジュールの一例の動作について説明する。ここでは、モジュール識別子としてタスク識別子を用いるものとする。また、モジュール(#1)110は、モジュール識別子が「#1」で、プログラムAから生成されたアプリケーションモジュールであり、モジュール(#2)120は、モジュール識別子が「#2」で、プログラムBから生成されたライブラリモジュールであるとする。
以下では、モジュール(#1)110とモジュール(#2)120とが連携動作して、モジュール(#1)110からモジュール(#2)120を呼び出し、その後、モジュール(#2)120からモジュール(#1)110に復帰する例を用いて説明する。
図6は、この、モジュール(#1)110とモジュール(#2)120との間で切り替えを行う処理の全体の流れを示す。OS180がモジュール(#1)110およびモジュール(#2)120の実行を開始すると、アプリケーションモジュールであるモジュール(#1)110において、初期化処理部111が初期化処理を行う(ステップS10)と共に、ライブラリモジュールであるモジュール(#2)120において、初期化処理部121が初期化処理を行う(ステップS20)。
初期化処理が終了すると、モジュール(#2)120は、呼び出しを待機するスリープ状態となる。また、モジュール(#1)110では、プログラム(#1)本体112が実行される(ステップS11)。
モジュール(#1)110のプログラム(#1)本体112において、モジュール(#2)120の呼び出しを行うときには、切替前処理部104Aでモジュール(#1)110の切り替え前処理を実行し(ステップS12)、モジュール(#1)110からOS180に対して切り替えを要求する。OS180は、この切り替え要求を受けて、スリープ状態にあるモジュール(#2)120を呼び出して実行を再開させ、モジュール(#2)120をスリープ状態から復帰させる。一方、モジュール(#1)110は、呼び出しを待機するスリープ状態となる。
OS180からの実行再開によりモジュール(#2)120が復帰すると、切替後処理部106Bでモジュール(#2)120の切り替え後処理を実行する(ステップS21)。そして、モジュール(#2)120において、次のステップS22で、呼び出し先すなわちプログラム(#2)本体122が実行される。
モジュール(#2)120のプログラム(#2)本体122において、モジュール(#1)110の呼び出しを行うときには、切替前処理部104Bでモジュール(#2)120の切り替え前処理を実行し(ステップS23)、モジュール(#2)120からOS180に対して切り替えを要求する。OS180は、この切り替え要求を受けて、スリープ状態にあるモジュール(#1)110を呼び出して実行を再開させ、モジュール(#1)110をスリープ状態から復帰させる。
OS180からの呼び出しによりモジュール(#1)110が復帰されると、切替処理部106Aでモジュール(#1)110の切り替え後処理を実行する(ステップS13)。そして、モジュール(#1)110において、プログラム(#1)本体112の実行が再開される(ステップS14)。
このように、本第1の実施形態においては、例えばモジュール(#1)110は、初期化処理部111による初期化処理の後に、プログラム(#1)本体112の実行が開始される。また、モジュール(#1)110は、他のモジュールを呼び出す際に、切替前処理部104Aで切り替え前処理を実行する。また、他のモジュールから呼び出された場合は、切替後処理部106Aで切り替え後処理を実行してから、プログラム(#1)本体112が実行される。
以下、図6における各処理について、詳細に説明する。
先ず、モジュールの初期化処理について説明する。各モジュール(#1)110およびモジュール(#2)120は、OS180によって実行が開始されると、モジュール間での連携を行うためにそれぞれ初期化処理を実行する。図7は、アプリケーションモジュールが行う初期化処理の一例のフローチャートである。また、図8は、ライブラリモジュールが行う初期化処理の一例のフローチャートである。これら図7に示すアプリケーションモジュールの処理と、図8に示すライブラリモジュールの処理とは、互いに連携して実行される。以下、図7のフローチャートを中心に、必要に応じて図8のフローチャートを参照して説明を行う。
OS180により実行が開始されると、図7のステップS111−1および図8のステップS121−1で、連携しようとするモジュール(#1)およびモジュール(#2)の間でAKE(Authentication and Key Exchange)を実施する。AKEの実施により、モジュール(#1)110およびモジュール(#2)120は、互いの正当性を検証すると共に、一時鍵Key_ABを共有する。このように、AKE実施により、連携する各モジュールは、適切な連携対象のプログラムのみが知り、他のモジュールが知ることができない鍵を共有する。
モジュール(#1)110は、次のステップS111−2で、メモリ280上にセキュア共有領域181とするための領域を確保すると共に、モジュール共有鍵Key_sharedを生成する。モジュール共有鍵は、連携するモジュール間で共有する鍵であり、セキュア共有領域181を暗号化するために用いる。このモジュール共有鍵は、連携対象ではないモジュールが知ることができない値であればよく、その値はアプリケーションモジュール(この例ではモジュール(#1)110)が決定してもよいし、乱数から生成してもよい。
次のステップS111−3および図8のステップS121−2で、モジュール(#1)110およびモジュール(#2)120は、ステップS111−2でモジュール(#1)110がメモリ280上に確保した領域をセキュア共有領域181−1とするためのセキュア共有領域情報を交換する。より具体的には、先ず、モジュール(#1)110がセキュア共有領域情報とモジュール(#1)のモジュール識別子とを一時鍵Key_ABで暗号化して、メモリ280を経由してモジュール(#2)120に送付する。
ここで、セキュア共有領域情報は、ステップS111−2でモジュール(#1)110がメモリ280上に確保した領域の先頭アドレス、末尾アドレスおよびモジュール共有鍵を含む。この例では、モジュール(#1)110は、セキュア共有領域情報として、ステップS111−2で確保したメモリ280上の領域の先頭アドレスSh_start1および末尾アドレスSh_end1、ならびに、モジュール共有鍵Key_sharedをモジュール(#2)120に送付する。それと共に、モジュール(#1)110は、モジュール(#1)110のモジュール識別子(この例ではタスク識別子「#1」)をモジュール(#2)120に送付する。
モジュール(#2)120は、モジュール(#1)110から送られてきたデータを一時鍵Key_ABで復号し、セキュア共有領域情報(先頭アドレスSh_start1、末尾アドレスSh_end1およびモジュール共有鍵Key_shared)と、モジュール(#1)110のモジュール識別子とを取得する。
一方、モジュール(#2)120は、モジュール(#2)120のモジュール識別子を、モジュール(#2)120のタスク識別子から「#2」とし、このモジュール識別子を一時鍵Key_ABで暗号化する。そして、モジュール識別子が暗号化されたこのデータを、モジュール(#1)110にメモリ280を介して送付する。モジュール(#1)110は、モジュール(#2)120から送られてきたデータを一時鍵Key_ABで復号することで、モジュール(#2)120のモジュール識別子(この場合はタスク識別子の「#2」)を得ることができる。
図7のステップS111−3および図8のステップS121−2の処理により、連携するモジュール間で特定のメモリ領域とその特定領域を暗号化するための鍵を共有すると共に、各モジュールに対して連携するモジュール間でそれぞれのモジュールを一意に識別するための値であるモジュール識別子を決定することができる。
モジュール(#1)110は、次のステップS111−4で、セキュア共有領域情報を用いてセキュア共有領域181−1に対する暗号化設定を行う。これと並列的に、モジュール(#2)120は、図8のステップS121−3で、セキュア共有領域情報を用いてセキュア共有領域181−1に対する暗号化設定を行う。具体的には、モジュール(#1)110およびモジュール(#2)120は、セキュアプロセッサ200に対して、セキュア共有領域情報に含まれるセキュア共有領域181の先頭アドレスSh_start1、末尾アドレスSh_end1および鍵値Key_sharedを与えて暗号化設定を行う。
各モジュール(#1)110およびモジュール(#2)120それぞれがセキュアプロセッサ200上で暗号化設定を行うと、セキュアプロセッサ200は、鍵テーブル222を参照し、現タスク識別子に対応するエントリに対して、先頭アドレス、末尾アドレスおよび鍵値を書く。
具体的には、モジュール(#1)110の暗号化設定によって、セキュアプロセッサ200は、鍵テーブル222のモジュール(#1)110に対応するインデックス「#1」に対して、先頭アドレスSh_start1、末尾アドレスSh_end1および鍵値Key_sharedを書く。同様に、モジュール(#2)120の暗号化設定によって、セキュアプロセッサ200は、鍵テーブル200のモジュール(#2)120に対応するインデックス「#2」に対して、先頭アドレスSh_start1、末尾アドレスSh_end1および鍵値Key_sharedを書く。
これらの設定により、モジュール(#1)110やモジュール(#2)120がメモリ280上の領域Sh_mem1へ値を書く場合には、セキュアプロセッサ200は、鍵Key_sharedで暗号化した値をメモリ領域181に書く。また、モジュール(#1)やモジュール(#2)がメモリ280上の領域Sh_mem1から値を読む場合には、セキュアプロセッサ200は、領域Sh_mem1から読み出したデータを鍵Key_sharedで復号した値をコア210に与える。
モジュール(#2)120は、ステップS121−3でセキュア共有領域情報を鍵テーブル222に書き込んだ後、モジュール(#1)110からの呼び出しを待つために、後述する呼び出される側の処理の直前で処理を停止し、スリープ状態となる(図8のステップS121−4)。
一方、モジュール(#1)110は、ステップS111−4でセキュア共有領域情報を鍵テーブル222に書き込んだ後、ステップS111−5で、自身のモジュール識別子(この場合は、タスク識別子の「#1」)を、セキュア共有領域181−1の実行モジュール識別子フィールド182に対して実行モジュール識別子として書く。そして、次のステップS111−6で、モジュール(#1)110におけるプログラム(#1)本体112の実行を開始する。
このように、本第1の実施形態では、モジュール(#1)110およびモジュール(#2)120が、メモリ280上の同一の領域に対して同一の鍵を用いて暗号化設定を行う。これにより、モジュール(#1)110およびモジュール(#2)120は、当該領域から平文の値を読むことができ、OS180や、モジュール(#1)110およびモジュール(#2)120と連携していない他のモジュールからは、当該領域から暗号化された値しか読むことができない。つまり、連携するモジュール(この場合は、モジュール(#1)110およびモジュール(#2)120)は、メモリ280上の領域Sh_mem1に対して、連携するモジュールだけにその平文の値がアクセス可能な、セキュアな共有領域を設けることができる。
次に、モジュールから他のモジュールを呼び出す際の処理について、図9〜図11を用いて説明する。図6を用いて説明したように、モジュール(呼出元モジュール)から他のモジュール(呼び出し先モジュール)を呼び出す際には、切替前処理部104Aまたは104Bにより呼出元モジュールに対して切り替え前処理が実行され、その後、切替後処理部106Aまたは106Bにより呼び出し先モジュールに対して切り替え後処理が実行される。
以下では、モジュール(#1)110からモジュール(#2)120内のプログラム(#2)本体122における関数sub(5)を呼び出す場合を例に説明する。なお、関数sub(5)において、「sub」は関数名であり、括弧内の数値「5」は、当該関数sub()に渡す引数である。
図9は、切り替え前処理を示す一例のフローチャートである。図10は、切り替え後処理を示す一例のフローチャートである。切り替え前処理および切り替え後処理は、呼出元モジュールから呼び出し先モジュールを呼び出す呼び出し処理と、呼び出し先モジュールから呼出元モジュールを呼び出して呼出元モジュールを復帰させる復帰処理とで処理内容が異なる。
図11は、呼び出し処理および後述する復帰処理に伴う、セキュア共有領域181、ならびに、切替履歴領域118および128の状態の変化を概略的に示す。なお、図11において、セキュア共有領域181内の「ID」、「フラグ」および「パラメータ」は、それぞれ実行モジュール識別子、切替フラグおよび切替パラメータを示す。上述した初期化処理の直後では、セキュア共有領域181には、図7のステップS111−5の処理で書き込まれた実行モジュール識別子「#1」のみが保存されている。また、切替履歴領域118および128には、何も保存されていない。
先ず、呼び出し処理について説明する。モジュール(#1)110において、切替前処理部104Aは、モジュール(#2)120を呼び出す直前に、モジュール切り替えの種別を判定する(ステップS104−1)。ここでは、切り替えの要因が呼び出しによると判定され、処理がステップS104−2に移行される。ステップS104−2では呼び出し先から復帰したときに正しい呼び出し元のアドレスに戻るために、呼び出し元のアドレスAddr1を、モジュール(#1)110の切替履歴領域118に保存する。
次のステップS104−3で、切替前処理部104Aは、セキュア共有領域181の切替フラグフィールド183に対して、切り替えの要因が「呼び出し」であることを示す切替フラグ「call」を書く。
次のステップS104−4で、切替前処理部104Aは、切替パラメータフィールド184に対して、モジュール切り替えに必要な呼び出し情報として、呼び出し先の関数名「sub」とその引数「5」を書く。さらに、次のステップS104−5で、切替前処理部104Aは、切替元モジュール識別子フィールド185に対して、自身のモジュール識別子「#1」を書く。
処理は呼び出し処理および復帰処理で共通のステップS104−9に移行され、切替前処理部104Aは、セキュア共有領域181にある実行モジュール識別子フィールド182に対して、呼び出し先のモジュール(この例ではモジュール(#2)120)のモジュール識別子「#2」を書く。そして、処理はステップS104−10に移行され、スリープ状態となる。これは、呼び出し先から復帰する場合や、他のモジュールなどからの呼び出しに備えるためであり、モジュール(#1)110は、自身をスリープ状態として、切り替え後処理の直前で処理を停止する。
なお、実行モジュール識別子フィールド182に対して実行モジュール識別子を書くことによって、モジュールの実行権が実行モジュール識別子で示されるモジュールに移ったと考えることができる。そのため、ステップS104−9による実行モジュール識別子の書き込みから、ステップS104−10によるモジュールの処理停止までの期間は、可能な限り短くするのが好ましいと共に、その期間で当該モジュールの情報保護資産に関わる処理を行うことは、避けるのが望ましい。
ステップS104−10によってモジュール(#1)110がスリープ状態になると、実行権がOS180に切り替わる。その後、OS180のスケジューラなどの制御によって実行権がモジュール(#2)120に移り、モジュール(#2)120が実行を再開する。
モジュールの実行権が切り替わると、図10に示す手順に従い切り替え後処理が実行される。実行されるモジュールがモジュール(#1)110からモジュール(#2)120に切り替わると、モジュール(#2)120の切替後処理部106Bは、セキュア共有領域181から実行モジュール識別子を得る(ステップS106−1)。そして、獲得した実行モジュール識別子の値が、モジュール(#2)120のモジュール識別子の値と一致するか否かを判定する(ステップS106−2)。
若し、ステップS106−2で、実行モジュール識別子の値とモジュール(#2)120のモジュール識別子の値とが一致しないと判定されたら、処理はステップS106−9に移行されてスリープ状態とされ、モジュール(#2)120の状態が呼び出し処理の直前の状態に戻る。一方、ステップS106−2で、実行モジュール識別子の値とモジュール(#2)120のモジュール識別子の値とが一致すると判定されたら、処理はステップS106−3に移行される。
この例では、セキュア共有領域181の実行モジュール識別子フィールド182に、モジュール識別子「#2」が書き込まれているため、モジュール(#2)120のモジュール識別子と値が一致すると判定される。したがって、切替後処理部106Bは、モジュール(#2)120を実行すべきであることが分かるので、ステップS106−3に処理を移行させて、切り替え後処理を継続する。
ステップS106−3で、切替後処理部106Bは、セキュア共有領域181の切替フラグフィールド183から切替フラグを得る。次のステップS106−4で、獲得した切替フラグの値が「呼び出し」および「復帰」の何れを示すかが判定される。若し、切替フラグの値が「呼び出し」を示すと判定されたら、処理はステップS106−5に移行される。一方、切替フラグの値が「復帰」を示すと判定されたら、処理はステップS106−7に移行される。
この例では、上述したように図9のステップS104−3で「呼び出し」を示す切替フラグ「call」が切替フラグフィールド183に書き込まれているので、切替フラグの値が「呼び出し」を示すと判定され、関数呼び出しが要求されていることが分かる。したがって、処理がステップS106−5に移行される。
ステップS106−5で、切替後処理部106Bは、セキュア共有領域181の切替元モジュール識別子フィールド185から切替元モジュール識別子を取り出して、モジュール(#2)120の切替履歴領域128に保存する。このように、切替元のモジュールを示すモジュール識別子を予め保存しておくことで、モジュール(#2)120は、関数実行後に呼び出し元のモジュールに復帰することができる。
この例では、上述したように図9のステップS104−5でモジュール識別子「#1」が切替元モジュール識別子フィールド185に書き込まれているので、このモジュール識別子「#1」が切替元モジュール識別子として取り出され、切替履歴領域185に保存される。
次のステップS106−6で、切替後処理部106Bは、セキュア共有領域181の切替パラメータフィールド184から、呼び出し情報として書き込まれた関数名「sub」と、引数「5」とを得る。そして、これら関数名「sub」および引数「5」に従い、プログラム(#2)本体122における関数sub(5)の実行を開始する。
図11に例示されるように、呼び出し処理が終了した時点では、セキュア共有領域181には、切り替え前処理すなわち図9のステップS104−3、ステップS104−4およびステップS104−9で書き込まれた実行モジュール識別子「#2」、切替フラグ「call」、ならびに、切替パラメータ「sub」および「5」が保存されている。また、モジュール(#1)110の切替履歴領域118には、ステップS104−2で書き込まれた呼び出し元のアドレスAddr1が保存されている。モジュール(#2)120の切替履歴領域128には、切り替え後処理すなわち図10のステップS106−5で書き込まれたモジュール識別子「#1」が保存されている。
次に、復帰処理について説明する。この例では、実行が呼び出し先のモジュール(#2)120から、当該モジュール(#2)120を呼び出した呼出元のモジュール(#1)110に復帰する場合の処理となる。
モジュール(#2)120の切替前処理部104Bは、モジュール(#2)120から呼び出し元のモジュールに復帰する直前に、ステップS104−1で、モジュール切り替えの種別を判定する。ここでは、切り替えの要因が復帰によるものであると判定され、処理がステップS104−6に移行される。
ステップS104−6では、切替前処理部104Bは、切替履歴領域128から、呼び出された際(図9のステップS106−5)に保存しておいた切替元のモジュールのモジュール識別子「#1」を得る。次のステップS104−7で、切替前処理部104Bは、セキュア共有領域181の切替フラグフィールド183に対して、切り替え要因が「復帰」であることを示す切替フラグ「ret」を書く。さらに、次のステップS104−8で、切替前処理部104Bは、セキュア共有領域181の切替パラメータフィールド184に対して、復帰処理に必要な呼び出し復帰情報として、切替前処理部104Bの実行の結果である実行結果Result_1を書く。
処理はステップS104−9に移行され、切替前処理部104Bは、セキュア共有領域181にある実行モジュール識別子フィールド182に対して、呼出元のモジュール(この例ではモジュール(#1)110)のモジュール識別子「#1」を書く。そして、処理はステップS104−10に移行され、スリープ状態となり、切り替え後処理の直前で、処理を停止する。
ステップS104−10によってモジュール(#2)120がスリープ状態になると、実行権がOS180に切り替わる。その後、OS180のスケジューラなどによって実行権がモジュール(#1)110に移り、モジュール(#1)110が実行を再開する。
モジュールの実行権が切り替わると、図10に示す手順に従い切り替え後処理が実行される。実行されるモジュールがモジュール(#2)120からモジュール(#1)110に切り替わると、モジュール(#1)110の切替後処理部106Aは、セキュア共有領域181の実行モジュール識別子フィールド182からモジュール識別子「#1」を取り出し(ステップS106−1)、取り出した値がモジュール(#1)110のモジュール識別子と一致するため、切り替え後処理を継続する(ステップS106−2)。
ステップS106−3で、切替後処理部106Aは、セキュア共有領域181の切替フラグフィールド183から切替フラグを得る。この例では、上述した図9のステップS104−7で切替フラグフィールド183に書かれた切替フラグ「ret」が得られるため、切替フラグの値が「復帰」を示すと判定し(ステップS106−4)、関数呼び出し復帰が要求されていることが分かる。したがって、処理がステップS106−7に移行する。
ステップS106−7で、切替後処理部106Aは、切替履歴領域118から、上述のステップS104−2で保存しておいた呼び出し元のアドレスAddr1を得ると共に、切替履歴領域118に保存されている当該アドレスAddr1を削除する。次のステップS106−8で、切替後処理部106Aは、セキュア共有領域181の切替パラメータフィールド184から呼び出し復帰情報を得る。そして、モジュール(#1)110は、獲得した呼び出し復帰情報に含まれる実行結果Result_1を用いて、呼び出し元アドレスAddr1に戻って実行を再開する。
図11に例示されるように、復帰処理が終了した時点では、セキュア共有領域181には、切り替え前処理すなわち図9のステップS104−7、ステップS104−8およびステップS104−9で書き込まれた切替フラグ「ret」、切替パラメータ「Result_1」および実行モジュール識別子「#1」が保存されている。また、モジュール(#1)110の切替履歴領域118は、切り替え後処理すなわち図10のステップS106−7で呼び出し元のアドレスAddr1が削除され、何も保存されていない。同様に、モジュール(#2)120の切替履歴領域128は、切り替え前処理すなわちステップS104−6で呼び出し元のモジュール識別子が削除され、何も保存されていない。
このように、連携するモジュール間でのみアクセス可能な領域を設け、実行が呼び出し元のモジュールが他のモジュールに切り替わる直前に、当該領域に呼び出し先のモジュールのモジュール識別子を書く。そして、呼び出し先のモジュールは、実行が呼出元モジュールから呼び出し先モジュールに切り替えられた直後に、当該領域に書かれた呼び出し先モジュールのモジュール識別子の値と自身のモジュール識別子とを比較することにより、実行順序の妥当性を保証することができる。この実行順序の妥当性が保証できることを示す具体的な例については、後述する。
図12〜図18を用いて、本第1の実施形態がモジュールの実行順序の妥当性を保証できることについて説明する。ここでは、プログラムX(Prg X)によるアプリケーションモジュールであるモジュール#1と、それぞれライブラリモジュールであるプログラムY(Prg Y)によるモジュール#2およびプログラムZ(Prg Z)によるモジュール#3の3のモジュールが連携して実行されるものとする。このとき、モジュール#1は、モジュール#2を呼び出し、モジュール#2は、モジュール#3を呼び出すように構成されているものとする。
図12は、正規の実行順序の例を示す。モジュール#1〜#3が実行開始されると、モジュール#2および#3がスリープ状態とされ、タイミングAで実行するモジュールが切り替えられ、モジュール#1からモジュール#2が呼び出されると共に、モジュール#1がスリープ状態とされる。タイミングBで実行するモジュールが切り替えられ、モジュール#2からモジュール#3が呼び出されると共にモジュール#2がスリープ状態とされる。次に、タイミングCで実行するモジュールが切り替えられ、モジュール#3からモジュール#2が復帰されると共に、モジュール#3がスリープ状態とされる。
以下、図12に示した実行順序に対してなされる実行順序攻撃の例について、図13〜図15を用いて説明する。これらの実行順序攻撃は、通常、OSのプログラムを利用や改変してモジュールの実行順序などを変更することで行われる。
図13は、実行順序攻撃の第1の例を示す。第1の例では、スリープ状態のモジュールを、当該モジュールが正規の呼び出し元のモジュールから呼び出される前に、実行開始させる。図13では、OSのスケジューラなどを利用し、タイミングAでモジュール#1から呼び出されるべきモジュール#2が、タイミングAより前の、タイミングDの時点で実行開始させる攻撃を示している。この場合、モジュール#1がタイミングAでモジュール#2を呼び出した時点で、既に、モジュール#2の先頭部分の実行が終了していることになる。一例として、モジュール#2の先頭部分に認証処理を含む場合、この認証処理を介さずにモジュール#2の残りの部分を実行できる。この第1の例を、タイミング攻撃と呼ぶ。
図14は、実行順序攻撃の第2の例を示す。第2の例では、モジュールの呼び出し順序を正規の順序に対して変更する。正規には、図12に例示するようにモジュール#1からモジュール#2が呼び出され、さらにモジュール#2からモジュール#3が呼び出される。これに対し、図14では、OSのスケジューラなどを利用し、モジュール#1から呼び出すタイミングAで、モジュール#2ではなく、モジュール#3を実行開始させる攻撃を示している。一例として、モジュール#2での認証処理で認証された後に、モジュール#3が実行可能となるような場合に、モジュール#2での認証処理を介さずにモジュール#3が実行されてしまうことになる。この第2の例を、呼び出し順序攻撃と呼ぶ。
図15は、実行順序攻撃の第3の例を示す。第3の例では、OSが予めモジュール#1とは別のモジュール#5とモジュール#2とで実行を開始する。そして、モジュール#5からモジュール#2を呼び出して、例えば先頭部分のみを実行させて途中状態でモジュール#5に復帰させる。モジュール#2は、スリープ状態となる。このとき、OSは、モジュール#2の途中状態を保存しておき、その後、タイミングAでモジュール#1から途中状態のモジュール#2を呼び出すようにすることができる。この場合においても、モジュール#2の先頭部分に認証処理を含む場合、この認証処理を介さずにモジュール#2の残り部分を実行できる。この第3の例を、途中状態モジュール挿入攻撃と呼ぶ。
図16〜図18を用いて、本第1の実施形態による構成で上述した実行順序攻撃の第1〜第3の例を回避できるか否かを検証する。なお、図16〜図18において、共有領域内CurIDは、セキュア共有領域181に保存される実行モジュール識別子を示す。
図16は、上述の図13で示した第1の例すなわちタイミング攻撃に本第1の実施形態を適用させた例である。この場合、タイミングAでモジュール#1からモジュール#2が呼び出されるまで、セキュア共有領域181には、実行モジュール識別子としてモジュール#1を示す「#1」が保存されている。一方、モジュール#2をスリープ状態から実行再開させると、モジュール#2は、上述した切り替え後処理により、図10のステップS106−2で自身のモジュール識別子とセキュア共有領域181に保存されている実行モジュール識別子とが一致するか否かを判定する。
図13に例示したタイミングDでモジュール#2を再開させた場合、セキュア共有領域181に保存される実行モジュール識別子は、値が「#1」であり、モジュール#2自身のモジュール識別子は値が「#2」であり、両者が一致しない。そのため、処理がステップS106−9に移行されて、モジュール#3がスリープ状態とされ、タイミング攻撃が回避される。
図17は、上述の図14で示した第2の例すなわち呼び出し順序攻撃に本第1の実施形態を適用させた例である。この場合、モジュール#1から呼び出されたモジュール#3のモジュール識別子の値が「#3」である。これに対し、セキュア共有領域181には、切り替え前処理により、図9のステップS104−9で次に実行すべき実行モジュール識別子として値「#2」が保存されている。したがって、図10を用いて上述した切り替え後処理のステップS106−2で、自身のモジュール識別子と、セキュア共有領域181に保存される実行モジュール識別子とが一致しないと判定される。したがって、処理がステップS106−9に移行されて、モジュール#2がスリープ状態とされ、呼び出し順序攻撃が回避される。
図18は、上述の図15で示した第3の例すなわち途中状態モジュール挿入攻撃に本第1の実施形態を適用させた例である。この場合、モジュール#2およびモジュール#5は、モジュール#1の実行とは別系統で初期化されており、モジュール共有鍵Key_Shared_1を共有する。一方、モジュール#1は、初期化によってモジュール共有鍵Key_Shared_2を持つ。そのため、モジュール#2およびモジュール#5の間で共有されるモジュール共有鍵Key_Shared_1は、モジュール#1とは共有されないことになる。したがって、モジュール#1がモジュール#2を呼び出す際に、モジュール#2は、セキュア共有領域181に保存された情報を、平文ではない状態で読むことになる。
このように、モジュール#1とモジュール#2は、セキュア共有領域181に書かれた情報を共有することができないため、モジュール間で連携することができない。すなわち、途中状態のモジュールを挿入することを回避できる。
このように、本第1の実施形態では、モジュールが実行再開された際に、切り替え後処理により、自身のモジュール識別子と、セキュア共有領域181に保存される、実行されるべきモジュールを示す実行モジュール識別子とが一致しているか否かを判定することにより、実行順序攻撃を回避できる。
なお、本第1の実施形態は、本発明の主旨を逸脱しない範囲で、上述以外にも様々な変形が可能である。例えば、上述では、セキュア共有領域181として、セキュアプロセッサ200とバス281で接続されるメモリ280を利用したが、これは適用可能な記憶装置の一例を示したに過ぎない。例えば、セキュア共有領域181として、セキュアプロセッサ200が内蔵するキャッシュメモリを用いてもよいし、フラッシュメモリといった不揮発性のメモリを用いてもよい。さらに、セキュア共有領域181は、半導体メモリに限られず、例えばハードディスクを用いてもよい。
同様に、上述では、初期化処理におけるAKEやセキュア共有領域情報などの交換をメモリ280を用いて行うように説明したが、これは適用可能な記憶装置の一例を示したに過ぎない。すなわち、AKEやセキュア共有領域情報などの交換を、キャッシュメモリ、フラッシュメモリ、ハードディスクなどを介して行ってもよい。
上述では、セキュアプロセッサ200がコア210と暗号復号管理部220のみを含むように説明したが、これはこの例に限定されない。例えば、セキュアプロセッサ200は、内部メモリ、DMA(Direct Memory Access)コントローラなどを含んでいてもよい。さらに、上述では、暗号復号管理部220内の鍵テーブル222を動的に設定していたが、これはこの例に限定されず、予め作成され、セキュアプロセッサ200内の不揮発性の記憶領域に埋め込まれた鍵であってもよい。
上述の第1の実施形態では、AKEをアプリケーションモジュール側から開始したが、AKEをライブラリモジュール側から開始してもよい。
上述の第1の実施形態では、各モジュールの実行開始時に初期化処理を実行するように説明したが、これはこの例に限定されない。すなわち、本発明では、初期化処理をプログラムの実行開始時に限定するものではない。例えば、アプリケーションモジュールとライブラリモジュールとが連携する直前に初期化処理を実行してもよい。また、初期化処理は、モジュールが連携する直前までであれば、どの時点で実行してもよい。
上述の第1の実施形態では、アプリケーションモジュールと連携するライブラリモジュールの個数を2乃至3に限定して説明したが、これはこの例に限られない。すなわち、4以上のライブラリモジュールがアプリケーションモジュールと連携する場合にも、第1の実施形態を適用することができる。
すなわち、本題1の実施形態は、アプリケーションモジュールが複数のライブラリモジュールと連携する場合、ライブラリモジュールから他のライブラリモジュールを呼び出す場合、ならびに、ライブラリモジュールからアプリケーションモジュールを呼び出す場合などにも適用可能である。これらの何れの場合でも、全てのモジュールで同じ鍵を共有し、その鍵を用いてセキュア共有領域を構築することにより、4以上のモジュールがセキュア共有領域を共有することが可能になる。
上述の第1の実施形態では、1のアプリケーションモジュールに対して1つのセキュア共有領域を設けたが、1のアプリケーションモジュールが複数のセキュア共有領域を利用してもよい。例えば、アプリケーションモジュールと連携するあるモジュールとはセキュア共有領域Sh_mem3を共有し、連携する別のモジュールとはセキュア共有領域Sh_mem4を共有する。また、モジュール#1、#2および#3が連携する場合に、モジュール#1および#2間、モジュール#2および#3間、ならびに、モジュール#1および#3間でそれぞれ1つずつセキュア共有領域を確保してもよい。
上述の第1の実施形態では、暗号復号管理部220が独立したユニットとして構成されているように説明したが、これはこの例に限定されない。例えば、BIU(Bus Interface Unit)やDMAコントローラなどの、プロセッサ外とのアクセスを行うユニットに内包してもよい。
上述の第1の実施形態では、セキュアプロセッサ200のデータ暗号化機構を用いて、連携するモジュール間でのみアクセス可能なセキュア共有領域181を構築したが、これはこの例に限定されない。すなわち、データ暗号化機構に限らず、セキュアプロセッサ200のサポートによって連携するモジュール間でのみアクセス可能な領域が構築可能であれば、他の方法を用いてセキュア共有領域181を構築してもよい。
上述の第1の実施形態では、OS180のサポートを得ることによってモジュールの切り替えを行っているが、これはこの例に限定されず、例えばハードウェア機構を用いてモジュールを直接的に切り替えるようにした場合(特許文献1参照)にも、本発明を適用することができる。
上述の第1の実施形態では、切替履歴領域118および128を、独立したデータ領域として管理しているが、これはこの例に限定されない。すなわち、切替履歴領域118および128は、必ずしも独立した構成である必要はなく、各モジュールに含まれるスタックに包含するように構成してもよい。
上述の第1の実施形態では、モジュール識別子としてタスク識別子を利用したが、これはこの例に限られず、モジュール識別子は、連携するモジュール間でユニークな値であれば、他の値を用いてもよい。例えば、各モジュールは、それぞれモジュール識別子を乱数によって生成してもよい。また、セキュアプロセッサ200が複数のプロセッサコアを持ち、各プロセッサコアに対してユニークな識別子が付与されている場合も考えられる。この場合、各モジュールは、プロセッサコアを識別するコア識別子とタスク識別子とを組み合わせた値を、モジュール識別子として用いることができる。これに限らず、連携するモジュール間での取り決めによって、何方か一方のモジュールだけがモジュール識別子としてタスク識別子を用い、他方のモジュールは、モジュール識別子として乱数から得た値を用いる方法でもよい。
<第2の実施形態>
次に、本発明の第2の実施形態について説明する。上述の第1の実施形態では、連携するモジュールでのみ読み書き可能にするセキュア共有領域181を、メモリ280上の一部の領域を用いて構成している。これに対し、本第2の実施形態では、セキュア共有領域を、セキュアプロセッサ上にハードウェアとして持つようにする。
次に、本発明の第2の実施形態について説明する。上述の第1の実施形態では、連携するモジュールでのみ読み書き可能にするセキュア共有領域181を、メモリ280上の一部の領域を用いて構成している。これに対し、本第2の実施形態では、セキュア共有領域を、セキュアプロセッサ上にハードウェアとして持つようにする。
図19は、本第2の実施形態に係るシステムの一例の構成を模式的に示す。図19では、概略的なハードウェア構成と、システムビューとが同時に表されている。なお、図19において、上述した図1と共通する部分には同一の符号を付し、詳細な説明を省略する。
図19において、本第2の実施形態によるセキュアプロセッサ400は、コア410、BIU430、モジュール切替管理部420を備える。モジュール切替管理部420は、モジュール切替管理テーブル422とテーブルアクセス制御部424とを備える。
テーブルアクセス制御部424は、コア410からモジュール切替管理テーブル422に対するアクセスを許可するか否かを判定し、許可しない場合は、例外などを発行する。BIU430は、外部のバス281に接続され、セキュアプロセッサ400の内部からバス281に接続するためのバスインターフェイスユニットである。コア410は、BIU430を介してバス281に接続され、例えばメモリ280にアクセスすることができる。
なお、この第2の実施形態によるセキュアプロセッサ400は、上述した第1の実施形態によるセキュアプロセッサ200と異なり、鍵テーブルや暗号/復号器を持つ暗号/復号管理部を含まない。
図20は、モジュール切替管理テーブル422の一例のデータ構成を示す。モジュール切替管理テーブル422は、共有領域番号を示すインデクス(Idx)が「#1」から「#n」までのn個のエントリを有する。各エントリは、モジュール共有鍵フィールド、実行モジュール識別子フィールド、切替元モジュール識別子フィールド、切替フラグフィールド、切替パラメータフィールドおよび有効ビットを有する。なお、有効ビットは、図20においては「V」として表されている。これらのうち、実行モジュール識別子フィールド、切替元モジュール識別子フィールド、切替フラグフィールドおよび切替パラメータフィールドは、図5を用いて説明したセキュア共有領域181における名称が対応するフィールドと共通である。
モジュール共有鍵フィールドは、当該フィールドにアクセス可能なモジュールのみが知り得る値を格納する。有効ビットは、そのエントリが有効か無効かを示すフラグである。
図21は、本第2の実施形態によるモジュール構成の一例の機能ブロック図を示す。なお、図21において、上述した図4と共通する部分には同一の符号を付し、詳細な説明を省略する。
図21において、アプリケーションモジュールであるモジュール(#1)310は、初期化処理部311、プログラム(#1)本体112、切替前処理部304A、切替後処理部306Aおよび切替履歴領域118を備える。また、ライブラリモジュールであるモジュール(#2)320は、初期化処理部321、プログラム(#2)本体122および切替履歴領域128を備えると共に、それぞれモジュール(#1)310の切替前処理部304Aおよび切替後処理部306Aと共通の処理を行う切替前処理部304Bおよび切替後処理部306Bを備える。
なお、本第2の実施形態においては、上述した第1の実施形態とは異なり、メモリ280上には、モジュール(#1)310およびモジュール(#2)320とで共有するセキュア共有領域を設けない。
次に、本第2の実施形態によるモジュール切り替え機能を用いた各モジュールの一例の動作について説明する。ここでは、モジュール識別子としてタスク識別子を用いるものとする。また、モジュール(#1)310は、モジュール識別子が「#1」で、プログラムAから生成されたアプリケーションモジュールであり、モジュール(#2)320は、モジュール識別子が「#2」で、プログラムBから生成されたライブラリモジュールであるとする。
以下では、モジュール(#1)110とモジュール(#2)120とが連携動作して、モジュール(#1)110からモジュール(#2)120を呼び出し、その後、モジュール(#2)120からモジュール(#1)110に復帰する例を用いて説明する。
ここで、例えばモジュール(#1)310において、初期化処理部311、切替前処理部304Aおよび切替後処理部306Aによる処理は、上述した第1の実施形態による初期化処理部111、切替前処理部104Aおよび切替後処理部106Aによる処理に対して、初期化処理で共有した共有領域番号とモジュール共有鍵とを用いてモジュール切替管理テーブルへのアクセスを行う点が異なる。これは、モジュール(#2)320でも同様である。
図22は、モジュール切替管理部424の一例の処理を示すフローチャートである。モジュール切替管理部424は、モジュール切替管理テーブル422に対してアクセスされたときに、この図22のフローチャートに従い処理を行う。
各モジュール(#1)310およびモジュール(#2)320がモジュール切替管理テーブル422上のフィールドにアクセスする場合には、コア410がアクセス先の共有領域番号とモジュール共有鍵とを指定する。例えばモジュール(#1)310からモジュール切替管理テーブル422に対してアクセスがなされた場合、先ず、コア410からモジュール切替管理部420内のテーブルアクセス制御部424に対して、アクセス先の共有領域番号とモジュール共有鍵とが指定される。
ステップS424−1で、テーブルアクセス制御部424は、モジュール切替管理テーブル422を参照して、指定された共有領域番号に対応する有効ビットの値を取得する。次のステップS424−2で、テーブルアクセス制御部424は、取得した有効ビットが「無効を示す値」であるか否かを判定する(ステップS424−2)。
若し、取得した有効ビットが「無効を示す値」だと判定されたら、処理はステップS424−3に移行され、テーブルアクセス制御部424は、コア410から指定されたアクセスの要求が書き込み要求か否かを判定する。判定の結果、若し、アクセス要求が書き込み要求以外の要求だと判定されたら、処理はステップS424−6に移行され、テーブルアクセス制御部424は、例外を発行する。
一方、ステップS424−3で、アクセス要求が書き込み要求であると判定されたら、処理はステップS424−4に移行される。ステップS424−4で、テーブルアクセス制御部424は、指定された共有領域番号に対応する有効ビットを「有効を示す値」に書き換える。そして、次のステップS424−5で、指定されたモジュール切替管理テーブル422の指定された共有領域番号に対して、指定された書き込みを実行する。
上述したステップS424−2により、有効ビットが「無効を示す値」以外であると判定された場合、処理はステップS424−7に移行される。ステップS424−7では、テーブルアクセス制御部424は、モジュール切替管理テーブル422から、指定された共有領域番号に対応するモジュール共有鍵を得る。
次のステップS424−8で、テーブルアクセス制御部424は、獲得したモジュール共有鍵の値が、各モジュール(#1)310またはモジュール(#2)320から与えられたモジュール共有鍵と一致するか否かを判定する。若し、一致すると判定されたら、処理はステップS424−9に移行され、テーブルアクセス制御部424は、モジュール切替管理テーブル422に対して指定された読み書きを実行する(S424−9)。一方、一致しないと判定されたら、処理はステップS424−6に移行され、テーブルアクセス制御部424は例外を発行する。
次に、本第2の実施形態によるモジュールの初期化処理について説明する。各モジュール(#1)310およびモジュール(#2)320は、OS180によって実行が開始されると、モジュール間での連携を行うためにそれぞれ初期化処理を実行する。図23は、アプリケーションモジュールであるモジュール(#1)310が行う初期化処理を示す一例のフローチャートである。また、図24は、ライブラリモジュールであるモジュール(#2)320が行う初期化処理を示す一例のフローチャートである。これら図23に示すアプリケーションモジュールの処理と、図24に示すライブラリモジュールの処理とは、互いに連携して実行される。
以下、図23のフローチャートを中心に、必要に応じて図24のフローチャートを参照して説明を行う。なお、図23および図24のフローチャートにおいて、上述した図7および図8のフローチャートと共通する処理には同一の符号を付し、詳細な説明を省略する。
OS180により実行が開始されると、図23のステップS111−1および図24のステップS121−1で、モジュール(#1)310およびモジュール(#2)320のそれぞれにおいて、互いの間でAKEを実施する。これにより、モジュール(#1)110およびモジュール(#2)120は、互いのプログラムの正当性を検証し、一時鍵Key_ABを共有する。
図23において、次のステップS311−2で、モジュール(#1)310の初期化処理部311は、モジュール切替管理テーブル422内の特定のエントリ(以下、共有領域と呼ぶ)へのアクセスを許可するためのモジュール共有鍵Key_sharedを、乱数などから生成する。
次のステップS311−3で、初期化処理部311は、特定の共有領域番号(例えは「#1」)に対して、モジュール共有鍵Key_sharedと自身のモジュールを示すモジュール識別子(値が「#1」とする)とを指定する。ここで、共有領域番号とは、モジュール間で共有する、モジュール切替管理テーブル422内のエントリのインデックスを指す。これにより、モジュール切替管理テーブル422の空き領域を確保され、モジュール(#2)320との間で共有する共有領域がモジュール切替管理テーブル422上に確保される。
このステップS311−3において、モジュール切替管理テーブル422に対するアクセスがなされるため、モジュール切替管理部420は、上述した図22のフローチャートに従い当該アクセスの制御を行う。この場合、指定された共有領域番号に対する有効ビットが「無効を示す値」であり、かつ、書き込み要求である。したがって、モジュール切替管理部420は、指定されたモジュール共有鍵とモジュール識別子とを、それぞれモジュール切替管理テーブル422におけるモジュール共有鍵フィールドと実行モジュール識別子フィールドに書くと共に、有効ビットを「有効を示す値」にセットする。
次のステップS311−4で、モジュール(#1)310は、セキュア共有領域情報とモジュール識別子とを一時鍵Key_ABで暗号化して、メモリ280を経由してモジュール(#2)320に送付する。ここで、セキュア共有領域情報は、ステップS311−3で確保した共有領域の共有領域番号およびモジュール共有鍵Key_sharedを指す。
この例では、モジュール(#1)310は、セキュア共有領域情報として、ステップS311−3で確保した共有領域の共有領域番号「#1」と共有鍵Key_sharedとを暗号化してモジュール(#2)320に送付する。それと共に、モジュール(#1)310は、自身を示すモジュール識別子として、タスク識別子「#1」を暗号化してモジュール(#2)320に送付する。
図24のステップS321−2で、モジュール(#2)320は、モジュール(#1)310から送付されたデータを一時鍵Key_ABで復号し、セキュア共有領域に関する情報(共有領域番号「#1」および共有鍵Key_shared)と、モジュール識別子「#1」とを取得する。これにより、モジュール(#2)320側で、モジュール(#1)310の情報を共有できる。
また、モジュール(#2)320は、自身を示すモジュール識別子として、タスク識別子「#2」を鍵Key_ABで暗号化して、メモリ280を介してモジュール(#1)310に送付する。モジュール(#1)310は、モジュール(#2)320から送付されたデータを一時鍵Key_ABで復号することで、モジュール(#2)320を示すモジュール識別子「#2」を得ることができる。これにより、モジュール(#1)310側で、モジュール(#2)320の情報を共有できる。
図24において、ステップS121−4で、モジュール(#2)320は、後述の呼び出される側の処理の直前で処理を停止してスリープ状態となり、モジュール(#1)310からの呼び出しを待機する。また、図23において、ステップS111−6で、モジュール(#1)は、プログラム(#1)本体112の実行を開始する。
次に、モジュールから他のモジュールを呼び出すときの処理を、図25〜図27を用いて説明する。上述の第1の実施形態と同様に、モジュール(呼出元モジュール)から他のモジュール(呼び出し先モジュール)を呼び出す際には、切替前処理部304Aまたは304Bにより呼出元モジュールに対して切り替え前処理が実行され、その後、切替後処理部306Aまたは306Bにより呼び出し先モジュールに対して切り替え後処理が実行される。
以下では、モジュール(#1)310からモジュール(#2)320内のプログラム(#2)本体122における関数sub(5)を呼び出す場合を例に説明する。なお、関数sub(5)において、「sub」は関数名であり、括弧内の数値「5」は、当該関数sub()に渡す引数である。
図25は、本第2の実施形態による切り替え前処理を示す一例のフローチャートである。図26は、本第2の実施形態による切り替え後処理を示す一例のフローチャートである。切り替え前処理および切り替え後処理は、呼出元モジュールから呼び出し先モジュールを呼び出す呼び出し処理と、呼び出し先モジュールから呼出元モジュールを呼び出して呼出元モジュールを復帰させる復帰処理とで処理内容が異なる。
図27は、呼び出し処理および後述する復帰処理に伴う、モジュール切替管理テーブル422、ならびに、切替履歴領域118および128の状態の変化を概略的に示す。なお、図27において、モジュール切替管理テーブル422内の「Key」、「CMID」、「フラグ」、「パラメータ」および「V」は、それぞれモジュール共有鍵、実行モジュール識別子、切替フラグ、切替パラメータおよび有効フラグを示す。また、モジュール切替管理テーブル422は、共有領域番号「#1」に対応するエントリの状態を示す。
上述した初期化処理の直前では、モジュール切替管理テーブル422のモジュール共有鍵、実行モジュール識別子、切替フラグおよび切替パラメータの各フィールドには何も保存されていない。また、有効ビットフィールドは、「無効を示す値」である値「0」が保存されている。初期化処理を行うことで、モジュール切替管理テーブル422のモジュール共有鍵フィールドおよび実行モジュール識別子フィールドに対し、それぞれモジュール共有鍵Key_sharedおよび実行モジュール識別子「#1」が保存される。また、有効ビットフィールドに「有効を示す値」である値「1」が保存される。
先ず、呼び出し処理について説明する。モジュール(#1)310において、切替前処理部304Aは、モジュール(#2)320を呼び出す直前に、モジュール切り替えの種別を判定する(ステップS304−1)。ここでは、切り替えの要因が呼び出しによると判定され、処理がステップS304−2に移行される。ステップS304−2では呼び出し先から復帰したときに正しい呼び出し元のアドレスに戻るために、呼び出し元のアドレスAddr1を、モジュール(#1)310の切替履歴領域118に保存する。
次のステップS304−3で、切替前処理部304Aは、モジュール切替管理テーブル422の切替フラグフィールドに対して、切り替えの要因が「呼び出し」であることを示す切替フラグ「call」を書く処理を行う。このとき、上述した図22のフローチャートに従い、モジュール切替管理部420が有効ビットおよびモジュール共有鍵による判定を行い、モジュール切替管理テーブル422に対する書き込みを制御する。
すなわち、先ず、モジュール(#1)310は、共有領域番号「#1」、モジュール共有鍵Key_sharedおよび切替フラグ「call」を指定する。セキュアプロセッサ400(モジュール切替管理部420)は、上述した図22のフローチャートに従い、モジュール切替管理テーブル422から、モジュール(#1)310から指定された共有領域番号「#1」で示されるエントリに保存されている有効ビットを取得する(図22のステップS424−1)。有効ビットは、図23で説明した初期化処理において「有効を示す値」に書き換えられている(ステップS424−4)。したがって、モジュール切替管理部420は、図22のステップS424−7により、モジュール切替管理テーブル422から当該共有領域番号「#1」で示されるエントリに保存されているモジュール共有鍵を取得する。
モジュール切替管理部420は、このモジュール切替管理テーブル422から取得したモジュール共有鍵と、モジュール(#1)310から与えられたモジュール共有鍵Key_sharedとが一致するか否かを判定する。この例では、これらモジュール共有鍵とモジュール共有鍵Key_sharedとが一致するため、モジュール切替管理部420は、モジュール切替管理テーブル422における共有領域番号「#1」に対応するエントリの切替フラグフィールドに対して切替フラグ「call」を書く。
次のステップS304−4で、切替前処理部304Aは、モジュール切替管理テーブル422の切替パラメータフィールドに対して、モジュール切り替えに必要な呼び出し情報として、呼び出し先の関数名「sub」とその引数「5」を書く。この場合にも、上述したようにして、モジュール切替管理部420が、有効ビットおよびモジュール共有鍵による判定結果に基づきモジュール切替管理テーブル422に対する書き込みを制御する。
処理は呼び出し処理および復帰処理で共通のステップS304−8に移行され、切替前処理部304Aは、モジュール切替管理テーブル422の切替元モジュール識別子フィールドに対して、自身のモジュール識別子「#1」を書く。さらに、次のステップS304−9で、切替前処理部304Aは、モジュール切替管理テーブル422の実行モジュール識別子フィールドに対して、呼び出し先のモジュール(この例ではモジュール(#2)320)のモジュール識別子「#2」を書く。
これらステップS304−8およびステップS304−9の処理においても、上述したようにして、モジュール切替管理部420が、有効ビットおよびモジュール共有鍵による判定結果に基づきモジュール切替管理テーブル422に対する書き込みを制御する。
そして、処理はステップS304−10に移行され、モジュール(#1)310がスリープ状態となる。これは、呼び出し先から復帰する場合や、他のモジュールなどからの呼び出しに備えるためであり、モジュール(#1)310は、自身をスリープ状態として、切り替え後処理の直前で処理を停止する。
ステップS304−10によってモジュール(#1)310がスリープ状態になると、実行権がOS180に切り替わる。その後、OS180のスケジューラなどの制御によって実行権がモジュール(#2)320に移り、モジュール(#2)320が実行を再開する。
モジュールの実行権が切り替わると、図26に示す手順に従い切り替え後処理が実行される。実行されるモジュールがモジュール(#1)310からモジュール(#2)320に切り替わると、ステップS306−1で、モジュール(#2)320の切替後処理部306Bは、共有領域情報「#1」およびモジュール共有鍵Key_sharedを指定して、セキュアプロセッサ400に対して実行モジュール識別子の取得を要求する。
すなわち、先ず、モジュール(#2)320は、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定する。セキュアプロセッサ400(モジュール切替管理部420)は、上述した図22のフローチャートに従い、モジュール切替管理テーブル422から、モジュール(#1)310から指定された共有領域番号「#1」で示されるエントリに保存されている有効ビットを取得する(図22のステップS424−1)。有効ビットは、図23で説明した初期化処理において「有効を示す値」に書き換えられている(ステップS424−4)。したがって、モジュール切替管理部420は、図22のステップS424−7により、モジュール切替管理テーブル422から当該共有領域番号「#1」で示されるエントリに保存されているモジュール共有鍵を取得する。
モジュール切替管理部420は、このモジュール切替管理テーブル422から取得したモジュール共有鍵と、モジュール(#1)310から与えられたモジュール共有鍵Key_sharedとが一致するか否かを判定する。この例では、これらモジュール共有鍵とモジュール共有鍵Key_sharedとが一致するため、モジュール切替管理部420は、モジュール切替管理テーブル422における共有領域番号「#1」に対応するエントリの実行モジュール識別子フィールドから実行モジュール識別子「#2」を取得する。取得された実行モジュール識別子「#2」は、モジュール(#2)320に送信される。
モジュール(#2)320の切替後処理部306Bは、セキュアプロセッサ400から送信された実行モジュール識別子の値「#2」と、モジュール(#2)320のモジュール識別子の値とが一致するか否かを判定する(ステップS306−2)。
若し、ステップS306−2で、実行モジュール識別子の値とモジュール(#2)320のモジュール識別子の値とが一致しないと判定されたら、処理はステップS306−9に移行されてスリープ状態とされ、モジュール(#2)320の状態が呼び出し処理の直前の状態に戻る。一方、ステップS306−2で、実行モジュール識別子の値とモジュール(#2)320のモジュール識別子の値とが一致すると判定されたら、処理はステップS306−3に移行される。
この例では、セキュア共有領域181の実行モジュール識別子フィールド182に、モジュール識別子「#2」が書き込まれているため、モジュール(#2)320のモジュール識別子と値が一致すると判定される。したがって、切替後処理部306Bは、モジュール(#2)320を実行すべきであることが分かるので、ステップS306−3に処理を移行させて、切り替え後処理を継続する。
ステップS306−3で、切替後処理部306Bは、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定して、モジュール切替管理テーブル422から切替フラグを得る。この場合にも、上述したようにして、モジュール切替管理部420が、共有領域番号「#1」が示すエントリに対する有効ビットおよびモジュール共有鍵Key_sharedによる判定結果に基づき、モジュール切替管理テーブル422からの読み出しを制御する。
次のステップS306−4で、獲得した切替フラグの値が「呼び出し」および「復帰」の何れを示すかが判定される。若し、切替フラグの値が「呼び出し」を示すと判定されたら、処理はステップS306−5に移行される。一方、切替フラグの値が「復帰」を示すと判定されたら、処理はステップS306−7に移行される。
この例では、上述したように図25のステップS304−3で「呼び出し」を示す切替フラグ「call」がモジュール切替管理テーブル422の切替フラグフィールドに書き込まれている。そのため、切替フラグの値が「呼び出し」を示すと判定され、関数呼び出しが要求されていることが分かる。したがって、処理がステップS306−5に移行される。
ステップS306−5で、切替後処理部306Bは、呼び出し元に復帰するために、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定して、モジュール切替管理テーブル422の切替元モジュール識別子フィールドから切替元モジュール識別子を得る。この場合にも、上述したようにして、モジュール切替管理部420が、共有領域番号「#1」が示すエントリに対する有効ビットおよびモジュール共有鍵Key_sharedによる判定結果に基づき、モジュール切替管理テーブル422からの読み出しを制御する。取り出された切替元モジュール識別子は、モジュール(#2)320の切替履歴領域128に保存される。
次のステップS306−6で、切替後処理部306Bは、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定して、モジュール切替管理テーブル422の切替パラメータフィールドから、呼び出し情報として書き込まれた関数名「sub」と、引数「5」とを得る。この場合にも、上述したようにして、モジュール切替管理部420が、共有領域番号「#1」が示すエントリに対する有効ビットおよびモジュール共有鍵Key_sharedによる判定結果に基づき、モジュール切替管理テーブル422からの読み出しを制御する。取り出された関数名「sub」および引数「5」に従い、プログラム(#2)本体122における関数sub(5)の実行を開始する。
図27に例示されるように、呼び出し処理が終了した時点では、モジュール切替管理テーブル422には、切り替え前処理すなわち図25のステップS304−3、ステップS304−4およびステップS304−9で書き込まれた実行モジュール識別子「#2」、切替フラグ「call」、ならびに、切替パラメータ「sub」および「5」が保存されている。有効ビットフィールドの値は、「1」のままである。また、モジュール(#1)310の切替履歴領域118には、ステップS304−2で書き込まれた呼び出し元のアドレスAddr1が保存されている。モジュール(#2)120の切替履歴領域128には、切り替え後処理すなわち図26のステップS306−5で書き込まれたモジュール識別子「#1」が保存されている。
次に、復帰処理について説明する。この例では、実行が呼び出し先のモジュール(#2)320から、当該モジュール(#2)320を呼び出した呼出元のモジュール(#1)310に復帰する場合の処理となる。
モジュール(#2)320の切替前処理部304Bは、モジュール(#2)320から呼び出し元のモジュールに復帰する直前に、ステップS304−1で、モジュール切り替えの種別を判定する。ここでは、切り替えの要因が復帰によるものであると判定され、処理がステップS304−5に移行される。ステップS304−5では、切替前処理部304Bは、切替履歴領域128から、呼び出された際(図26のステップS306−5)に保存しておいた切替元のモジュールのモジュール識別子「#1」を得る。
次のステップS304−6で、切替前処理部304Bは、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定して、復帰を示すフラグ「ret」を切替フラグとして、モジュール切替管理テーブル422の切替フラグフィールドに書く。この場合にも、上述したようにして、モジュール切替管理部420が、共有領域番号「#1」が示すエントリに対する有効ビットおよびモジュール共有鍵Key_sharedによる判定結果に基づき、モジュール切替管理テーブル422に対する書き込みを制御する。
次のステップS304−7で。切替前処理部304Bは、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定して、モジュール切替管理テーブル422の切替パラメータフィールドに対して、復帰処理に必要な呼び出し復帰情報として、モジュール(#2)320の実行の結果である実行結果「Result_1」を書く。
処理は、呼び出し処理および復帰処理で共通のステップS304−8に移行され、切替前処理部304Aは、モジュール切替管理テーブル422の切替元モジュール識別子フィールドに対して、自身のモジュール識別子「#2」を書く。さらに、次のステップS304−9で、切替前処理部304Aは、モジュール切替管理テーブル422の実行モジュール識別子フィールドに対して、呼び出し先のモジュール(この例ではモジュール(#2)310)のモジュール識別子「#1」)を書く。
これらステップS304−8およびステップS304−9の処理においても、上述したようにして、モジュール切替管理部420が、有効ビットおよびモジュール共有鍵による判定結果に基づきモジュール切替管理テーブル422に対する書き込みを制御する。
そして、処理はステップS304−10に移行され、モジュール(#1)310がスリープ状態となる。これは、呼び出し先から復帰する場合や、他のモジュールなどからの呼び出しに備えるためであり、モジュール(#1)310は、自身をスリープ状態として、切り替え後処理の直前で処理を停止する。
ステップS304−10によってモジュール(#2)320がスリープ状態になると、実行権がOS180に切り替わる。その後、OS180のスケジューラなどによって実行権がモジュール(#1)310に移り、モジュール(#1)310が実行を再開する。
モジュールの実行権が切り替わると、図26に示す手順に従い切り替え後処理が実行される。実行されるモジュールがモジュール(#2)320からモジュール(#1)310に切り替わると、モジュール(#1)310の切替後処理部306Aは、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定して、セキュアプロセッサ400に対して実行モジュール識別子の取得を要求する。セキュアプロセッサ400は、この要求に応じてモジュール切替管理テーブル422の実行モジュール識別子フィールドに書き込まれた実行モジュール識別子「#1」を取り出し、モジュール(#1)310に返す。
すなわち、先ず、モジュール(#1)310は、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定する。セキュアプロセッサ400(モジュール切替管理部420)は、上述した図22のフローチャートに従い、モジュール切替管理テーブル422から、モジュール(#1)310から指定された共有領域番号「#1」で示されるエントリに保存されている有効ビットを取得する(図22のステップS424−1)。有効ビットは、図23で説明した初期化処理において「有効を示す値」に書き換えられている(ステップS424−4)。したがって、モジュール切替管理部420は、図22のステップS424−7により、モジュール切替管理テーブル422から当該共有領域番号「#1」で示されるエントリに保存されているモジュール共有鍵を取得する。
モジュール切替管理部420は、このモジュール切替管理テーブル422から取得したモジュール共有鍵と、モジュール(#1)310から与えられたモジュール共有鍵Key_sharedとが一致するか否かを判定する。この例では、これらモジュール共有鍵とモジュール共有鍵Key_sharedとが一致するため、モジュール切替管理部420は、モジュール切替管理テーブル422における共有領域番号「#1」に対応するエントリの実行モジュール識別子フィールドから実行モジュール識別子「#1」を取得する。
切替後処理部306Aは、セキュアプロセッサ400から実行モジュール識別子「#1」が返されると、次のステップS306−2で、このセキュアプロセッサ400から返された実行モジュール識別子「#1」と、モジュール(#1)310のモジュール識別子の値とが一致するか否かを判定する。
若し、ステップS306−2で、実行モジュール識別子の値とモジュール(#1)310のモジュール識別子の値とが一致しないと判定されたら、処理はステップS306−9に移行されてスリープ状態とされ、モジュール(#1)310の状態が呼び出し処理の直前の状態に戻る。一方、ステップS306−2で、実行モジュール識別子の値とモジュール(#1)310のモジュール識別子の値とが一致すると判定されたら、処理はステップS306−3に移行される。
この例では、セキュア共有領域181の実行モジュール識別子フィールド182に、モジュール識別子「#1」が書き込まれているため、モジュール(#1)310のモジュール識別子と値が一致すると判定される。したがって、切替後処理部306は、モジュール(#1)310を実行すべきであることが分かるので、ステップS306−3に処理を移行させて、切り替え後処理を継続する。
ステップS306−3で、切替後処理部306Aは、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定して、モジュール切替管理テーブル422から切替フラグを得る。この場合にも、上述したようにして、モジュール切替管理部420が、共有領域番号「#1」が示すエントリに対する有効ビットおよびモジュール共有鍵Key_sharedによる判定結果に基づき、モジュール切替管理テーブル422からの読み出しを制御する。
次のステップS306−4で、獲得した切替フラグの値が「呼び出し」および「復帰」の何れを示すかが判定される。若し、切替フラグの値が「呼び出し」を示すと判定されたら、処理はステップS306−5に移行される。一方、切替フラグの値が「復帰」を示すと判定されたら、処理はステップS306−7に移行される。
この例では、上述したように図25のステップS304−6で「復帰」を示す切替フラグ「ret」が切替フラグフィールド183に書き込まれているので、切替フラグの値が「復帰」を示すと判定され、関数呼び出しが要求されていることが分かる。したがって、処理がステップS306−7に移行される。
ステップS306−7で、切替後処理部306Aは、切替履歴領域118から、上述のステップS304−2で保存しておいた呼び出し元のアドレスAddr1を得ると共に、切替履歴領域118に保存されている当該アドレスAddr1を削除する。次のステップS306−8で、切替後処理部306Aは、共有領域番号「#1」およびモジュール共有鍵Key_sharedを指定して、モジュール切替管理テーブル422の切替パラメータフィールド184から、呼び出し復帰情報を得る。そして、モジュール(#1)310は、獲得した呼び出し復帰情報に含まれる実行結果「Result_1」を用いて、呼び出し元アドレスAddr1に戻って実行を再開する。
このように、本第2の実施形態では、モジュール(#1)310およびモジュール(#2)320がモジュール共有鍵を共有し、モジュール切替管理部420がそのモジュール共有鍵によってモジュール切替管理テーブル422のエントリへのアクセス制御を行っている。これにより、モジュール切替管理テーブル422のエントリに書かれた値の読み書きを、モジュール(#1)およびモジュール(#2)320からは可能とし、OS180や他のモジュールからは不可能とすることができる。このように、悪意により改変されたOS180や他のモジュールからでは、モジュール切替管理テーブル422に書かれた値を書き換えることができない。そのため、モジュール切替管理部420は、第1の実施形態のセキュア共有領域181と同等の役割を果たしているといえる。
図27に例示されるように、復帰処理が終了した時点では、モジュール切替管理テーブル422には、切り替え前処理すなわち図25のステップS304−6、ステップS304−7およびステップS304−9で書き込まれた切替フラグ「ret」、切替パラメータ「Result_1」および実行モジュール識別子「#1」が保存されている。また、モジュール(#1)310の切替履歴領域118は、切り替え後処理すなわち図26のステップS306−7で呼び出し元のアドレスAddr1が削除され、何も保存されていない。同様に、モジュール(#2)120の切替履歴領域128は、切り替え前処理すなわちステップS304−5で呼び出し元のモジュール識別子が削除され、何も保存されていない。
なお、本第2の実施形態では、セキュアプロセッサ400上にモジュール切替管理部420を設けたが、これはこの例に限定されない。すなわち、図28に例示されるように、信頼できる仮想マシンモニタ(Trusted VMM)440が同様の機構を設けるように構成することができる。
例えば、プロセッサ450は、本第2の実施形態に特有のモジュール切替管理部420などを含まない一般的なプロセッサとし、仮想マシンモニタ440内部にモジュール切替管理部420を備える方法が考えられる。各モジュール(#1)310、モジュール(#2)320、モジュール(#3)330およびモジュール(#4)340は、仮想マシンモニタ440にあるモジュール切替管理部420を利用して、本第2の実施形態と同様の方法でモジュール切替を行うことが可能である。図28の例では、仮想マシンモニタ440上で複数のOS(OS180、OS_y181およびOS_z182)が動作し、各モジュールは、OS180上で動作している。また、モジュール切替管理部420をハードウェアではなく、OS上に構成することも可能である。
また、本第2の実施形態では、モジュール切替管理テーブル422における全ての値をセキュアプロセッサ400内に格納するように説明したが、これはこの例に限定されない。すなわち、モジュール切替管理テーブル422の情報の一部をセキュアプロセッサ400内に格納し、残りの部分を、第1の実施形態で示したメモリ280上のセキュア共有領域181へ格納するように構成することもできる。
さらに、本第2の実施形態では、モジュール切替管理テーブル422へのアクセスにおいて、1フィールド単位で読み書きを行うように説明したが、これはこの例に限定されず、例えば一度に複数フィールドを読み書きするようにしてもよい。
<第3の実施形態>
次に、本発明の第3の実施形態について説明する。上述した第1および第2の実施形態は、モジュールの呼び出しを一般的な呼び出し処理により行っていた。これに対して、本第3の実施形態は、モジュールの呼び出しを、言語例外により行う場合の例である。
次に、本発明の第3の実施形態について説明する。上述した第1および第2の実施形態は、モジュールの呼び出しを一般的な呼び出し処理により行っていた。これに対して、本第3の実施形態は、モジュールの呼び出しを、言語例外により行う場合の例である。
ここで、言語例外について説明する。コンピュータの分野において、例外という用語は、ハードウェア例外と言語例外の2種類がある。ハードウェア例外とは、ハードウェア割り込みや不正命令実行などの事象を指す。ハードウェア例外に対しては、ハードウェア例外に対応する割り込みハンドラへ制御を移すといった、プロセッサの機構により処理する。
一方、言語例外とは、ファイルが見つからないといった例外的な事象を指し、言語例外はC++やJava(登録商標)などのプログラミング言語環境で提供される。ライブラリなどの、言語例外が発生した関数からその呼び出し元関数を辿って言語例外に対応する例外ハンドラへ制御を移すといった機構により、言語例外を処理する。本第3の実施形態では、後者の言語例外を対象とする。
また、このような言語例外を扱うための機構を、言語例外処理機構と呼ぶ。言語例外処理機構とは、呼び出し先の関数ではそれらの処理を記述せずに、呼び出し元の関数で言語例外が起きた場合の処理を記述して、呼び出し元の関数に合わせたエラー処理を実行可能とするための仕組みである。このような仕組みは、例えば「Bjarne Stroustrup著 “C++の設計と進化”」などに記載されている。C++やC#などのプログラミング言語環境では、try〜catchの形式で記述され、多くのアプリケーションで利用されており、その仕組みはよく知られている。
図29は、言語例外処理機構800による動作を模式的に示す。モジュール内のある関数で言語例外が発生すると、言語例外処理機構800が例外処理ライブラリを呼び出す。例外処理ライブラリは、まず、言語例外が発生した関数内で、発生した言語例外に対応する例外ハンドラを探索する。例外ハンドラの探索は、例えば発生した言語例外の型に基づき行うことができる。若し、対応する例外ハンドラが見つかれば当該例外ハンドラに制御を移し、例外ハンドラが見つからなければ、関数の巻き戻しを行う。
関数の巻き戻しとは、呼び出し元関数に戻るための処理を指し、スタックなどに含まれるフレーム情報に基づいて、スタックを呼び出し前の状態に戻し、呼び出し元のアドレスを特定して、そのアドレスに制御を移す。呼び出し元関数に戻ると、例外処理ライブラリは、言語例外に対応する例外ハンドラを探索する。このように、例外処理ライブラリは、言語例外に対応する例外ハンドラが見つかるまで関数の巻き戻しを行って、呼び出し元関数に遡る。
図29の例では、モジュール#1〜#3の3のモジュールが動作し、モジュール#1からモジュール#2、モジュール#3の順にモジュールを呼び出している。モジュール#3の実行中に言語例外が発生し、その言語例外をキャッチする例外ハンドラがモジュール#1にある場合を示している。図中の実線は、プログラムの実行の流れを示し、波線は、言語例外処理機構800が関数の巻き戻しを行う際に探索される関数の順番を示す。
モジュール#3で言語例外が発生すると、処理が言語例外処理機構800に移行する。言語例外処理機構800は、先ず、言語例外が発生したモジュール#3内の関数で、言語例外に対応する例外ハンドラを探索する。この例では、言語例外に対応する例外ハンドラが見つからないため、関数の巻き戻しを行ってモジュール#3内の呼び出し元関数に戻る。同様に、呼び出し元関数でも言語例外に対応する例外ハンドラを探索する。言語例外処理機構800は、言語例外に対応する例外ハンドラが見つかるまで、これを繰り返し行う。
図29の例では、モジュール#3からモジュール#2に戻り、モジュール#2で例外ハンドラを探索する。モジュール#2で例外ハンドラが見つからなければ、さらにモジュール#1に戻って、例外ハンドラを探索する。この例では、モジュール#1の関数まで戻ることで、発生した言語例外に対応する例外ハンドラが探索されている。例外ハンドラが探索されると、言語例外処理機構800は、探索された例外ハンドラに実行制御を移す。
このような言語例外処理機構800による言語例外に対する処理を上述した第1または第2の実施形態に適用する場合について考える。セキュアプロセッサでは、図3を用いて説明したように、各モジュールが別々にスタックを管理するため、モジュール内で関数の巻き戻しを行う場合と、モジュールを跨って関数の巻き戻しを行う場合とでは処理が異なる。モジュール内で関数の巻き戻しを行う場合には、通常通り、そのモジュールのスタックなどを調査することで、その関数の呼び出し元の関数を特定することができる。一方、モジュールを跨って関数の巻き戻しを行う場合には、別のモジュールがそのスタックを直接的に見ることができないため、呼び出し元の関数を特定することができない。したがって、本発明の前提となるセキュアプロセッサでは、複数モジュールで構成されると、従来の言語例外処理機構800の関数の巻き戻しが正しく動作しない場合がある。
図30は、本発明の第3の実施形態に適用可能なシステムの一例の構成を模式的に示す。図30では、概略的なハードウェア構成と、システムビューとを同時に表している。なお、図30において、上述した図1の構成と共通する部分には同一の符号を付し、詳細な説明を省略する。
ターゲットシステムは、ハードウェア的には、図1で説明した構成をそのまま適用できるので、ここでの説明を省略する。ターゲットシステムにおいて、セキュアプロセッサ200のコア210上で単一のOS(オペレーティングシステム)180が動作し、OS180上で1または複数のモジュールが動作する。図30の例では、複数のモジュール(#1)510、モジュール(#2)520、モジュール(#3)530およびモジュール(#4)540が動作している。
図30の例では、モジュール(#1)510は、タスク識別子が「#1」であって、プログラムA(Prg A)から生成されていることが示されている。モジュール(#2)520は、タスク識別子が「#2」であって、プログラムB(Prg B)から生成されている。モジュール(#3)530は、タスク識別子が「#3」であって、プログラムC(Prg C)から生成されている。また、モジュール(#4)540は、タスク識別子が「#4」であって、プログラムBから生成されている。
図31は、本第3の実施形態によるモジュール構成の一例の機能ブロック図を示す。図31において、モジュール(#1)510、モジュール(#2)520およびモジュール(#3)530は、協働して動作し、それぞれ本第3の実施形態によるモジュール切り替え機構を備える。ここでは、モジュール(#1)510がアプリケーションモジュールであり、モジュール(#2)520およびモジュール(#3)530がライブラリモジュールであるものとする。
モジュール(#1)510は、上述の図4の構成と同様に初期化処理部111、プログラム(#1)本体112、切替前処理部104A、切替後処理部106Aおよび切替履歴領域118を備えると共に、例外通知部505Aおよび例外受付部507Aをさらに備える。同様に、モジュール(#2)520は、初期化処理部121、プログラム(#2)本体122、切替前処理部104B、切替後処理部106Bおよび切替履歴領域128を備えると共に、それぞれモジュール(#1)510の例外通知部505Aおよび例外受付部507Aと共通の処理を行う例外通知部505Bおよび例外受付部507Bをさらに備える。また、連携するモジュール(#1)510およびモジュール(#2)520間では、メモリ280上にセキュア共有領域181を共有する。
また、図31では詳細を省略しているが、モジュール(#3)530も、モジュール(#1)510およびモジュール(#2)520と同様の構成を備える。また、モジュール(#3)530も、モジュール(#1)510およびモジュール(#2)520とメモリ280上のセキュア共有領域181を共有する。
図32は、本第3の実施形態を適用したモジュール間で言語例外が発生した場合の一例の処理を、模式的に示す。図32において、長破線は、本第3の実施形態を適用したことによって発生するプログラム実行の流れの例を示す。
以下では、図32に例示されるように、モジュール(#1)510、モジュール(#2)520およびモジュール(#3)530が連係動作し、モジュール(#1)510からモジュール(#2)520を経由してモジュール(#3)530を呼び出す。このとき、モジュール(#2)520から呼び出されたモジュール(#3)において言語例外が発生し、モジュール(#3)530からモジュール(#1)510にある例外ハンドラまで関数を巻き戻す場合を例に説明する。ここで、各モジュール(#1)510、モジュール(#2)520およびモジュール(#3)530は、それぞれ言語例外処理機構800A、800Bおよび800Cを有する。
本第3の実施形態では、第1の実施形態で示したモジュール間の切り替え処理に多少の変更を加えた処理を行うことにより、モジュールを跨いだ関数の巻き戻し処理を実現する。初期化処理は、第1の実施形態で図7および図8を用いて説明した処理と同一の処理を適用可能であるため、ここでの説明を省略する。初期化処理によって、モジュール(#1)510、モジュール(#2)520およびモジュール(#3)530は、メモリ280上に設けられたセキュア共有領域181を共有できるようになる。
また、本第3の実施形態において、言語例外が発生していない通常の状態における、モジュールから他のモジュールを呼び出す際の処理や、他のモジュールを呼び出したモジュールが復帰する際の処理は、上述した第1の実施形態において図6〜図10を用いて説明した処理をそのまま適用可能であるため、ここでの説明を省略する。
図33〜図35を用いて、本第3の実施形態による、モジュールを跨いで関数の巻き戻しを行う際の処理について説明する。図33は、本第3の実施形態による一例の例外通知処理を示すフローチャートである。図34は、本第3の実施形態による一例の例外受付処理を示すフローチャートである。
また、図35は、上述した図11と対応し、言語例外発生の場合の、呼び出し処理および復帰処理、ならびに、言語例外通知処理および言語例外受付処理に伴うセキュア共有領域181、ならびに、各モジュール(#1)510、モジュール(#2)520およびモジュール(#3)530の切替履歴領域の状態の変化を概略的に示す。
モジュール(#1)510から順次モジュールが呼び出され、モジュール(#3)530に実行権が移るまでは、第1の実施形態で図11を用いて説明したのと同様にして、セキュア共有領域181および各切替履歴領域の状態が変化する。図35の例では、初期化処理の直後では、セキュア共有領域181には、実行モジュール識別子「#1」のみが保存されている。また、各切替履歴領域には、何も保存されていない。
この状態からモジュール(#2)520が呼び出されると、セキュア共有領域181の実行モジュール識別子フィールド182および切替フラグフィールド183に対して、それぞれ実行モジュール識別子「#2」、切替フラグ「call」が保存されると共に、切替パラメータフィールド184に対して切替パラメータとして関数名「sub」および引数「5」が保存される。また、切替履歴領域118には呼び出し元アドレスAddr1が、切替履歴領域128にはモジュール識別子「#1」がそれぞれ保存される。モジュール(#3)530の切替履歴領域には何も保存されない。
さらに、モジュール(#3)530が呼び出されると、セキュア共有領域181の実行モジュール識別子フィールド182および切替フラグフィールド183に対して、それぞれ実行モジュール識別子「#3」、切替フラグ「call」が保存されると共に、切替パラメータフィールド184に対して切替パラメータとして関数名「hello」が保存される。また、切替履歴領域118には呼び出し元アドレスAddr1が、切替履歴領域128にはモジュール識別子「#1」および呼び出し元アドレスAddr2が、モジュール(#3)530の切替履歴領域にはモジュール識別子「#2」が、それぞれ保存される。
図33を参照し、モジュール(#3)530において言語例外が発生すると、通常の言語例外と同様に、モジュール(#3)530に含まれる言語例外処理機構800Cに制御を移す。言語例外処理機構800Cは、言語例外が発生した関数から当該言語例外に対応する例外ハンドラを探索する。一例として、言語例外処理機構800Cは、発生した言語例外の型に基づき例外ハンドラを探索することができる。
図32の例では、言語例外処理機構800Cは、当該関数から対応する例外ハンドラを見つけることができない。そのため、言語例外処理機構800Cは、関数の巻き戻しを実行してモジュール(#3)内の呼び出し元関数に戻り、当該呼び出し元関数で例外ハンドラを探索する。この例では、この呼び出し元関数からも例外ハンドラが見つからないため、言語例外処理機構800Cは、モジュール(#3)530の例外通知部に制御を移す。例外通知部505は、モジュール(#3)530の呼び出し元であるモジュール(#2)520に戻るための処理を行う。
図33において、ステップS505−1で、モジュール(#3)530の例外通知部は、モジュール(#3)530の切替履歴領域から、呼び出された際に保存しておいた切り替え元(すなわち、巻き戻し先)のモジュールを示すモジュール識別子「#2」を得る。そして、モジュール(#3)530の切替履歴領域から当該モジュール識別子「#2」を削除する。
次のステップS505−2で、モジュール(#3)530は、セキュア共有領域181にある切替フラグフィールド183に対して、モジュール(#2)520への切り替えの要因が「言語例外」であることを示すフラグexceptionを書く。このフラグexceptionは、換言すれば、通常の呼び出しまたは復帰以外を示す値であるといえる。
次のステップS505−3で、モジュール(#3)530は、セキュア共有領域181の切替パラメータフィールド184に対して、言語例外情報excDataを書く。この言語例外情報excDataには、言語例外の型や言語例外の内容やメッセージなどが含まれる。すなわち、この言語例外情報excDataは、切り替えの要因の内容を示す情報である。
次のステップS505−4で、モジュール(#3)530は、セキュア共有領域181の実行モジュール識別子フィールド182に対して、巻き戻し先のモジュールを示すモジュール識別子「#2」を書く。そして、次のステップS505−5で、モジュール(#3)530は、再度の呼び出しに備え、切り替え後処理の直前で処理を停止し、スリープ状態となる。
ステップS505−5でモジュール(#3)530がスリープ状態になると、実行権がOS180に切り替わる。その後、OS180のスケジューラなどによって実行権がモジュール(#2)520に移り、モジュール(#2)520が実行を再開する。
この時点では、図35に例示されるように、セキュア共有領域181には、例外通知処理で書き込まれた実行モジュール識別子「#2」、切替フラグ「exception」(図35では「exc」と略記)、ならびに、切替パラメータ「excData」が保存されている。また、切替履歴領域118には呼び出し元アドレスAddr1が、モジュール(#2)520の切替履歴領域128には呼び出し元アドレスAddr2とモジュール識別子「#1」とが、それぞれ保存されている。一方、モジュール(#3)530の切替履歴領域には何も保存されない。
モジュール(#2)520は、割り込みなどによりモジュール(#3)530の例外通知部からの例外通知を受け取ると、モジュール(#2)520内の例外受付部507Bに制御を移す。
図34において、例外受付部507は、セキュア共有領域181の実行モジュール識別子フィールド182から、実行モジュール識別子を得る(ステップS507−1)。そして、次ステップS507−2で、獲得した実行モジュール識別子の値がモジュール(#2)520のモジュール識別子「#2」と一致するか否かを判定する。若し、一致しないと判定されたら、処理はステップS507−9に移行され、モジュール(#2)520がスリープ状態とされて、次の呼び出しが待機される。呼び出しがあると、処理がステップS507−1に戻され、処理が再開される。
一方、ステップS507−2で、獲得した実行モジュール識別子の値とモジュール(#2)520のモジュール識別子「#2」とが一致すると判定されたら、処理はステップS507−3に移行される。この例では、セキュア共有領域181のモジュール識別子フィールド182に対して実行モジュール識別子「#2」が保存されており、これは、モジュール(#2)520のモジュール識別子「#2」と一致するため、モジュール(#2)520は実行すべきであると判断でき、処理がステップS507−3に移行される。
ステップS507−3で、モジュール(#2)520は、セキュア共有領域181の切替フラグフィールド183から、切替フラグを取り出し、次のステップS507−4で、獲得した切替フラグの値が例外を示す値「exception」であるか否かを確認する。
切替フラグの値が例外を示す値「exception」であることが確認されたら、次のステップS507−5で、モジュール(#2)520は、切替履歴領域128から、保存しておいた呼び出し元アドレスAddr2を獲得し、獲得した呼び出し元アドレスAddr2を切替履歴領域128から削除する。
そして、次のステップS507−6で、モジュール(#2)520は、セキュア共有領域181の切替パラメータフィールド184から言語例外情報excDataを獲得し、獲得した言語例外情報excDataの値を用いて、呼び出し元アドレスAddr2に対して擬似的に言語例外を発行する。
言語例外が発行されると、モジュール(#2)520は、モジュール(#2)520に含まれる言語例外処理機構800Bに制御を移す。言語例外処理機構800Bは、モジュール(#2)520内で、発生した言語例外に対応する例外ハンドラの探索を行う。若し、当該例外ハンドラが見つかったら、この例外ハンドラによる処理を実行する。一方、当該例外ハンドルが見つからなかった場合には、関数の巻き戻しを実行する。この例では、言語例外処理機構800Bは、モジュール(#2)520内で当該言語例外に対応する例外ハンドラを見つけることができないため、例外通知部505Bに制御を移す。
そして、例外通知部505Bは、上述した、モジュール(#3)530からモジュール(#2)520に言語例外の発生を通知する場合と同様にして、モジュール(#2)520からモジュール(#1)510に対して言語例外の発生を通知する。言語例外の発生がモジュール(#1)510に通知されると、実行制御がモジュール(#1)510に移され、モジュール(#1)510の例外受付部507Aにおいて、擬似的に言語例外が発行される。
この時点では、図35に例示されるように、セキュア共有領域181には、例外通知処理で書き込まれた実行モジュール識別子「#1」、切替フラグ「exception」、ならびに、切替パラメータ「excData」が保存されている。また、各モジュールの切替履歴領域には、何も保存されていない。
言語例外が発行されると、制御がモジュール(#1)510に含まれる言語例外処理機構800Aに移される。言語例外処理機構800Aは、上述したようにして、言語例外に対応する例外ハンドラの探索を行う。この探索によって該当する例外ハンドラを見つけると、当該例外ハンドラに制御を移す。
このように、モジュールの切り替え前後で言語例外用の処理を追加することにより、別々のコンテキストで保護されたモジュール間であって、他のモジュールが直接コンテキストを操作することができなくても、言語例外における関数の巻き戻し処理を実現することができる。
なお、本第3の実施形態では、例外通知部と切替前処理部とを別々に扱ってきたが、これはこの例に限られず、切替前処理部が例外通知部の機能を含むように構成することもできる。すなわち、切替前処理の内部で、通常呼び出しの場合には通常の切り替え前処理を行い、言語例外による呼び出しの場合には例外通知部の機能による処理を行う。
同様に、本第3の実施形態では、例外受付部と切替後処理部とを別々に扱ってきたが、これはこの例に限られず、切替後処理部が例外受付部の機能を含むように構成することもできる。すなわち、切替後処理部の内部で、通常呼び出しの場合には通常の切り替え後処理を行い、言語例外による呼び出しの場合には例外受付部の処理を行う。
また、本第3の実施形態では、各モジュールそれぞれが言語例外処理機構を保持するように説明したが、これはこの例に限定されない。例えば、言語例外処理機構を各モジュール内に保持せずに、モジュールが実行するプラットフォーム内に言語例外処理機構を含んで、各モジュールがそのインスタンスを生成し、実行する形式であってもよい。
さらに、本第3の実施形態では、例外ハンドラを探索するために各モジュールが擬似的に言語例外を発行して言語例外処理機構を呼び出すように説明したが、これはこの例に限定されない。例えば、各モジュールの例外受付部がcall命令といった命令を用いて明示的に言語例外処理機構を呼び出して実行してもよい。
<第4の実施形態>
次に、本発明の第4の実施形態について説明する。本第4の実施形態では、Cライブラリとして提供されている関数setjmpおよび関数longjmpに対する処理について説明する。これら関数setjmpおよび関数longjmpは、関数の外のジャンプする機構を実現するために設けられたものである。
次に、本発明の第4の実施形態について説明する。本第4の実施形態では、Cライブラリとして提供されている関数setjmpおよび関数longjmpに対する処理について説明する。これら関数setjmpおよび関数longjmpは、関数の外のジャンプする機構を実現するために設けられたものである。
図36は、関数setjmp/longjmpによる一例の動作を模式的に示す。図36の例では、3のモジュール#1〜#3が動作し、モジュール#1からモジュール#2、モジュール#3の順にモジュールを呼び出している。モジュール#1の実行途中で関数setjmpを行い、モジュール#3の実行途中で関数longjmpを行っている。
関数setjmpは、関数setjmpが実行された場所でのプログラムカウンタやスタックポインタなどのコンテキスト情報を保持する。関数longjmpは、関数setjmpで保存しておいたコンテキスト情報を用いて、関数setjmpを実行した直前の状態に戻る。図36の例では、関数setjmpでモジュール#1における当該関数setjmpが実行される直前の状態を保存し、関数longjmpでモジュール#3からモジュール#1に戻り、モジュール#1の状態を復元する。このように、関数の外にジャンプする機構は、戻り先のコンテキスト情報を獲得し、現在のコンテキストをそのコンテキスト情報で上書きすることにより実現される。
本発明の前提であるセキュアプロセッサにおいては、図3を用いて説明したように、各モジュールが別々にスタック(コンテキスト)を管理しているため、このような、モジュールを跨って関数外へのジャンプを行う機構が正しく動作しない。
この点についてより具体的に説明する。モジュール内で関数setjmp/longjmpを行う場合であれば、従来通り、関数setjmpでコンテキスト情報を獲得し、関数longjmpで当該コンテキストに切り替えることができる。一方、複数モジュールを跨いで関数setjmp/longjmpを行う場合には、モジュール間で別々にコンテキストが管理されていると、あるモジュールとは別のモジュールのコンテキストを、直接的に上書きすることができない。したがって、モジュールで別々にコンテキスト管理することを前提とした場合、関数setjmpで得たコンテキストに切り替えることができない場合がある。
また、モジュールが個別にコンテキストを管理するため、関数longjmpのようにコンテキストを切り替える場合には、関数setjmpを実行したモジュールから関数longjmpを実行するまでに呼び出したモジュールの全てに対して、コンテキストを関数setjmpを実行する前の状態に戻す必要がある。これは、若し、関数setjmpを実行したモジュールのコンテキストのみを関数longjmpによって変更した場合、それ以外のモジュールは、関数longjmpしたときの状態のコンテキストままとなるからである。
本第4の実施形態は、コンテキストを別々に管理するモジュール間で関数setjmp/longjmpを実現する。本第4の実施形態では、モジュール識別子と、コンテキスト毎にユニークなコンテキスト番号とによってコンテキスト情報を管理し、モジュール間でのコンテキスト情報の直接的なやり取りを行わない。コンテキスト情報には、他のモジュールには秘匿すべき情報が含まれている可能性が多いため、その代わりとなるモジュール識別子とコンテキスト番号とを利用する。
セキュアプロセッサを用いる本第4の実施形態では、関数setjmpに相当するコンテキスト登録処理により、現在のコンテキスト情報を登録してコンテキスト情報を示すコンテキスト番号を取得する。関数longjmpに相当するコンテキスト設定処理により、モジュール識別子およびコンテキスト番号を指定して、登録されたコンテキスト情報におけるコンテキストを設定する。
図37は、本発明の第4の実施形態によるモジュール構成の一例の機能ブロック図を示す。なお、図37において、上述した図1の構成と共通する部分には同一の符号を付し、詳細な説明を省略する。なお、セキュアプロセッサを含むハードウェアの構成は、図1で説明した構成をそのまま適用できるので、ここでの説明を省略する。
図37において、モジュール(#1)910およびモジュール(#2)920は、それぞれ本第4の実施形態によるモジュール切り替え機構を備える。ここでは、モジュール(#1)910がアプリケーションモジュールであり、モジュール(#2)920がライブラリモジュールであるものとする。モジュール(#1)910およびモジュール(#2)920は、後述するモジュール(#3)930と共に、互いに協働して動作する。
モジュール(#1)910は、上述の図4の構成と同様に初期化処理部111、プログラム(#1)本体912、切替前処理部104Aおよび切替履歴領域118を備えると共に、図4の切替後処理部106Aとは部分的に異なる処理を行う切替後処理部906Aを備える。モジュール(#1)910は、さらに、コンテキスト変更通知部905A、コンテキスト変更受付部907Aおよびコンテキスト管理テーブル919を備える。
同様に、モジュール(#2)920は、初期化処理部121、プログラム(#1)本体922、切替前処理部104Bおよび切替履歴領域128を備えると共に、図4の切替後処理部106Bとは部分的に異なる処理を行う切替後処理部906Bを備える。モジュール(#1)910は、さらに、コンテキスト管理テーブル929を備えると共に、モジュール(#1)910のコンテキスト変更通知部905Aおよびコンテキスト変更受付部907Aと共通の処理を行うコンテキスト変更通知部905Bおよびコンテキスト変更受付部907Bを備える。
また、アプリケーションモジュールであるプログラム(#1)本体912は、コンテキスト登録部908およびコンテキスト設定部909Aを含む。一方、ライブラリモジュールであるモジュール(#2)920は、コンテキスト設定部090Bを含み、コンテキスト登録部908を含まない。これは、ライブラリモジュールであるモジュール(#3)930においても同様である。コンテキスト登録部908は、関数setjmpに相当する。コンテキスト設定部909Aは、関数longjmpに相当する。
また、図37では詳細を省略しているが、モジュール(#3)930も、モジュール(#1)910およびモジュール(#2)920と同様の構成を備える。モジュール(#1)910、モジュール(#2)920およびモジュール(#3)930は、メモリ280上にセキュア共有領域181を共有する。
図38は、コンテキスト管理テーブル919および929、ならびに、モジュール(#3)930の図示されないコンテキスト管理テーブルの一例のデータ構成を示す。以下では、特に記載のない限り、コンテキスト管理テーブル919および929、ならびに、モジュール(#3)930の図示されないコンテキスト管理テーブルを、コンテキスト管理テーブルで代表させて説明する。
コンテキスト管理テーブルは、コンテキスト番号を示すインデクスが「#1」から「#n」までのn個のエントリを有する。各エントリは、モジュール識別子フィールドおよびコンテキスト情報フィールドを有する。コンテキスト情報フィールドは、コンテキスト情報としてプログラムカウンタやスタックポインタなどが格納される。
図39〜図44を用いて、本第4の実施形態による、コンテキストの登録/設定を行う際の処理について説明する。ここでは、モジュール(#1)910でコンテキスト登録を実行し、モジュール(#1)910からモジュール(#2)920を呼び出し、さらにモジュール(#2)920からモジュール(#3)930を呼び出す。そして、モジュール(#3)930でコンテキスト設定を実行する例について説明する。なお、各モジュールの初期化処理については、図7および図8を用いて説明した第1の実施形態による処理と同様なので、ここでの詳細な説明を省略する。
図39は、上述した図11に対応し、コンテキスト登録/設定の実行に伴うセキュア共有領域181、ならびに、各モジュール(#1)910、モジュール(#2)920およびモジュール(#3)930の切替履歴領域の状態の変化を概略的に示す。初期化処理が終了した時点では、セキュア共有領域181において実行モジュール識別子フィールド182に対して実行モジュール識別子「#1」が保存され、切替フラグフィールド183および切替パラメータフィールド184には、何も保存されていない。また、各モジュール(#1)910、モジュール(#2)920およびモジュール(#3)930それぞれの切替履歴領域にも、何も保存されていない。
コンテキスト登録処理について説明する。図40は、本第4の実施形態による一例のコンテキスト登録処理を示すフローチャートである。モジュール(#1)910においてプログラム(#1)本体912が実行開始され、関数setjmp相当の処理を行うため、モジュール(#1)910は、コンテキスト登録部908に制御を移す。コンテキスト登録部908は、ステップS908−1で、一般的な関数setjmpと同様に、現在のコンテキスト情報Cを取得する。
次のステップS908−2で、コンテキスト登録部908は、コンテキスト管理テーブル919内の空いているエントリのコンテキスト番号「#m」を決定する。決定されたコンテキスト番号「#m」は、モジュール(#1)910に返される。そして、コンテキスト登録部908は、ステップS908−1で取得したコンテキスト情報Cを、コンテキスト管理テーブル919の当該コンテキスト番号「#m」のエントリにおけるコンテキスト情報フィールドに保存する。
なお、一般的な関数setjmp/longjmpでは、他のモジュールに対して直接的にコンテキストを渡す。これに対して、本第4の実施形態では、コンテキスト管理テーブルによってコンテキストを管理し、他のモジュールには、コンテキスト設定情報を渡す。ここでいうコンテキスト設定情報とは、コンテキスト情報をコンテキスト管理テーブルに登録した際の、当該コンテキストが由来するモジュールを識別するモジュール識別子と、コンテキスト登録部908が決定したコンテスト番号とを指す。
本第4の実施形態では、各モジュールがコンテキストを設定するときは、コンテキスト情報を直接的に指定するのではなく、コンテキスト設定情報を指定する。
次に、モジュールの呼び出し処理について説明する。モジュール(#1)910においてコンテキストの登録が終了された後、モジュール(#1)910からモジュール(#2)920を呼び出し、さらに、モジュール(#2)920からモジュール(#3)930を呼び出す。切替前処理部104Aによる処理は、図9を用いて説明した処理と同様であるので、ここでの詳細な説明を省略する。
切り替え前処理により、呼び出し元のアドレスAddr1と、呼び出し処理を示す切替フラグ「call」と、実行モジュールを示す実行モジュール識別子「#2」とが、セキュア共有領域181も呼び出し元アドレスフィールドAddr1、切替フラグフィールド183および実行モジュール識別子フィールド182に対してそれぞれ書き込まれる。
切替パラメータとして、呼び出し先の関数の関数名「sub」と引数「5」とがセキュア共有領域181の切替パラメーラフィールド183に対して書き込まれる。本第4の実施形態においては、さらに、コンテキスト設定情報、すなわち、コンテキスト登録が実行されたモジュールを示すモジュール識別子「#1」と、コンテキスト番号「#m」とが、セキュア共有領域181の切替パラメーラフィールド183に対して書き込まれる。これにより、呼び出し先のモジュールにおいてコンテキスト設定が実行可能となる。
これらモジュール識別子「#1」およびコンテキスト番号「#m」は、切り替え前処理および切り替え後処理により、呼び出し先のモジュールに対して順次、渡される。
図41は、本第4の実施形態による切り替え後処理を示す一例のフローチャートである。なお、図41において、上述した図10と共通する処理については同一の符号を付し、詳細な説明を省略する。モジュール(#1)910からモジュール(#2)920が呼び出されると、モジュール(#2)920の切替後処理部906Bは、セキュア共有領域181の実行モジュール識別子フィールド182の値が「#2」であることを確認する(ステップS106−1、ステップS106−2)。
次に、切替後処理部106Bは、セキュア共有領域181の切替フラグフィールド183から切替フラグを得る(ステップS106−3)。切替後処理部106Bは、獲得した値「call」から、関数呼び出しが要求されていることが分かる(ステップS106−4)。そして、切替後処理部106Bは、ステップS106−5で切替元モジュール識別子フィールド185からモジュール識別子「#1」を取り出し、切替履歴領域118に保存する。
次のステップS106−6で、切替後処理部106Bは、セキュア共有領域181の切替パラメータフィールド184から、呼び出し情報として書き込まれた関数名「sub」と、引数「5」とを得ると共に、コンテキスト登録処理が実行されたモジュールを示すモジュール識別子「#1」とコンテキスト番号「#m」とを得る。
次のステップS906−7で、切替後処理部906Bは、取得した切替パラメータがコンテキスト設定情報を含むか否かを判定する。若し、含まないと判定されたら、処理はステップS906−9に移行される。一方、含むと判定されたら、処理はステップS906−8に移行される。ステップS906−8で、切替後処理部906Bは、図41のステップS106−6で取得された切替パラメータのうち、コンテキスト設定情報に含まれる各情報を、コンテキスト管理テーブル929に保存する。
より具体的には、ステップS906−8において、コンテキスト設定情報に含まれるモジュール識別子およびコンテキスト番号がコンテキスト管理テーブル929に保存される。それと共に、後述するコンテキスト設定処理により呼び出し元のモジュールに戻るためのコンテキスト情報を、コンテキスト管理テーブル929のコンテキスト情報フィールドに保存する。このコンテキスト情報は、後述するコンテキスト変更通知処理により用いられる。
この時点では、図39に例示されるように、セキュア共有領域181には、切り替え前処理で書き込まれた実行モジュール識別子「#2」および切替フラグ「call」が保存されている。それと共に、セキュア共有領域181には、切替パラメータとして、関数名「sub」および引数「5」、ならびに、モジュール識別子「#1」およびコンテキスト番号「#m」が保存されている。また、モジュール(#1)910の切替履歴領域118には呼び出し元アドレスAddr1が保存され、モジュール(#2)920の切替履歴領域128にはモジュール識別子「#1」が保存されている。
次のステップS906−9で、切替後処理部906Bは、上述のステップS106−6で取得した切替パラメータのうち、呼び出し先の関数名「sub」と引数「5」に基づき、プログラム(#2)本体122における関数「sub」の実行を開始させる。
モジュール(#2)920からモジュール(#3)930を呼び出す際にも、同様の処理を行う。モジュール(#3)930の呼び出しまで完了すると、モジュール(#1)910、モジュール(#2)920およびモジュール(#3)930それぞれのコンテキスト管理テーブルは、モジュール識別子「#1」、コンテキスト番号「#m」のエントリが含まれる状態になる。
また、コンテキスト管理テーブル919には、図40に示した処理に従いコンテキスト登録を行った時点のコンテキスト情報が保存される。さらに、コンテキスト管理テーブル929およびモジュール(#3)930のコンテキスト管理テーブルには、それぞれが呼び出し元のモジュールに戻るためのコンテキスト情報が含まれる。
この時点では、図39に例示されるように、セキュア共有領域181には、切り替え前処理で書き込まれた実行モジュール識別子「#3」および切替フラグ「call」が保存されている。それと共に、セキュア共有領域181には、切替パラメータとして、関数名「hello」、ならびに、モジュール識別子「#1」およびコンテキスト番号「#m」が保存されている。また、モジュール(#2)920の切替履歴領域128には、モジュール識別子「#1」および呼び出し元アドレスAddr2が保存される。モジュール(#3)930の切替履歴領域には、モジュール識別子「#2」が保存されている。モジュール(#1)910の切替履歴領域118には、呼び出し元アドレスAddr1が保存される。
次に、コンテキスト設定処理について説明する。この例では、図36に例示されるように、モジュール(#3)930においてコンテキスト設定処理が実行される。
図42は、第4の実施形態による一例のコンテキスト設定処理を示すフローチャートである。ステップS909−1で、モジュール(#3)930のコンテキスト設定部は、図41のステップS106−5でセキュア共有領域181から取得した切替パラメータ中の、コンテキスト設定情報に含まれるモジュール識別子「#1」およびコンテキスト番号「#m」に基づき、モジュール(#3)930のコンテキスト管理テーブルを参照する。そして、これらモジュール識別子「#1」およびコンテキスト番号「#m」に対応するコンテキスト情報を取得する。それと共に、当該コンテキスト情報を、コンテキスト管理テーブルから削除する。
次のステップS909−2で、モジュール(#3)930のコンテキスト設定部は、ステップS909−1で取得したコンテキスト情報を、モジュール(#3)930における現在のコンテキスト情報に対して上書きする。この場合、ステップS909−1で取得したコンテキスト情報は、モジュール(#3)930の呼び出し元であるモジュール(#2)920に戻るためのものである。そのため、モジュール(#3)930は、モジュール(#3)930のコンテキスト変更通知部に制御を移す。
図43は、第4の実施形態による一例のコンテキスト変更通知処理を示すフローチャートである。ステップS905−1で、コンテキスト変更通知部は、モジュール(#3)930の切替履歴領域から、モジュール(#2)920から呼び出された際に保存しておいた呼び出し元のモジュールを示すモジュール識別子「#2」を取り出し、当該切替履歴領域から、獲得したモジュール識別子を削除する。
次のステップS905−2で、モジュール(#3)930のコンテキスト変更通知部は、セキュア共有領域181の切替フラグフィールド183に対し、モジュール切替の要因が「コンテキスト設定」であることを示す切替フラグ「Lj」を書く。この切替フラグ「Lj」は、換言すれば、通常の呼び出し、呼び出し復帰または言語例外以外を示す値といえる。さらに、コンテキスト変更通知部は、ステップS905−3で、切替パラメータフィールド184に対して、モジュール識別子「#1」とコンテキスト番号「#m」とを、コンテキスト設定情報として書く。このコンテキスト設定情報は、換言すれば、モジュール切替の要因を示す情報といえる。
次のステップS905−4で、モジュール(#3)930のコンテキスト変更通知部は、セキュア共有領域181の実行モジュール識別子フィールド182に対し、呼び出し元のモジュールを示すモジュール識別子「#2」を書く。さらに、モジュール(#3)930のコンテキスト変更通知部は、ステップS905−6で、モジュール(#3)930をスリープ状態とする。切り替え後処理の直前でスリープ状態として処理を停止させることで、再度の呼び出しに備える。
この時点では、図39に例示されるように、セキュア共有領域181には、コンテキスト変更通知処理で書き込まれた実行モジュール識別子「#2」、切替フラグ「Lj」が保存されていると共に、切替パラメータとしてモジュール識別子「#1」とコンテキスト番号「#m」とが保存されている。また、モジュール(#1)910の切替履歴領域118には呼び出し元アドレスAddr1が、モジュール(#2)920の切替履歴領域128には呼び出し元アドレスAddr2が、それぞれ保存されている。一方、モジュール(#3)930の切替履歴領域には、何も保存されていない。
ステップS905−5でモジュール(#3)930がスリープ状態となると、実行権がOSに切り替わる。その後、OSのスケジューラなどによって実行権がモジュール(#2)920に移り、モジュール(#2)920が実行を再開する。モジュール(#2)920は、実行が再開され呼び出し元のモジュール(#3)930のコンテキスト変更通知部から変更通知を受けとると、制御をコンテキスト変更受付部907Bに移す。
図44は、第4の実施形態による一例のコンテキスト変更受付処理を示すフローチャートである。コンテキスト変更受付部907Bは、ステップS907−1で、セキュア共有領域181の実行モジュール識別子フィールド182から実行モジュール識別子を得る。次のステップS907−2で、コンテキスト変更受付部907Bは、獲得した実行モジュール識別子の値が、モジュール(#2)920のモジュール識別子「#2」と一致するか否かを判定する。もし、一致しないと判定されたら、処理はステップS907−9に移行され、モジュール(#2)920がスリープ状態とされて、次の呼び出しが待機される。呼び出しがあると、処理がステップS907−1に戻され、処理が再開される。
一方、ステップS907−2で、獲得した実行モジュール識別子の値とモジュール(#2)920のモジュール識別子「#2」とが一致すると判定されたら、処理はステップS907−3に移行される。この例では、セキュア共有領域181のモジュール識別子フィールド182に対して実行モジュール識別子「#2」が保存されており、これは、モジュール(#2)920のモジュール識別子「#2」と一致する。したがって、モジュール(#2)920を実行すべきであると判断でき、処理がステップS907−3に移行される。
ステップS907−3で、コンテキスト変更受付部907Bは、セキュア共有領域181の切替フラグフィールド183から切替フラグを取り出し、次のステップS907−4で、獲得した切替フラグの値がモジュール切替の要因が「コンテキスト設定」であることを示す値「Lj」であるか否かを確認する。切替フラグの値が値「Lj」であることが確認されたら、処理はステップS907−5に移行される。
ステップS907−5で、コンテキスト変更受付部907Bは、セキュア共有領域181の切替パラメータフィールド184からコンテキスト設定情報を取得する。その後、コンテキスト設定部909Bに制御を移す。
図42を参照し、ステップS909−1で、コンテキスト設定部909Bは、セキュア共有領域181に保存される切替パラメータ中の、コンテキスト設定情報に含まれるモジュール識別子「#1」およびコンテキスト番号「#m」に基づき、コンテキスト管理テーブル929を参照する。そして、これらモジュール識別子「#1」およびコンテキスト番号「#m」に対応するコンテキスト情報を取得する。それと共に、当該コンテキスト情報を、コンテキスト管理テーブルから削除する。
次のステップS909−2で、モジュール(#2)920は、ステップS909−1で取得したコンテキスト情報がモジュール(#2)920の呼び出し元であるモジュール(#1)910に戻るための情報であるため、コンテキスト設定部909Bからコンテキスト変更通知部905Bに制御を移す。
図43を参照し、コンテキスト変更通知部905Bは、上述したモジュール(#3)930のコンテキスト変更通知部による処理と同様の処理を行い、セキュア共有領域181の切替フラグフィールド183に対して切替フラグ「Lj」を、切替パラメータフィールド184に対してモジュール識別子「#1」とコンテキスト番号「#m」とを、実行モジュール識別子フィールド182に対して、呼び出し元のモジュールを示すモジュール識別子「#1」を、それぞれ書く。そして、コンテキスト変更通知部905Bは、モジュール(#2)920をスリープ状態とする(図43のステップS905−1〜ステップS905−6参照)。
この時点では、図39に例示されるように、セキュア共有領域181には、コンテキスト変更通知処理で書き込まれた実行モジュール識別子「#1」、切替フラグ「Lj」が保存されていると共に、切替パラメータとしてモジュール識別子「#1」とコンテキスト番号「#m」とが保存されている。また、モジュール(#1)910の切替履歴領域118には呼び出し元アドレスAddr1が保存されている。一方、他のモジュールの切替履歴領域には、何も保存されていない。
モジュール(#2)920がスリープ状態となると、実行権がOSに切り替わる。その後、OSのスケジューラなどによって実行権がモジュール(#1)910に移り、モジュール(#1)910が実行を再開する。モジュール(#1)910は、実行が再開され呼び出し元のモジュール(#2)920のコンテキスト変更通知部から変更通知を受けとると、制御をコンテキスト変更受付部907Aに移す。
コンテキスト変更受付部907Aは、上述したモジュール(#2)920のコンテキスト変更受付部907Bと同様の処理を行う。図44を参照し、コンテキスト変更受付部907Aは、セキュア共有領域181の実行モジュール識別子フィールド182の値が「#1」であることを確認する(ステップS907−1、ステップS907−2)。
次に、コンテキスト変更受付部907Bは、セキュア共有領域181の切替フラグフィールド183から切替フラグを獲得し、獲得した切替フラグの値がモジュール切替の要因が「コンテキスト設定」であることを示す値「Lj」であることを確認する(ステップS907−3、ステップS907−4)。
次のステップS907−5で、コンテキスト変更受付部907Aは、セキュア共有領域181の切替パラメータフィールド184から切替パラメータに含まれるコンテキスト設定情報を得て、コンテキスト設定情報からモジュール識別子とコンテキスト番号とを獲得する。そして、コンテキスト設定情報から獲得したモジュール識別子とコンテキスト番号とを指定して、コンテキスト設定部909Aに制御を移す。
図42を参照し、ステップS909−1で、コンテキスト設定部90Aは、セキュア共有領域181に保存される切替パラメータ中の、コンテキスト設定情報に含まれるモジュール識別子「#1」およびコンテキスト番号「#m」に基づきコンテキスト管理テーブル919を参照する。そして、コンテキスト管理テーブル919から、これらモジュール識別子「#1」およびコンテキスト番号「#m」に対応するコンテキスト情報を取得し、当該コンテキスト情報を、コンテキスト管理テーブルから削除する。
ステップS909−1で取得したコンテキスト情報は、モジュール(#1)910内でコンテキスト登録処理によりコンテキストを登録した場所のものである。そのため、次のステップS909−2で、モジュール(#1)910は、実行位置がコンテキスト登録処理で登録された場所まで戻り、実行を再開する。
このように、コンテキスト登録を行ったモジュールでは、コンテキスト登録した時点でのコンテキスト情報を保存しておく。また、コンテキスト登録を行った以外のモジュールでは、コンテキスト設定のための値を書いて、呼び出し元に実行を切り替える際の切り替え前処理におけるコンテキスト情報を保存する。これにより、コンテキスト設定で戻るときには、コンテキスト管理テーブルに保存されるコンテキスト情報で上書きし続けるだけで、コンテキストを登録した場所に戻れることが可能とされる。
なお、本第4の実施形態では、コンテキスト変更通知部と切替前処理部とを別々に扱ってきたが、これはこの例に限られず、切替前処理部がコンテキスト変更通知部の機能を含むように構成することもできる。すなわち、切替処理部の内部で、通常呼び出しの場合には通常の切り替え前処理を行い、コンテキスト設定であればコンテキスト変更通知部の機能による処理を行う。
同様に、本第4の実施形態では、コンテキスト変更受付部と切替後処理部とを別々に扱ってきたが、これはこの例に限定されず、切替後処理部がコンテキスト変更受付部の機能を含むように構成することもできる。すなわち、切替後処理部の内部で、通常呼び出しの場合には通常の切り替え後処理を行い、コンテキスト設定であればコンテキスト変更受付部の機能による処理を行う。
また、本第4の実施形態では、コンテキスト管理テーブルをモジュール単位で保持するように説明したが、これはこの例に限定されない。例えば、セキュア共有領域と同じように、連携するモジュール間で共有する領域にコンテキスト管理テーブルを設けることも可能である。さらに、本第4の実施形態では、モジュール識別子とコンテキスト番号によりコンテキスト情報を管理しているが、これはこの例に限定されない。すなわち、モジュール識別子とコンテキスト番号は、モジュール間でユニークな値を1つ持つ方法であってもよい。
<第5の実施形態>
次に、本発明の第5の実施形態について説明する。本第5の実施形態は、上述した第4の実施形態の、Cライブラリとして提供されている関数setjmpおよび関数longjmpに対する処理についての変形例である。ここでは、上述と同様に、アプリケーションモジュールであるモジュール#1でコンテキストを登録し、それぞれライブラリモジュールであるモジュール#2を経由して、モジュール#3でコンテキストを設定する場合を例に説明する。
次に、本発明の第5の実施形態について説明する。本第5の実施形態は、上述した第4の実施形態の、Cライブラリとして提供されている関数setjmpおよび関数longjmpに対する処理についての変形例である。ここでは、上述と同様に、アプリケーションモジュールであるモジュール#1でコンテキストを登録し、それぞれライブラリモジュールであるモジュール#2を経由して、モジュール#3でコンテキストを設定する場合を例に説明する。
本第5の実施形態では、上述の第4の実施形態と同様に、モジュール識別子とコンテキスト番号とによりコンテキスト情報を管理する。また、本第5の実施形態では、関数setjmp相当のコンテキスト登録処理により、コンテキスト情報を示すコンテキスト番号を取得し、関数longjmp相当のコンテキスト設定処理により、モジュール識別子およびコンテキスト番号を指定して、コンテキストを切り替える。
図45は、本発明の第5の実施形態によるモジュール構成の一例の機能ブロック図を示す。なお、図45において、上述した図37の構成と共通する部分には同一の符号を付し、詳細な説明を省略する。なお、セキュアプロセッサを含むハードウェアの構成は、図1で説明した構成をそのまま適用できるので、ここでの説明を省略する。
図45において、モジュール(#1)710およびモジュール(#2)720は、それぞれ本第5の実施形態によるモジュール切り替え機構を備える。ここでは、モジュール(#1)710がアプリケーションモジュールであり、モジュール(#2)720がライブラリモジュールであるものとする。モジュール(#1)710およびモジュール(#2)720は、後述するモジュール(#3)730と共に、互いに協働して動作する。
モジュール(#1)710は、初期化処理部111、プログラム(#1)本体712、切替前処理部104A、切替後処理部706A、切替履歴領域118、コンテキスト変更通知部905A、コンテキスト変更受付部 907Aおよびコンテキスト管理テーブル719を備える。また、プログラム(#1)本体712は、コンテキスト登録部908およびコンテキスト設定部702Aを備える。コンテキスト登録部908は、関数setjmpに相当し、コンテキスト設定部702Aは、関数longjmpに相当する。
これらのうち、コンテキスト設定部702Aおよびコンテキスト管理テーブル719は、図37を用いて説明した、第4の実施形態におけるコンテキスト設定部902Aおよびコンテキスト管理テーブル919にそれぞれ対応し、一部の機能が異なる。
同様に、モジュール(#2)720は、初期化処理部121、プログラム(#1)本体722、切替前処理部104B、切替後処理部106B、切替履歴領域128、コンテキスト変更通知部905B、コンテキスト変更受付部907Bおよびコンテキスト管理テーブル729を備える。また、プログラム(#1)本体722は、コンテキスト設定部702Bを備える。コンテキスト設定部702Bは、関数longjmpに相当する。
上述のモジュール(#1)710と同様に、これらのうち、コンテキスト設定部702Bおよびコンテキスト管理テーブル729は、図37を用いて説明した、第4の実施形態におけるコンテキスト設定部902Bおよびコンテキスト管理テーブル929にそれぞれ対応し、一部の機能が異なる。
また、図45では詳細を省略しているが、モジュール(#3)730も、モジュール(#2)720と同様の構成を備え、プログラム(#3)本体がコンテキスト設定部を有する(図示しない)。モジュール(#1)710、モジュール(#2)720およびモジュール(#3)730は、メモリ280上に例えば領域Sh_mem1としてセキュア共有領域181を共有する。
図46は、コンテキスト管理テーブル719および729、ならびに、モジュール(#3)730の図示されないコンテキスト管理テーブルの一例のデータ構成を示す。以下では、特に記載のない限り、コンテキスト管理テーブル719および729、ならびに、モジュール(#3)730の図示されないコンテキスト管理テーブルを、コンテキスト管理テーブルで代表させて説明する。
コンテキスト管理テーブルは、コンテキスト番号を示すインデクスが「#1」から「#n」までのn個のエントリを有する。各エントリは、コンテキスト情報フィールドを有する。コンテキスト情報フィールドは、コンテキスト情報としてプログラムカウンタやスタックポインタなどが格納される。
図43、図44、図47および図48を用いて、本第5の実施形態による、コンテキスト登録/設定を行う際の処理について説明する。ここでは、モジュール(#1)710でコンテキスト登録を実行し、モジュール(#1)710からモジュール(#2)720を呼び出し、さらにモジュール(#2)720からモジュール(#3)730を呼び出す。そして、モジュール(#3)730でコンテキスト設定を実行する例について説明する。なお、各モジュールの初期化処理については、図7および図8を用いて説明した第1の実施形態による処理と同様なので、ここでの詳細な説明を省略する。
図47は、上述した図11に対応し、コンテキスト登録/設定の実行に伴うセキュア共有領域181、ならびに、各モジュール(#1)710、モジュール(#2)720およびモジュール(#3)730の切替履歴領域の状態の変化を概略的に示す。初期化処理が終了した時点では、セキュア共有領域181において実行モジュール識別子フィールド182に対して実行モジュール識別子「#1」が保存され、切替フラグフィールド183および切替パラメータフィールド184には、何も保存されていない。また、各モジュール(#1)710、モジュール(#2)720およびモジュール(#3)730それぞれの切替履歴領域には、何も保存されていない。
先ず、アプリケーションモジュールであるモジュール(#1)710においてコンテキストの登録処理が行われる。このコンテキスト登録処理は、図40を用いて説明した、第4の実施形態によるコンテキスト登録処理と同一の手順により行われる。このとき、コンテキスト管理テーブル719のエントリ(#m)に対して、コンテキスト登録処理を実行した際のコンテキストが登録される。
モジュール(#1)710においてコンテキストの登録が終了された後、モジュール(#1)710からモジュール(#2)720を呼び出し、さらに、モジュール(#2)720からモジュール(#3)730を呼び出す。モジュール(#1)710からモジュール(#2)720を呼び出す際の切替前処理部104Aによる処理、ならびに、モジュール(#2)720からモジュール(#3)730を呼び出す際の切替前処理部104Bによる処理は、図7を用いて説明した処理と同様であるので、ここでの詳細な説明を省略する。
切り替え前処理により、呼び出し元のアドレスAddr1と、呼び出し処理を示す切替フラグ「call」と、実行モジュールを示す実行モジュール識別子「#2」とが、セキュア共有領域181も呼び出し元アドレスフィールドAddr1、切替フラグフィールド183および実行モジュール識別子フィールド182に対してそれぞれ書き込まれる。
切替パラメータとして、呼び出し先の関数の関数名「sub」と引数「5」とがセキュア共有領域181も切替パラメーラフィールド183に対して書く。本第5の実施形態においては、さらに、コンテキスト設定情報、すなわち、コンテキスト登録が実行されたモジュールを示すモジュール識別子「#1」と、コンテキスト番号「#m」とが、セキュア共有領域181の切替パラメーラフィールド183に対して書き込まれる。これにより、呼び出し先のモジュールにおいてコンテキスト設定が実行可能となる。
これらモジュール識別子「#1」およびコンテキスト番号「#m」は、切り替え前処理および切り替え後処理により、呼び出し先のモジュールに対して順次、渡される。
切替前処理部104Aまたは切替前処理部104Bにおける切り替え前処理が終了すると、呼び出し先のモジュールが呼び出され、実行するモジュールが切り替えられる。呼び出されたモジュールに制御が移ると、当該モジュールにおいて切り替え後処理が行われる。切り替え後処理は、上述の第4の実施形態において、図41を用いて第1の実施形態による処理と同様であるとして説明した処理と異なるところがないため、ここでの詳細な説明を省略する。
モジュールの呼び出し処理に伴うセキュア共有領域181および各モジュールの切替履歴領域の状態の変化について、図47を参照しながら説明する。モジュール(#1)710からモジュール(#2)720に制御が切り替わり、モジュール(#2)720において切り替え後処理が終了した時点では、セキュア共有領域181に対して、実行モジュール識別子「#2」および切替フラグ「call」が保存されている。それと共に、セキュア共有領域181に対して、切替パラメータとして、関数名「sub」および引数「5」、ならびに、モジュール識別子「#1」およびコンテキスト番号「#m」が保存されている。また、モジュール(#1)710の切替履歴領域118には呼び出し元アドレスAddr1が保存され、モジュール(#2)720の切替履歴領域128にはモジュール識別子「#1」が保存されている。
また、モジュール(#2)720からモジュール(#3)730に制御が切り替わり、モジュール(#3)730において切り替え後処理が終了した時点では、セキュア共有領域181に、実行モジュール識別子「#3」および切替フラグ「call」が保存される。それと共に、セキュア共有領域181の切替パラメータに、関数名「hello」、ならびに、モジュール識別子「#1」およびコンテキスト番号「#m」が保存される。また、モジュール(#2)720の切替履歴領域128には、モジュール識別子「#1」および呼び出し元アドレスAddr2が保存される。モジュール(#3)730の切替履歴領域には、モジュール識別子「#2」が保存されている。モジュール(#1)710の切替履歴領域118には、呼び出し元アドレスAddr1が保存される。
このとき、モジュール(#1)710のコンテキスト管理テーブル719は、コンテキスト番号「#m」のエントリが含まれる状態となる。一方、モジュール(#2)720およびモジュール(#3)730それぞれのコンテキスト管理テーブルは、何も含まない状態である。本第5の実施形態は、この点で、上述した第4の実施形態と異なる。
次に、本第5の実施形態によるコンテキスト設定処理について説明する。この例では、図36に例示されるように、モジュール(#3)730においてコンテキスト設定処理が実行される。
図48は、第5の実施形態によるコンテキスト設定処理を示す一例のフローチャートである。先ず、モジュール(#3)730のコンテキスト設定部は、呼び出し元のモジュールから、セキュア共有領域181を介して渡されたコンテキスト設定情報(モジュール識別子およびコンテキスト番号)を用いて、コンテキスト設定処理を実行する。先ず、ステップS707−1で、モジュール識別子の値が自身のモジュールを示すモジュール識別子の値と一致しているか否かを判定する。若し、モジュール識別子の値と自身のモジュールを示すモジュール識別子の値とが一致していると判定されたら、処理はステップS707−2に移行される。
ステップS707−2では、コンテキスト番号に対応するコンテキスト情報を取得すると共に、当該コンテキスト情報を、コンテキスト管理テーブルから削除する。そして、次のステップS707−3で、モジュール(#3)730のコンテキスト設定部は、ステップS707−1で取得したコンテキスト情報を、モジュール(#3)730における現在のコンテキスト情報に対して上書きする。
一方、ステップS707−1で、モジュール識別子が自身のモジュールを示していないと判定されたら、処理はステップS707−4に移行される。この場合、呼び出し元のモジュールに戻る必要があると判断できる。そこで、ステップS707−4で、モジュール(#3)730のコンテキスト設定部は、モジュール(#3)730のスタックなどのコンテキストを、切り替え直後の状態に戻す。そして、制御をモジュール(#3)730のコンテキスト変更通知部に移す。
この例では、モジュール識別子「#1」が自身のモジュールを示すモジュール識別子「#3」と異なっているため、処理がステップS707−4に移行され、モジュール(#3)730のスタックなどのコンテキストを、切り替え前の状態に戻す。そして、制御をモジュール(#3)のコンテキスト変更通知部に移す。モジュール(#3)730のコンテキスト変更通知部による処理は、図43を用いて説明した、第4の実施形態によるコンテキスト変更通知部による処理と同一であるので、ここでの説明を省略する。
この時点では、図47に例示されるように、セキュア共有領域181には、コンテキスト変更通知処理で書き込まれた実行モジュール識別子「#2」、切替フラグ「Lj」が保存されていると共に、切替パラメータとしてモジュール識別子「#1」とコンテキスト番号「#m」とが保存されている。また、モジュール(#1)710の切替履歴領域118には呼び出し元アドレスAddr1が、モジュール(#2)720の切替履歴領域128には呼び出し元のモジュール識別子「#1」が、それぞれ保存されている。一方、モジュール(#3)730の切替履歴領域には、何も保存されていない。
モジュール(#3)730がスリープ状態となると(図43のステップS905−5参照)、実行権がOSに切り替わる。その後、OSのスケジューラなどによって実行権がモジュール(#2)720に移り、モジュール(#2)720が実行を再開する。モジュール(#2)720は、実行が再開され呼び出し元のモジュール(#3)730のコンテキスト変更通知部から変更通知を受けとると、制御をコンテキスト変更受付部907Bに移す。
コンテキスト変更受付部907Bによる処理は、図44を用いて説明した、第4の実施形態によるコンテキスト変更受付部での処理と同一であるので、ここでの説明を省略する。最後に、コンテキスト変更通知部907Bは、取得した切替パラメータに含まれるコンテキスト設定情報を指定して、コンテキスト設定部702Bに制御を移す(図44のステップS907−5参照)。
図48を参照し、コンテキスト設定部702Bは、ステップS707−1で、コンテキスト変更受付部907Bで取得された切替パラメータから獲得したモジュール識別子が値「#1」であり、自身のモジュールを示すモジュール識別子が値「#2」であって、両者は一致しないため、処理がステップS707−4に移行されることになる。
ステップS707−4で、コンテキスト設定部702Bは、モジュール(#2)720のスタックなどのコンテキストを、切り替え直後の状態に戻す。そして、制御をモジュール(#2)720のコンテキスト変更通知部905Bに移す。コンテキスト変更通知部905Bによる処理は、図43を用いて説明した、第4の実施形態によるコンテキスト変更通知部での処理と同一なので、ここでの説明を省略する。
この時点では、図47に例示されるように、セキュア共有領域181には、コンテキスト変更通知処理で書き込まれた実行モジュール識別子「#1」、切替フラグ「Lj」が保存されていると共に、切替パラメータとしてモジュール識別子「#1」とコンテキスト番号「#m」とが保存されている。また、モジュール(#1)710の切替履歴領域118には、呼び出し元アドレスAddr1が保存されている。一方、モジュール(#2)720およびモジュール(#3)730の各切替履歴領域には、何も保存されていない。
モジュール(#2)720がスリープ状態となると(図43のステップS905−5参照)、実行権がOSに切り替わる。その後、OSのスケジューラなどによって実行権がモジュール(#1)710に移り、モジュール(#1)710が実行を再開する。モジュール(#1)710は、実行が再開され呼び出し元のモジュール(#2)720のコンテキスト変更通知部から変更通知を受けとると、制御をコンテキスト変更受付部907Aに移す。
コンテキスト変更受付部907Aによる処理は、図44を用いて説明した、第4の実施形態によるコンテキスト変更受付部での処理と同一であるので、ここでの説明を省略する。最後に、コンテキスト変更通知部907Aは、取得した切替パラメータに含まれるコンテキスト設定情報を指定して、コンテキスト設定部702Aに制御を移す(図44のステップS907−5参照)。
図48を参照し、コンテキスト設定部702Aは、呼び出し元のモジュールから、セキュア共有領域181を介して渡されたコンテキスト設定情報に含まれるモジュール識別子の値が、自身のモジュールを示すモジュール識別子の値と一致しているか否かを判定する。この場合には、コンテキスト設定情報に含まれるモジュール識別子が値「#1」であり、モジュール(#1)710を示すモジュール識別子が値「#1」であるので、両者が一致する。そのため、コンテキスト設定部702Aは、自身のモジュール内で発行されたコンテキスト登録の時点まで戻るべきと判断できる。
処理はステップS707−2に移行され、コンテキスト設定部702Aは、コンテキスト設定情報からコンテキスト番号を取り出し、コンテキスト管理テーブル919から、獲得したコンテキスト番号に対応するコンテキスト情報を取得する。そして、コンテキスト設定部702Aは、コンテキスト管理テーブル919から、獲得したコンテキスト情報を削除する。そして、次のステップS707−3で、コンテキスト設定部702Aは、ステップS707−2で取得したコンテキスト情報を、モジュール(#1)710における現在のコンテキスト情報に対して上書きし、コンテキスト登録を行った場所まで戻る。
このように、本第5の実施形態では、コンテキスト登録において、コンテキストの代わりにコンテキスト設定情報としてモジュール識別子とコンテキスト番号を提供する。そして、コンテキスト設定において、コンテキスト登録で提供されたコンテキスト設定情報に含まれるモジュール識別子とコンテキスト番号とを指定し、呼び出し元に順番に戻っていく。これにより、個別にコンテキストを持ち保護されたモジュール間であっても、関数setjmp/longjmpに相当する機能を実現できる。
なお、本第5の実施形態では、コンテキスト変更通知部と切替前処理部とを別々に扱ってきたが、これはこの例に限られず、切替前処理部がコンテキスト変更通知部の機能を含むように構成することもできる。すなわち、切替処理部の内部で、通常呼び出しの場合には通常の切り替え前処理を行い、コンテキスト設定であればコンテキスト変更通知部の処理を行う。
また、本第5の実施形態では、コンテキスト変更受付部と切替後処理部とを別々に扱ってきたが、切替後処理部がコンテキスト変更受付部の機能を含むように構成することもできる。すなわち、切替後処理部の内部で、通常呼び出しの場合には通常の切り替え切替後を行い、コンテキスト設定であればコンテキスト変更受付部の機能による処理を行う。
また、本第5の実施形態では、コンテキスト管理テーブルをモジュール単位で保持するように説明したが、これはこの例に限定されない。例えば、セキュア共有領域と同様に、連携するモジュール間で共有する領域にコンテキスト管理テーブルを設けるようにすることも可能である。
さらに、本第5の実施形態では、モジュール識別子とコンテキスト番号とによりコンテキスト情報を管理するように説明したが、これはこの例に限定されない。すなわち、このモジュール識別子とコンテキスト番号は、モジュール間でユニークな値を持つためのものであればよく、2つの番号を持たない方法が考えられる。例えば、初期化処理において、モジュール間で利用するコンテキスト番号の範囲を決定し、モジュール#1はコンテキスト番号#1〜#100を、モジュール#2はコンテキスト番号#101〜#200を利用して、コンテキスト番号のみを利用する方法が考えられる。
また、各モジュールが利用するコンテキスト番号は、初期化処理で決定するだけでなく、各モジュールが利用しているコンテキスト番号から衝突しないように調整して、コンテキスト番号を決定する方法であってもよい。
<各実施形態の他の対応>
上述の各実施形態の他の対応によれば、プログラムは、第1処理ステップが自モジュールから他のモジュールへの動作の切替を行う直前に、切替の要因が呼び出しによるものである場合に、呼び出し元のアドレスを切替履歴領域に保存し、第2処理ステップが他のモジュールからの動作の切替が行われた直後に、切替フラグが呼び出し復帰を示す場合に、切替履歴領域から呼び出し元のアドレスを取得し、そのアドレスから実行を再開することを特徴とする。
上述の各実施形態の他の対応によれば、プログラムは、第1処理ステップが自モジュールから他のモジュールへの動作の切替を行う直前に、切替の要因が呼び出しによるものである場合に、呼び出し元のアドレスを切替履歴領域に保存し、第2処理ステップが他のモジュールからの動作の切替が行われた直後に、切替フラグが呼び出し復帰を示す場合に、切替履歴領域から呼び出し元のアドレスを取得し、そのアドレスから実行を再開することを特徴とする。
また、プログラムは、初期化ステップがモジュールの識別子をマイクロプロセッサがモジュールを識別するためのタスク識別子を用いて決定することを特徴とする。
また、プログラムは、初期化ステップがモジュールの識別子を乱数を用いて決定すると共に、連携するモジュール間で識別子が重複しないことを確認することを特徴とする。
また、プログラムは、第1処理ステップが自モジュールから他のモジュールへの切替を行う直前に、共有鍵を指定して切替フラグおよび切替パラメータをそれぞれ暗号化して共有領域に格納し、第2処理ステップが他のモジュールから自モジュールへの切替が行われた直後に、共有鍵を指定して共有領域に格納される切替フラグおよび切替パラメータを復号し、復号された切替フラグおよび切替パラメータとに従い自モジュール内の機能を実行させることを特徴とする。
また、共有領域と共有領域へのアクセスを制御するアクセス制御部がマイクロプロセッサ上に設けられ、プログラムは、アクセス制御部を介して共有領域にアクセスすることを特徴とする。
また、共有領域と共有領域へのアクセスを制御するアクセス制御部が、マイクロプロセッサ上で動作し、連携するモジュールを複数動作させる仮想マシンモニタ上に設けられ、プログラムは、仮想マシンモニタからアクセス制御部を介して共有領域にアクセスすることを特徴とする。
104A,104B,104C 切替前処理部
106A,106B,106C,906A,906B 切替後処理部
111,121 初期化処理部
112,912 プログラム(#1)本体
110,310,510,710,910 モジュール(#1)
118,128 切替履歴領域
120,320,520,720,920 モジュール(#2)
122,922 プログラム(#2)本体
130,330,530,730,930 モジュール(#3)
140,340,540,740,940 モジュール(#4)
180 OS
181 セキュア共有領域
182 実行モジュール識別子フィールド
183 切替フラグフィールド
184 切替パラメータフィールド
185 切替元モジュール識別子
190 共有領域
200,400 セキュアプロセッサ
210,410 コア
212,412 現タスク識別子レジスタ
220 暗号復号管理部
222 鍵テーブル
224 セレクタ
226 暗号/復号器
280 メモリ
420 モジュール切替管理部
422 モジュール切替管理テーブル
424 テーブルアクセス制御部
505A,505B 例外通知部
507A,507B 例外受付部
702A,702B,909A,909B コンテキスト設定部
905A,905B コンテキスト変更通知部
907A,907B コンテキスト変更受付部
719,729,919,929 コンテキスト管理テーブル
908 コンテキスト登録部
106A,106B,106C,906A,906B 切替後処理部
111,121 初期化処理部
112,912 プログラム(#1)本体
110,310,510,710,910 モジュール(#1)
118,128 切替履歴領域
120,320,520,720,920 モジュール(#2)
122,922 プログラム(#2)本体
130,330,530,730,930 モジュール(#3)
140,340,540,740,940 モジュール(#4)
180 OS
181 セキュア共有領域
182 実行モジュール識別子フィールド
183 切替フラグフィールド
184 切替パラメータフィールド
185 切替元モジュール識別子
190 共有領域
200,400 セキュアプロセッサ
210,410 コア
212,412 現タスク識別子レジスタ
220 暗号復号管理部
222 鍵テーブル
224 セレクタ
226 暗号/復号器
280 メモリ
420 モジュール切替管理部
422 モジュール切替管理テーブル
424 テーブルアクセス制御部
505A,505B 例外通知部
507A,507B 例外受付部
702A,702B,909A,909B コンテキスト設定部
905A,905B コンテキスト変更通知部
907A,907B コンテキスト変更受付部
719,729,919,929 コンテキスト管理テーブル
908 コンテキスト登録部
Claims (9)
- コンピュータに実行させるための複数のモジュールを含むプログラムであって、
前記コンピュータは、
連係して動作するモジュールのみがアクセス可能な領域であって、該連係して動作するモジュールのうち、OS上で動作するモジュールの識別子を示す実行モジュール識別子を格納する共有領域を含むメモリを備え、
前記モジュールのそれぞれは、
連携する他のモジュールへの動作の切替を行う直前に、前記他のモジュールの識別子を前記実行モジュール識別子として前記共有領域に格納する第1処理ステップと、
前記他のモジュールからの動作の切替が行われた直後に、前記共有領域に格納されている前記実行モジュール識別子と自モジュールの識別子とが一致した場合に、該自モジュール内の機能を実行させる第2処理ステップと
を有する
ことを特徴とするプログラム。 - 前記第1処理ステップは、
少なくとも、前記切替の要因を示す切替フラグと、該切替に必要な情報を含む切替パラメータとを前記共有領域にさらに格納し、
前記第2処理ステップは、
前記共有領域に格納される前記切替フラグと前記切替パラメータとに従い前記自モジュール内の機能を実行させる
ことを特徴とする請求項1に記載のプログラム。 - 前記第1処理ステップは、
前記切替の要因が呼び出しである場合に、該呼び出しを示す前記切替フラグと、該呼び出しにより前記切替が行われる前記他のモジュール内の呼び出し位置を示す呼び出し情報を少なくとも含む前記切替パラメータとを該共有領域に格納し、
前記第2処理ステップは、
前記切替フラグが前記呼び出しを示す場合に、前記切替パラメータに含まれる前記呼び出し情報に従い前記自モジュール内で呼び出しを行う
ことを特徴とする請求項2に記載のプログラム。 - 前記第1処理ステップは、
前記切替の要因が呼び出しからの復帰である場合に、該復帰を示す前記切替フラグと、該呼び出しにより前記切替が行われた前記自モジュールの実行結果を示す呼び出し復帰情報を少なくとも含む前記切替パラメータとを前記共有領域に格納し、
前記第2処理ステップは、
前記切替フラグが前記復帰を示す場合に、前記切替パラメータに含まれる前記呼び出し復帰情報を用いて前記自モジュールが前記呼び出しを行われた位置に戻って実行を再開させる
ことを特徴とする請求項3に記載のプログラム。 - 連携する他のモジュールへの動作の切り替えを行う直前に、前記切替の要因が前記呼び出しまたは前記復帰以外の場合に、該呼び出しまたは復帰以外を示す前記切替フラグと、該切替の要因の内容を示す切替要因情報を少なくとも含む前記切替パラメータとを前記共有領域に格納する第3処理ステップと、
前記他のモジュールからの動作の切り替えが行われた直後に、前記切替フラグが前記呼び出しまたは復帰以外を示す場合に、前記切替パラメータに含まれる前記切替要因情報が示す前記要因に対応する処理を実行する第4処理ステップと
をさらに有する
ことを特徴とする請求項4に記載のプログラム。 - 前記第3処理ステップは、
前記切替の要因が言語例外である場合に、該言語例外を示す前記切替フラグと、該言語例外を通知するために必要な言語例外情報を少なくとも含む前記切替パラメータとを前記共有領域に格納し、
前記第4処理ステップは、
前記切替フラグが前記言語例外を示す場合に、前記切替パラメータに含まれる前記言語例外情報を用いて前記自モジュールに対して言語例外を発生させる
ことを特徴とする請求項5に記載のプログラム。 - 前記識別子と、コンテキスト毎にユニークなコンテキスト番号と、該コンテキストを示すコンテキスト情報とを1対1に対応付けて管理する管理テーブルから、前記他のモジュールにより指定される該コンテキスト番号に対応する該コンテキスト情報を取得し、取得した該コンテキスト情報で前記自モジュールの現在のコンテキストを置き換える設定ステップをさらに有し、
前記第3処理ステップは、
前記切替の要因がコンテキスト設定である場合に、前記切替が行われる直前に、前記管理テーブルから、前記識別子と前記コンテキスト番号とに対応する前記コンテキスト情報を削除すると共に、コンテキスト設定を示す前記切替フラグと、前記設定ステップにより設定されるコンテキストを示すコンテキスト設定情報を少なくとも含む前記切替パラメータとを前記共有領域に格納し、
前記第4処理ステップは、
前記切替が行われた直後に、前記切替フラグが前記呼び出しを示し、且つ、前記切替パラメータが前記コンテキスト設定情報を含む場合に、前記他のモジュールを示す前記識別子と、該他のモジュールにより指定される前記コンテキスト番号と、前記第1処理ステップに戻るためのコンテキスト情報とを前記管理テーブルに登録し、
前記切替フラグがコンテキスト設定を示す場合には、前記切替パラメータに含まれる前記コンテキスト設定情報を用いて設定ステップに制御を移す
ことを特徴とする請求項6に記載のプログラム。 - 登録部が、前記識別子と、コンテキスト毎にユニークなコンテキスト番号と、該コンテキストを示すコンテキスト情報とを1対1に対応付けて管理する管理テーブルに対してコンテキスト情報を登録し、該コンテキスト情報に対応する該コンテキスト番号を返す登録ステップと、
前記自モジュールから指定される前記識別子と、該自モジュールの前記識別子とが一致する場合には、該自モジュールにより指定される前記コンテキスト番号に対応する前記コンテキスト情報を前記管理テーブルから取得し、取得した該コンテキスト情報で該自モジュールのコンテキストを置き換え、
前記自モジュールから指定される前記識別子と、該自モジュールの前記識別子とが一致しない場合には、該自モジュールのコンテキストを前記第1処理ステップの実行直前の時点のコンテキストに置き換える設定ステップと
をさらに備え、
前記第3処理ステップは、
前記切替の要因がコンテキスト設定である場合に、前記切替が行われる直前に、コンテキスト設定を示す前記切替フラグと、前記設定ステップにより設定されるコンテキストを示すコンテキスト設定情報を少なくとも含む前記切替パラメータとを前記共有領域に格納し、
前記第4処理ステップは、
前記切替フラグが前記コンテキスト設定を示す場合に、前記切替が行われた直後に、前記切替パラメータに格納された前記コンテキスト設定情報を用いて前記設定ステップに制御を移す
ことを特徴とする請求項6記載のプログラム。 - 前記共有領域は、切替元のモジュールを示す切替元識別子がさらに格納され、
前記第1処理ステップは、
前記切替の要因が呼び出しである場合に、前記切替が行われる直前に、前記自モジュールを示す前記識別子を前記切替元識別子として前記共有領域に格納し、
前記切替の要因が呼び出しからの復帰である場合に、前記切替による情報を保持する切替履歴領域から前記切替元のモジュールを示す前記識別子を取得して前記切替元識別子として前記共有領域に格納し、
前記第2処理ステップは、
前記切替フラグが前記呼び出しを示す値である場合に、前記切替が行われた直後に、前記共有領域から前記切替元識別子を取得して前記切替履歴領域に格納する
ことを特徴とする請求項2に記載のプログラム。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/JP2010/052465 WO2011101972A1 (ja) | 2010-02-18 | 2010-02-18 | プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JPWO2011101972A1 JPWO2011101972A1 (ja) | 2013-06-17 |
JP5377748B2 true JP5377748B2 (ja) | 2013-12-25 |
Family
ID=44482590
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012500425A Active JP5377748B2 (ja) | 2010-02-18 | 2010-02-18 | プログラム |
Country Status (3)
Country | Link |
---|---|
US (1) | US9116741B2 (ja) |
JP (1) | JP5377748B2 (ja) |
WO (1) | WO2011101972A1 (ja) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8971535B2 (en) * | 2010-05-27 | 2015-03-03 | Bladelogic, Inc. | Multi-level key management |
US9678816B2 (en) | 2012-06-29 | 2017-06-13 | Vmware, Inc. | System and method for injecting faults into code for testing thereof |
US10089126B2 (en) * | 2013-03-21 | 2018-10-02 | Vmware, Inc. | Function exit instrumentation for tail-call optimized code |
CN103049683B (zh) * | 2012-12-18 | 2016-04-06 | 惠州市亿能电子有限公司 | 一种bms上位机程序授权保密方法 |
GB2515536A (en) * | 2013-06-27 | 2014-12-31 | Ibm | Processing a guest event in a hypervisor-controlled system |
JP6117068B2 (ja) * | 2013-09-20 | 2017-04-19 | 株式会社東芝 | 情報処理装置、およびプログラム |
US10061457B2 (en) * | 2016-06-27 | 2018-08-28 | Google Llc | Modular computing environment |
JP6615726B2 (ja) * | 2016-09-16 | 2019-12-04 | 株式会社東芝 | 情報処理装置、情報処理方法及びプログラム |
JP7304430B2 (ja) * | 2019-12-09 | 2023-07-06 | 株式会社日立製作所 | 情報処理システム、プログラム間鍵共有方法、及びプログラム間鍵共有プログラム |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2004038394A (ja) * | 2002-07-01 | 2004-02-05 | Toshiba Corp | 耐タンパプロセッサにおける共有ライブラリの使用方法およびそのプログラム |
JP2005196257A (ja) * | 2003-12-26 | 2005-07-21 | Toshiba Corp | マイクロプロセッサ |
JP2009064462A (ja) * | 2008-10-27 | 2009-03-26 | Toshiba Corp | マイクロプロセッサ |
Family Cites Families (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS63132334A (ja) * | 1986-11-21 | 1988-06-04 | Nec Corp | パラメ−タ受渡し方式 |
FR2673476B1 (fr) * | 1991-01-18 | 1996-04-12 | Gemplus Card Int | Procede securise de chargement de plusieurs applications dans une carte a memoire a microprocesseur. |
JPH11120300A (ja) * | 1997-10-09 | 1999-04-30 | Fujitsu Ltd | 可搬型カード媒体,可搬型カード媒体のメモリ空間管理方法,可搬型カード媒体の発行方法および可搬型カード媒体のプログラムデータ書込方法並びにメモリ空間管理プログラムが記録されたコンピュータ読取可能な記録媒体 |
US6298446B1 (en) | 1998-06-14 | 2001-10-02 | Alchemedia Ltd. | Method and system for copyright protection of digital images transmitted over networks |
FR2801118B1 (fr) * | 1999-11-17 | 2001-12-21 | Bull Cp8 | Procede de chargement d'applications dans un systeme embarque multi-application, systeme embarque correspondant, et procede d'execution d'une application du systeme embarque |
US7270193B2 (en) | 2000-02-14 | 2007-09-18 | Kabushiki Kaisha Toshiba | Method and system for distributing programs using tamper resistant processor |
JP2002041168A (ja) | 2000-07-24 | 2002-02-08 | Sony Corp | 情報処理システム及び情報処理方法、並びに記憶媒体 |
JP4074057B2 (ja) | 2000-12-28 | 2008-04-09 | 株式会社東芝 | 耐タンパプロセッサにおける暗号化データ領域のプロセス間共有方法 |
JP4226816B2 (ja) | 2001-09-28 | 2009-02-18 | 株式会社東芝 | マイクロプロセッサ |
KR100483700B1 (ko) * | 2003-12-03 | 2005-04-19 | 주식회사 잉카인터넷 | 온라인 게임 클라이언트 보안을 위한 실시간 프로세스 불법 접근 및 조작 차단 방법 |
EP1836543A1 (en) * | 2004-12-22 | 2007-09-26 | Telecom Italia S.p.A. | Method and system for access control and data protection in digital memories, related digital memory and computer program product therefor |
JP4844102B2 (ja) | 2005-11-30 | 2011-12-28 | 富士ゼロックス株式会社 | サブプログラム及びそのサブプログラムを実行する情報処理装置 |
JP2007164595A (ja) * | 2005-12-15 | 2007-06-28 | Toshiba Corp | コンピュータシステムの関数呼び出し方法、コンピュータシステムおよびライブラリ |
US8335921B2 (en) * | 2010-12-17 | 2012-12-18 | Google, Inc. | Writing application data to a secure element |
-
2010
- 2010-02-18 JP JP2012500425A patent/JP5377748B2/ja active Active
- 2010-02-18 WO PCT/JP2010/052465 patent/WO2011101972A1/ja active Application Filing
-
2012
- 2012-08-15 US US13/585,941 patent/US9116741B2/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2004038394A (ja) * | 2002-07-01 | 2004-02-05 | Toshiba Corp | 耐タンパプロセッサにおける共有ライブラリの使用方法およびそのプログラム |
JP2005196257A (ja) * | 2003-12-26 | 2005-07-21 | Toshiba Corp | マイクロプロセッサ |
JP2009064462A (ja) * | 2008-10-27 | 2009-03-26 | Toshiba Corp | マイクロプロセッサ |
Also Published As
Publication number | Publication date |
---|---|
US9116741B2 (en) | 2015-08-25 |
JPWO2011101972A1 (ja) | 2013-06-17 |
US20130219408A1 (en) | 2013-08-22 |
WO2011101972A1 (ja) | 2011-08-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5377748B2 (ja) | プログラム | |
US11163911B2 (en) | Secure public cloud with protected guest-verified host control | |
US11989332B2 (en) | Secure public cloud with protected guest-verified host control | |
US11520611B2 (en) | Secure public cloud using extended paging and memory integrity | |
CN109558211B (zh) | 保护可信应用与普通应用的交互完整性和保密性的方法 | |
JP5091877B2 (ja) | セキュアモードおよびノンセキュアモードでデータを処理するデータプロセッサを含むデータ処理装置及びデータ処理方法 | |
US7590869B2 (en) | On-chip multi-core type tamper resistant microprocessor | |
JP4226760B2 (ja) | マイクロプロセッサ、これを用いたマルチタスク実行方法、およびマルチレッド実行方法 | |
US6983374B2 (en) | Tamper resistant microprocessor | |
JP3880933B2 (ja) | 耐タンパマイクロプロセッサ及びキャッシュメモリ搭載プロセッサによるデータアクセス制御方法 | |
JP4098478B2 (ja) | マイクロプロセッサ | |
JP4989543B2 (ja) | メモリドメインを基にしたデータ処理システム内のセキュリティ制御 | |
US7272832B2 (en) | Method of protecting user process data in a secure platform inaccessible to the operating system and other tasks on top of the secure platform | |
CN109565444A (zh) | 安全公共云 | |
JP4115759B2 (ja) | 耐タンパプロセッサにおける共有ライブラリの使用方法およびそのプログラム | |
CN107729758B (zh) | 用于多租户云工作量的安全处理器 | |
JP2003051819A (ja) | マイクロプロセッサ | |
JP2002202720A (ja) | 耐タンパプロセッサにおける暗号化データ領域のプロセス間共有方法 | |
JP6578814B2 (ja) | プロセッサ及びプロセッサシステム | |
JP4282472B2 (ja) | マイクロプロセッサ | |
Zhao | Wideshears: Investigating and breaking widevine on QTEE | |
Nakatsuka et al. | CTR: Checkpoint, Transfer, and Restore for Secure Enclaves |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20130827 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20130924 |
|
R151 | Written notification of patent or utility model registration |
Ref document number: 5377748 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R151 |