(57)【特許請求の範囲】
【請求項１】
それぞれ固有のプログラム鍵に基づいて暗号化された複数のプログラムが格納されている外部メモリのアドレスを指定して、読み出し要求を発行するプロセッサコアと、
前記プロセッサコアの読み出し要求に応じて、前記外部メモリの指定されたアドレスのデータブロックを読み出すインターフェイスと、
前記プログラムの実行制御単位であるタスクごとに与えられるタスク識別子に対応して、  前記プログラム鍵を保持するタスク鍵テーブルと、
前記タスク識別子ごとに、前記プログラムが配置された先頭アドレスをオフセット値として保持するオフセットテーブルと、
前記読み出し要求により指定されたアドレスと、前記オフセットテーブルのタスク識別子で指定されるオフセット値とから相対アドレス値を計算し、この相対アドレス値を、前記プログラム鍵で暗号化したブロック対応鍵を生成する鍵生成部と、
前記読み出されたデータブロックを、前記ブロック対応鍵により復号化する暗号処理部と、
前記復号化されたデータブロックをキャッシュライン単位に読み込むキャッシュメモリと、
を備えるマイクロプロセッサ。
【請求項２】
前記プロセッサコアが指定する外部メモリのアドレスは、仮想アドレスであり、
前記マイクロプロセッサは、所定の変換情報に基づいて仮想アドレスから物理アドレスへ変換して外部メモリにアクセスするアドレス変換機能をさらに有し、
前記鍵生成部は、前記仮想アドレスから相対アドレス値を計算することを特徴とする請求項１に記載のマイクロプロセッサ。
【請求項３】
現在実行中のタスクの識別子を保持するタスクレジスタをさらに有し、
前記鍵生成部は、前記相対アドレス値に所定の秘密定数を加算し、前記加算結果を、前記タスクレジスタに保持されたタスク識別子で指定されるプログラム鍵によって暗号化して、前記ブロック対応鍵を生成することを特徴とする請求項１に記載のマイクロプロセッサ。
【請求項４】
現在実行されているタスクの識別子を保持するタスクレジスタと、
複数のキャッシュラインから構成され、タスクの要求があったときに、外部メモリに暗号化された状態で格納されているデータを、前記キャッシュライン単位に前記タスクの識別子と対応付けて、平文状態で読み込み可能なキャッシュメモリと、
前記暗号状態のデータを、キャッシュラインごとに異なるブロック対応暗号鍵で前記平文に復号する暗号処理部と、
前記暗号状態のデータのアドレス範囲を、前記タスクの識別子と対応付けて保持するアドレス範囲レジスタと、
前記アドレス範囲レジスタに保持されたアドレス範囲と、前記タスクの要求先のアドレスとから相対アドレスを計算し、この相対アドレスを所定の鍵で暗号化することにより前記ブロック対応暗号鍵を生成する暗号鍵生成部とを備え、前記タスクの実行中に、第２のタスクの要求があった場合に、前記暗号処理部は、前記タスクレジスタに保持されているタスクの識別子に対応するキャッシュラインの内容を、前記ブロック対応暗号鍵で暗号化し、
前記キャッシュメモリは、前記暗号化されたデータを外部メモリに書き戻し可能であることを特徴とするマイクロプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチタスクのプログラム実行環境下で、実行コードや処理対象であるデータの不正な改変を防止することのできる耐タンパマイクロプロセッサに関する。
【背景技術】
【０００２】
ＰＣなどの一般ユーザ向けコンピュータのハードウェア情報や、オペレーションシステム（以下、「ＯＳ」とする）のシステムプログラム情報が、特に秘密にされることなく開示されているオープンシステムが広く普及している。
【０００３】
オープンシステムでは、エンドユーザがシステムプログラムを変更して、所望の改良を加えることができる。
【０００４】
このような環境下で、アプリケーションプログラムが扱う情報の著作権や、プログラム自体の著作権を保護するには、あらかじめシステムのＯＳがアプリケーションに対して敵対的動作をとり得ることを想定した秘密保護能力のあるハードウェアが必要である。
【０００５】
実際、このような秘密保護機能を有するハードウェア、特にマイクロプロセッサが提案されている（特許出願第２０００−３５３９８号，Lie et al., “Architectural Support for Copy and TamperResistant Software”;Computer Architecture News 28(5):p168-  等）。
【０００６】
秘密保護能力を有するマイクロプロセッサは、マルチタスク環境下で、プログラム自体やプログラムが扱う情報が不正に覗き見され、改変されないように、これらの情報を暗号化する機能を備えている。
【０００７】
このようなマイクロプロセッサを、耐タンパプロセッサと呼ぶ。
【０００８】
耐タンパプロセッサの主目的は、エンドユーザのシステムで動作するアプリケーションを保護することにより、プログラムやコンテンツ、ネットワークサービスの権利者の権利を保護することである。具体的には、（１）プログラムに実装されたアルゴリズムの保護、（２）プログラムに埋め込まれたトレードシークレットや、コンテンツの保護、（３）プログラム動作の改変からの保護、の３つが挙げられる。
【０００９】
プログラムに実装されたアルゴリズムの保護は、プログラムの権利者を保護するために必要である。プログラムに埋め込まれたトレードシークレットの保護は、プログラムが扱うコンテンツの不正コピーを防止するために必要である。不正な改変からの保護は、たとえばサービスプロバイダの権利を保護するために必要である。
【００１０】
ネットワークサービスを利用するプログラムが、課金情報をサーバとやりとりするようなアプリケーションでは、特に、課金情報の送信動作を正しく実行し、不正な改変を防止することが重要である。実際の例として、ＰＣでＤＶＤを再生するプログラムが解析され、そこからＤＶＤの暗号を解読するためのトレードシークレットが読みとられて不正にＤＶＤをコピーするプログラム（ＤｅＣＳＳ）が作られたことはよく知られている。
【００１１】
オープンシステムにおいて、単純にアプリケーションプログラムの秘密を保護する機構は従来から提案されているが、本件の出願人は、ひとつのシステム上で複数のプログラム（複数の異なるプログラムベンダからのプログラムあるいは単一のベンダからの複数の異なるプログラム）が擬似並列的に動かされる場合に、その各々について、システムの資源を管理するＯＳからも独立に秘密を保護する保護環境を提案してきた（特許出願第２０００−３５３９８号、第２０００−１３５０１０号、第２０００−３３３６３５号、第２００１−０２４４８０号など）。このような保護環境を、「マルチパーティアプリケーション保護環境」と呼ぶ。
【００１２】
図１８は、一般的なマルチパーティのアプリケーション保護環境を示す。
【００１３】
図１８において、ユーザ１２が、複数のソフトウェアベンダ２１−１〜２１−ｎのうち、ベンダ１（２１−１）からプログラムをする購入すると場合を例にとる。
【００１４】
ユーザ１２が使用するシステム２は、マイクロプロセッサＡを内蔵し、マイクロプロセッサＡは、このプロセッサに固有の秘密鍵Ａを有する。秘密鍵Ａに対応する公開鍵Ａは、公開されている。
【００１５】
ソフトウェアベンダ１はプログラム２２−１を開発し、暗号鍵としてプログラム鍵１を選択し、平文プログラム２２−１を暗号化して暗号プログラム２３−１を作成する。
【００１６】
次に、プログラム鍵１を、配布先システム２のプロセッサＡに固有の公開鍵Ａで暗号化して、配布鍵２５−１を作成する。
【００１７】
図示はしないが、ソフトウェアベンダ１はプログラム２２−１の他にも、複数の異なるプログラムを開発しており、それぞれプログラムに応じたプログラム鍵を選択して、暗号化プログラムと配布鍵を作成する。ここでは、説明の便宜上、ひとつのプログラムについて説明する。
【００１８】
ソフトウェアベンダ１は、暗号化したプログラム２３−１と、暗号化した配布鍵２５−１とを、ネットワークを介して、ターゲットシステム２に配信する。配信されたプログラム２３−１と配布鍵２５−１は、システムの二次記憶（たとえば、ハードディスク）７に格納される。プログラム２３−１は、実行コードとデータ（初期化データ等）を含み、実行時に、マイクロプロセッサ３の外にある外部メモリ８上に、暗号化されたままの状態で読み込まれる。外部メモリ８上の暗号化されたプログラムを保護プログラムと称する。
【００１９】
マイクロプロセッサＡは、配布鍵２５−１を読み込み、公開鍵Ａに対応する秘密鍵Ａによってこれを復号してプログラム鍵１を得る。鍵の復号処理はマイクロプロセッサ内の保護ロジック（コア）６で行なわれる。
【００２０】
次にマイクロプロセッサＡは、プログラム鍵１によってプログラム１を復号してキャッシュメモリ４に読み込む。復号とキャッシュメモリ３への読み込みは、所定のキャッシュアルゴリズムにより、プログラムの実行に従って、部分ごとに行われ、プログラム全体が一度にキャッシュメモリ４に読み込まれるわけではない。キャッシュメモリ４に読み込まれたプログラムは平文状態なので、暗号化されていない通常のプログラムと同様にコア６で実行される。プログラム鍵１や平文プログラムを扱う部分は、プロセッサＡのコア６によって行なわれ、ＯＳが介在する余地はない。マイクロプロセッサ内にあるキャッシュメモリ４、秘密鍵５の内容は、プロセッサの仕様に定められた操作を除いては、外部から直接読み出すことはできない。
【００２１】
なお図示はしないが、キャッシュメモリ４に格納された平文の情報について、ユーザが複数のプログラムベンダ２１−１〜２１−ｎから、複数の異なるプログラムを購入しても、それらのプログラムの間で、独立に秘密が守られることを保証するために、キャッシュメモリ４のライン毎に、その平文情報がどの暗号鍵によって復号化された情報であるかを特定する識別子がつけられる。異なるプログラムベンダの、異なるプログラムごとにプログラム鍵はそれぞれ異なるので、キャッシュラインにあるタスクと、それを復号した鍵とを対応付けることにより、プログラムの独立性は一応保証される。
【発明の開示】
【発明が解決しようとする課題】
【００２２】
（１）タスクの識別機能を実現するには、各プログラムのプログラム鍵をタスクＩＤに対応して保持するテーブルをマイクロプロセッサ内部に持つことが必要である。このようなテーブルの設定を指示するのは、システムを管理するＯＳであり、ＯＳプログラムからテーブルを操作する手段が必要となる。このテーブル操作手段は、当然、秘密保護の要求を満たすものでなければならない。
【００２３】
また、タスク対応の鍵テーブルは秘密保護の要となるが、資源の有限性やコストの関係上、テーブルの量を無限に増やすことはできない。このため、あるテーブルのエントリをどのプログラムに割り当てるか、エントリをどのように再利用するかは、システムユーザの意向に従って、ＯＳが管理する必要がある。
【００２４】
このようなＯＳの操作は、秘密保護に欠陥をもたらす可能性がある。例えば、あるプログラム鍵ＸにタスクＩＤ＃１を割り当てた状態の時、ＯＳが別のプログラム鍵Ｙに同一のタスクＩＤ＃１を再割当したとする。このとき、キャッシュメモリにタスクＩＤ＃１のタグが付与されたキャッシュラインが残っていると、そのデータは、プログラム鍵Ｙに対応するプログラムから読みとることができる。これは秘密保護の原則に違反する。
【００２５】
そこで、第１の課題として、このような違反を防止するためのタスク状態管理とテーブル管理の機構を提供する。
【００２６】
（２）プログラムの暗号化には、キャッシュライン単位で復号処理が完結するような方法と、あるひとつのキャッシュラインの復号に複数のキャッシュラインのデータが必要な方法の２種類がある。前者はメモリ容量やライン単位の入れ替えにさほど影響しないが、後者には、以下の問題がある。
【００２７】
キャッシュラインの復号に複数のキャッシュラインのデータを必要とする方法では、メモリへのランダムアクセスが発生する場合、必要なメモリ領域の前後のメモリ領域も読み込まなければならない。このため、大きなオーバヘッドが発生する。
【００２８】
また、復号結果は隣接するラインのデータに依存するため、いわゆるブロック交換攻撃の可能性がある。ブロック交換攻撃とは、同一の秘密に基づいて暗号化されたブロック情報を、攻撃者が適切に入れ換えることにより、システムの状態を攻撃者の意図するように変更する攻撃を意味する。たとえば、攻撃者が、あるアドレスＸに配置されていたラインＰが課金動作に対応する部分であることを、通信のタイミングなどから知ったとする。
【００２９】
そして、同一のプログラム鍵で暗号化された別のラインＱを実行しても、プログラムの提供するサービスに悪影響がないことを、知っていたとする。このとき、ラインＰをラインＱで置き換えれば、攻撃者はプログラムのサービスに影響なく、課金だけを逃れることができる。同様の攻撃は、プログラムが扱うデータにも適用可能である。
【００３０】
すべてのブロック毎に個別の鍵を与えれば上記の問題は解決できるが、配布鍵にブロックごとの個別暗号鍵を格納すると、配布鍵を公開鍵で暗号化するアルゴリズムが膨大になり、復号化処理のオーバヘッドを引き起こす。また、そのような鍵を管理する膨大な容量のテーブルをマイクロプロセッサ内部に必要とし、鍵の配布、管理コストの面で現実的ではない。
【００３１】
さらに、一般にプログラムは、あらかじめ配置されるアドレスが常に一定であるわけではなく、ターゲットシステムの構成（他のプログラムと共有するライブラリや共有メモリの構成）によって、配置されるアドレスが変更されることがある。これをリロケーションと呼ぶ。ブロックごとの暗号化を行う場合、リロケーションの問題を考慮しなければならない。
【００３２】
そこで、第２の課題として、処理オーバヘッドが小さく、データ交換攻撃を困難にし、リロケーションをも考慮した秘密情報管理能力を有するマイクロプロセッサを提供する。
【００３３】
（３）プログラム（実行コード）、データ、コンテキスト情報は、アプリケーションの３要素であるが、これらはプロセッサ内部での取り扱い違いがある。実行コードとデータでプログラム本体を成し、コンテキストは、タスクの実行が中断されたときにタスクを再開するためにメモリ上に保存される状態情報である。
【００３４】
一般にマイクロプロセッサ内部のプログラムは書き換えられることはないが、キャッシュ上のデータに変更があればデータは外部メモリへと書き戻される。
【００３５】
また、プログラムやデータはキャッシュライン単位でアクセスされるが、コンテキスト情報は、単一のキャッシュラインでは格納できないほどのサイズになることが多い。コンテキスト切り替えのときは、複数のキャッシュラインにまたがる情報がまとめて読み書きされる。
【００３６】
性質の異なるこれらの情報を外部メモリとやりとりする際には、それぞれ暗号処理が必要になるが、その一方でハードウェアコストの削減が望まれる。
【００３７】
そこで、第３の課題として、これらの情報に対する暗号処理ハードウェアを共通化できるマイクロプロセッサを提供する。
【課題を解決するための手段】
【００３８】
第１の課題を解決するために、実際にキャッシュラインにあるタスクの識別子と、ＯＳにより割り当てられたタスクの識別子とを比較して、一致するときにのみそのキャッシュラインへのアクセスを許可し、一致しないときは、キャッシュラインの内容を廃棄する。
【００３９】
これを実現するために、マイクロプロセッサは、複数の状態を取り得るタスクに識別子を付与し、タスク識別子と対応してタスクの状態を保持するタスク状態テーブルと、現在実行中のタスク識別子を保持するタスクレジスタと、タスクの要求があったときに、外部メモリに所定のプログラム鍵で暗号化された状態で格納されているプログラムをキャッシュライン単位に読み込むインターフェイスと、プログラム鍵に基づきキャッシュラインごとに復号鍵を生成し、読み込まれた内容を復号する暗号処理部と、各々がタグを有する複数のキャッシュラインから構成され、キャッシュラインごとに、そのキャッシュラインの復号に用いられた復号鍵に対応するタスク識別子をタグに保持する第１のキャッシュメモリと、キャッシュラインのタグに保持されたタスク識別子と、前記タスクレジスタの値を比較し、値が一致しない場合にキャッシュラインの内容を廃棄するアクセス検証部とを備える。
【００４０】
第２の課題を解決するために、少ない秘密に基づいてブロックごとに異なる鍵で復号することを可能にする。これを実現するために、マイクロプロセッサは、以下を備える。
【００４１】
（ａ）それぞれ固有のプログラム鍵に基づいて暗号化された複数のプログラムが格納されている外部メモリのアドレスを指定して、読み出し要求を発行するプロセッサコア；
（ｂ）プロセッサコアの読み出し要求に応じて、外部メモリの指定されたアドレスのデータブロックを読み出すインターフェイス；
（ｃ）プログラムの実行制御単位であるタスクごとに与えられるタスク識別子に対応して、プログラム鍵を保持するタスク鍵テーブル；
（ｄ）タスク識別子ごとに、プログラムが配置された先頭アドレスをオフセット値として保持するオフセットテーブル；
（ｅ）読み出し要求により指定されたアドレスと、オフセットテーブルのタスク識別子で指定されるオフセット値とから相対アドレス値を計算し、この相対アドレス値を、プログラム鍵で暗号化したブロック対応鍵を生成する鍵生成部；
（ｆ）読み出されたデータブロックを、ブロック対応鍵により復号化する暗号処理部；および
（ｇ）復号化されたデータブロックをキャッシュライン単位に読み込むキャッシュメモリ。
【００４２】
また、タスクの実行中断の際に、プログラムやデータが配置される物理アドレスは、しばしばシステムの資源管理によって変更される（リロケーション）が、ブロックごとに暗号化されたプログラムを復号して正常に実行するためには、情報は一定のアドレス空間に配置される必要がある。そこで、ターゲットアドレスとプログラムの開始アドレス（オフセットアドレス）との差で表わされる相対アドレスを計算するときは、仮想アドレスを用いる。
【００４３】
これによって、ブロック入れ替えを効果的に防止するとともいに、制限ある物理メモリを効率よく利用することができる。
【００４４】
第３の課題を解決するために、マイクロプロセッサは、
（ａ）外部メモリに暗号化された状態で格納されているプログラムの実行コードおよびデータをキャッシュラインごとに取り込むインターフェイスと、
（ｂ）プログラムの開始アドレスであるオフセット値を保持するオフセットテーブルを有し、実行コードを平文状態でキャッシュラインごとに保持する第１のキャッシュと、
（ｃ）データのアドレス範囲を保持するアドレス範囲レジスタを有し、データを平文状態でキャッシュラインごとに保持する第２のキャッシュと、
（ｄ）第１および第２のキャッシュに共通バスを介して接続され、プログラムの暗号化に用いた暗号鍵を保持する鍵値テーブルと、
（ｅ）第１および第２のキャッシュバスおよび鍵値テーブルに共通バスを介して接続され、鍵値テーブルと第１のキャッシュから暗号鍵とオフセット値をそれぞれ受け取り、この暗号鍵とオフセット値に基づいて実行コードを復号化して第１のキャッシュに供給し、鍵値テーブルと第２のキャッシュから暗号鍵とアドレス範囲をそれぞれ受け取って、暗号鍵とアドレス範囲に基づきデータを復号化して第２のキャッシュに供給する暗号処理部と
を備える。
【００４５】
この構成により、キャッシュ間で共有される効率的な暗号処理構造を有するマイクロプロセッサが実現される。
【発明の効果】
【００４６】
少ない数の秘密に基づき、簡便な方法でプログラムをブロックごとに暗号化、復号化するので、ブロック入れ替え攻撃を防止できるとともに、ソフトウェアベンダ側とマイクロプロセッサ側の双方の資源管理、処理負担が軽減する。
【００４７】
ブロック対応暗号化に、仮想メモリ空間に基づく相対アドレスを用いるので、リロケーションの問題に効率的に対処できる。
【００４８】
鍵値テーブルと高速暗号鍵処理モジュールをキャッシュ間で共有することにより、ハードウェアコストが削減される。
【発明を実施するための最良の形態】
【００４９】
以下、図面を参照しながら本発明の実施の形態を説明する。
【００５０】
図１は、本発明が適用されるマルチパーティのアプリケーション保護環境を説明するための図である。
【００５１】
ソフトウェアベンダ１２１は、プログラム１２２を作製し、これをユーザ１１２のシステム１０２に内蔵されるマイクロプロセッサＡに配布する。配布するプログラムを保護するため、平文プログラム１２２を暗号化する。
【００５２】
具体的には、実行コードと、初期化済データ等のデータで構成されるプログラムを、ソフトウェアベンダ１２１が選択したプログラム鍵で暗号化し、暗号化に用いたプログラム鍵を、ターゲットシステム１０２のプロセッサＡの公開鍵Ａで暗号化して配布鍵を生成する。
【００５３】
このとき、ソフトウェアベンダ１２１は、プログラムや初期化データを複数のブロックに分割し、ブロックごとに異なる鍵で暗号化する。ただし、ベンダ１２１は、ブロック数に応じた数の鍵を選択するのではなく、複数の鍵を生成するための基本となる定数Ｃｘと、Ｃｘに基づいて生成された複数の鍵を暗号化する鍵Ｋｘの２つだけを選択すればよい。詳細は後述するが、この２つの定数を基にして、ブロックごとに異なる鍵で暗号化し、暗号化プログラム１２３を生成する。そして、ＣｘとＫｘをプロセッサＡの公開鍵Ａで暗号化して、配布鍵Ｋｘ[Ａ]、Ｃｘ[Ａ]を作製する。
【００５４】
なお、図１では、説明の便宜上、単一のソフトウェアベンダしか描いていないが、マルチパーティの環境を想定しているので、ユーザ１１２は、複数のベンダから、それぞれブロック暗号化プログラムを購入し、システム１０２に格納するものとする。
【００５５】
配布されたブロック暗号化プログラムは、配布鍵とともに、いったんハードドライブディスクなどの二次記憶１０７に格納され、実行時にメモリ１０８に確保された領域１０９−１に読み込まれる。このメモリへの読み込みは、システム１０２の資源を管理するＯＳ１１０によって行われる。プログラム本体と配布鍵は同一のファイルに格納しても良いし、別々のファイルに格納してもよい。メモリ１０８は、同じベンダ１２１による別のプログラムや、その他のベンダからのプログラムのための領域１０９−ｎも有するが，説明の便宜上、これらについては省略する。
【００５６】
プロセッサＡは、配布鍵１２５を読み込み、秘密鍵Ａを用いて、保護ロジック１０６で配布鍵を復号する。復号した鍵で、メモリ１０８に配置された暗号化プログラムを、ブロック単位でキャッシュメモリ１０４に読み込み、ブロックごとに復号化する。このとき、プロセッサＡの特徴として、限られた数の秘密、たとえば２つの定数Ｋｘ、Ｃｘから、複数の暗号ブロックの各々に対応したブロック対応鍵を生成して、ブロック単位で復号する能力を有する。
【００５７】
図２は、図１に示すマイクロプロセッサＡのハードウェア構成図である。プロセッサＡは、プロセッサパッケージ２００の中に、コア９０２、命令キャッシュ９０３、データキャッシュ９０４、これらのキャッシュで共有される高速暗号鍵処理モジュール（ＦＣＭ：Fast Ciphering Module）９１１、鍵値テーブル（ＫＶＴ：key value table）９１２、配布鍵管理モジュール９１３、バスインターフェイス（ＢＩＵ）９０６を有する。これらは、内部バス９０５で互いに接続されている。
【００５８】
コア９０２、高速暗号鍵処理モジュール９１１、鍵値テーブル９１２、配布鍵管理モジュール９１３で、図１の保護ロジックを構成する。
【００５９】
コア９０２は、レジスタアレイ９１５とタスクスイッチャー９１４を有する。タスクスイッチャー９１４は、タスクの切り替え、すなわち割り込み発生時のコンテキストの保存、復帰を実行する。コンテキストは、タスクの実行に対応して生成され、タスクと対応して管理される。これを実現するために、タスクスイッチャー９１４は、内部にタスク状態テーブル９２１と、ハッシュ計算部９２２を有する。タスク状態テーブル９２１は、後述するように、タスクＩＤと対応付けてタスク状態を保持する。また、図示はしないが、コア９０２は、レジスタアレイにあるコンテキストの変更通知や、配布鍵設定命令などを発する。
【００６０】
命令キャッシュ９０３は、プログラムの実行コードをキャッシュする。通常のアドレスを識別するキャッシュタグに加え、保護タスクを識別するタグも付けられ、マイクロプロセッサの内部データでアプリケーションの独立性を保証する。なお、図２には図示しないが、後述するように，命令キャッシュは、プログラム（実行コード）やデータの開始アドレス（オフセット）を記述するオフセットテーブル１２０７（図９参照）を内部に有する。
【００６１】
データキャッシュ９０４は、プログラムの初期化データ、スタックデータ、ダイナミックデータなど、プログラムに関連する種々の情報をキャッシュする。
【００６２】
高速（対称）鍵暗号処理モジュール９１１は、鍵生成モジュール１３１２と暗号処理モジュール１３１３を有する。鍵生成モジュール１３１２は、内部バス９０５を通じてブロックの鍵と、処理対象ブロックの相対アドレス値を取得し、後述する方法でブロックごとに対応する暗号鍵を生成する。暗号処理モジュール１３１３は、生成されたブロックごとの暗号鍵により、対応するブロックの暗号／復号処理を実行する。ブロックの暗号処理には複数クロックを要するので、複数のモジュールを並列処理するためのディスパッチャも含む。
【００６３】
鍵値テーブル（ＫＶＴ）９１２は、キャッシュから送られてくるテーブルＩＤ情報に基づいてテーブルを検索し、鍵の値を高速暗号鍵処理モジュール９１１に供給する。
【００６４】
配布鍵管理モジュール９１３は、配布鍵の公開鍵復号化および復号化結果のテーブルをセットアップする。
【００６５】
マイクロプロセッサはまた、点線の矢印で示すように、タスクチャンネル９１６を有し、コア９０２から他のモジュールへ、現在実行中のタスク、およびコンテキスト保存されるタスクの情報を伝達する。マイクロプロセッサのパッケージの外に外部メモリとしてのＲＡＭ９０７，周辺回路を接続するいわゆるサウスブリッジ９０８があり、バスインターフェイス９０５で、内部バス９０５と外部メモリ９０７やサウスブリッジ９０８との間のデータ転送、バッファリングを行なう。
【００６６】
図３は、プログラムをブロックごとに暗号化する手順を説明する図である。この処理は、図１のソフトウェアベンダ１２１のブロック対応暗号処理部１２６によって行われる。
【００６７】
ソフトウェアベンダが開発した平文のアプリケーションプログラムのプログラム領域１００１は、１２８ビット（１６バイト）を単位とする複数のブロック０〜ブロックｎで構成されている。この領域全体に対して、あらかじめ２つの定数ＫｘとＣｘが選択されている。
【００６８】
まず、定数Ｃｘと、プログラムの先頭から見た相対的は各ブロックの先頭アドレスとの和を求める。たとえば最初のブロック０の先頭バイトは０であるから、Ｃｘ＋０が計算される（Ｓ１００２−０）。Ｃｘ＋０の値は、秘密鍵Ｋｘで暗号化され、ブロック対応鍵Ｋｖ０が生成される（Ｓ１００３−０）。平文ブロック１００１−０は、このブロック対応鍵Ｋｖ０で暗号化され（Ｓ１００４−０）、暗号ブロック１００５−０が生成される。
【００６９】
同様に、２番目のブロック１の先頭バイトは１６バイトであるから、プログラムの先頭からみた相対アドレスは１６となり、Ｃｘ＋１６を計算する（Ｓ１００２−１）。
【００７０】
ｎ＋１番目のブロックｎの相対アドレスは１６ｎであり、Ｃｘ＋１６ｎを求める（Ｓ１００２−ｎ）。これらの値をＫｘで暗号化して、対応するブロックの暗号鍵Ｋｖ１〜Ｋｖｎを生成する（Ｓ１００４−１〜Ｓ１００４−ｎ）。各暗号鍵で平文ブロック１〜ｎを暗号化し、暗号ブロック１００５−１〜１００５−ｎを生成する。
【００７１】
図３では、暗号化処理Ｓ１００３−０〜Ｓ１００３−ｎや、Ｓ１００４−０〜Ｓ１００４−ｎを独立に示してあるが、ひとつの暗号化処理に与えるパラメータを変えて繰り返し使ってもよいし、ソフトウェアで実現してもよい。
【００７２】
図３に示す暗号化方法によれば、プログラムベンダ１２１は、ターゲットシステム１０２でプログラムが配置される絶対アドレスを意識せずに、暗号処理することができる。プログラムベンダは絶対アドレス値を予想することはできないので、絶対アドレス値に基づいてブロック対応鍵を生成しようとすると、ターゲットシステム１０２からあらかじめプログラムが配置される絶対アドレスの通知を受けてから、配置アドレス対応の暗号化プログラム本体を作成するか、配置アドレス対応の暗号化プログラム本体を無数に配布しなければならない。いずれの場合もプログラム本体の配布コストが著しく大きくなる。
【００７３】
図３の方法では、配布しなければならない秘密は鍵Ｋｘと定数Ｃｘのみであり、かつ、各ブロックの相対アドレスを使用して複数ブロック対応の暗号鍵を生成するので、ソフトウェアベンダ側の処理負担が軽減され、経済性も満たされる。
【００７４】
こうして暗号化された各ブロック１００５−０〜１００５−ｎは、配布鍵Ｋｘ[Ａ]，Ｃｘ[Ａ]とともに、ターゲットシステム１０２に送られる。ターゲットシステムでは、秘密情報Ｋｘ、Ｃｘと、ブロックの相対アドレス値さえ与えられれば、マイクロプロセッサ内で、他のブロックのデータや配置されたメモリの絶対番地に依存せず、各ブロック独立に復号することができる。
【００７５】
これは、メモリへのランダムアクセスを特徴とする現在のコンピュータアーキテクチャおよびアプリケーションプログラムのリロケーションを前提とした現在のＯＳに効率よく適合する。
【００７６】
また、たとえ攻撃者が、ブロックの不正な入れ換えを行っても、ブロックごとの相対アドレス値が異なるので、ブロック暗号鍵Ｋｖも異なり、攻撃者の意図する動作は行われない。
【００７７】
次に、ターゲットシステム１０２側での動作の詳細を説明する。
【００７８】
プログラムの実行に先立って、ＯＳ１１０は、ソフトウェアベンダ１２１から受け取ったアプリケーションプログラムの実行コード、初期化データ（静的データ）、作業領域（スタック）に、それぞれメモリ１０８の領域を割り当てる。この段階では、プログラムは暗号化されたままの状態である。割り当てられるメモリ領域の開始アドレスは、システムの状態、すなわち連係して動作する他のプログラムモジュールや共有メモリの配置によって変わってくるので、システムを管理するＯＳは、状況に応じて領域のアドレスを自由に決定する（リロケーション）。ＯＳ１１０はまた、配置鍵を配置するメモリ領域を決定し、配布鍵情報を読み込む。
【００７９】
ＯＳ１１０は、これらの領域のアドレス情報を、メモリ上の情報配置記述子（ＩＡＤ：information arrangement descriptor）とよばれる構造体に記述する。
【００８０】
図４は、あるタスクの仮想アドレス空間のメモリマップと、情報配置記述子１１１１および配布鍵情報１１２１の構造を示す。メモリマップ上には、プログラム１１０２、初期化（static）データ１１０３、作業領域（スタック）１１０４に加え、情報配布記述子用の領域１１０５、配布鍵用の領域１１０６が配置される。
【００８１】
情報配置記述子１１１１は、プログラム領域の開始アドレス（オフセット）１１１２、データ領域開始アドレス（オフセット）１１１３、データ領域終了アドレス１１１４、作業領域開始アドレス（オフセット）１１１５、作業領域終了アドレス１１１６、配布鍵アドレス開始アドレス（オフセット）１１１７を含む。
【００８２】
配布鍵１１２１は、プログラム鍵（Ｋｘ）１１２２、プログラム秘密定数（Ｃｘ）１１２３、初期化データ鍵１１２４、初期化データ秘密定数１１２５、初期化データ長１１２６、作業領域（スタック）鍵１１２７、作業領域秘密定数１１２８、作業領域長１１２９を含む。
【００８３】
メモリ上に配置されたプログラムが、マイクロプロセッサ１０３に読み込まれて、復号、実行されるときは、ＯＳ１１０は、情報配置記述子に基づいて、タスク状態を制御する種々の特権命令（タスク制御命令）を発行して、タスクの状態管理を行う。
【００８４】
図５は、タスク制御命令の例を示し、図６は、タスクの状態遷移を示す。タスク制御命令は、内部テーブルへのタスクの登録（register）、タスクの開始（start）、中断されたタスク状態の保存（suspend）、中断されたタスクの再開（continue）、タスクの終了、すなわち内部テーブルからのタスク秘密情報の削除（delete）などを含む。そして、これらの制御命令に応じて、図６に示すようにＮＵＬＬ状態２０１からＩＮＩＴ状態２０２になり、ＲＵＮ状態２０３、ＳＴＯＰＰＥＤ状態２０４、ＳＵＳＰＥＮＤ状態２０５等を遷移する。
【００８５】
以下、タスクを実行するための動作について、特に、タスクの登録、タスクの実行、タスクの中断、タスクの終了を中心に、詳細に説明する。
【００８６】
＜タスクの登録＞
１．登録処理フロー
まず、タスクを登録するために、ＯＳ１１０は、登録したいタスクのＩＤと、そのプログラムの情報配置記述子の先頭アドレスをパラメータとして、特権命令であるregister命令を発行する。register命令の発行により、このプログラムのための配布鍵１１２１が復号され、各メモリブロックの復号に使われる鍵と相対アドレス情報が、タスクＩＤと関連付けて、マイクロプロセッサ内の各種テーブル（後述）に登録される。
【００８７】
図７は、マイクロプロセッサ（ハードウェア）１０３上でのタスク登録の概略動作を示し、図８は、登録（register）命令の処理フローを示す。
【００８８】
情報配置記述子（ＩＡＤ）１１１１のアドレスとタスクＩＤ＃１をパラメータとしてregister命令が発行されると、コア９０２内のタスクスイッチャー９１４はタスクの状態をチェックする（Ｓ３０１）。タスク状態がＮＵＬＬでなければ（Ｓ３０１でＮＯ）、タスク状態をＩＮＶＡＬＩＤとしてエラーにする（Ｓ３０８）。タスク状態がＮＵＬＬならば（Ｓ３０１でＹＥＳ）、図７の点線（１）で示すように、コア９０２は情報配置記述子のアドレスとタスクＩＤを含む登録要求を、配布鍵管理モジュール９１３のシーケンサ９１３−１に書き込む。
【００８９】
シーケンサは、図７の点線（２）で示すように、情報配置記述子の領域に対するメモリ読み出し要求をＢＩＵ９０６に送り、ＢＩＵは、点線（３）で示すように情報記述子１１１１をシーケンサに供給する。シーケンサはこの情報記述子を解析して、プログラム、初期化データ、作業領域に対応するオフセットアドレスや範囲、配布鍵オフセットアドレス１１１７を取得する（Ｓ３０２）。
【００９０】
次にシーケンサは、配布鍵アドレスに対する読み出し要求をＢＩＵに送る。
【００９１】
ＢＩＵは、点線（４）で示すように、配布鍵の内容を公開鍵復号モジュール９１３−２に供給する。公開鍵復号モジュール９１３−２は、配布鍵１１２１（図４）を復号化し、プログラムの秘密定数（Ｃｘ）、初期化データの秘密定数、作業領域秘密定数を取得する（Ｓ３０３）。
【００９２】
次に、図７の点線（５）で示すように、Ｓ３０２で取得したプログラム、初期化データ、作業領域のオフセットアドレスを、命令キャッシュ９０３のオフセットテーブル（図９参照）に書き込む（Ｓ３０４）。
【００９３】
同様に、Ｓ３０３で取得したプログラム、初期化データ、作業領域の暗号鍵（秘密定数）を、鍵値テーブル９１２に書き込む（Ｓ３０５）。
【００９４】
こうして、テーブルが設定され、タスクの登録が完了する。
【００９５】
タスクの登録が完了すると、タスク状態はＮＵＬＬからＩＮＩＴに移行し（Ｓ３０６）、この状態の遷移は、割り込みによりコア９０２に通知され（Ｓ３０７）、ＯＳは、タスクを実行するための準備が整ったことを知る。
【００９６】
２．テーブルの設定
マイクロプロセッサ内の各種テーブルの設定を説明する前に、図９〜１１を参照して、マイクロプロセッサを構成する命令キャッシュ９０３、高速暗号鍵処理モジュール（ＦＣＭ）９１１、鍵値テーブル（ＫＶＴ）９１２、データキャッシュ９０４の構成を説明する。
【００９７】
図９は命令キャッシュ９０３の詳細を示す。命令キャッシュ９０３は、命令ＴＬＢ（translation lookaside buffer）１２０２を有する命令管理ユニット（ＭＭＵ）１２０１と、命令キャッシュメモリ１２０３と、カレントタスクＩＤレジスタ１２０４と、キャッシュアクセス検証部１２０５と、タスクＩＤ書き込み部１２０６と、オフセットテーブル１２０７を含む。
【００９８】
キャッシュメモリ１２０３は、複数の所定サイズのキャッシュラインで構成され、各キャッシュラインは、そのキャッシュライン（ブロック）で実行されるタスクのタスクＩＤを保持するタグを有する。キャッシュアクセス検証部１２０５は、タグに保持されたタスクＩＤと、カレントタスクＩＤレジスタの値とを比較し、一致するときのみアクセスを許可する。一致しないときは、そのキャッシュラインの内容を廃棄する。
【００９９】
図１０は、鍵値テーブル（ＫＶＴ）９１２と、高速暗号鍵処理モジュール（ＦＣＭ）９１１の詳細を示す。ＫＶＴ９１２は、テーブルアクセス制御部１３０１と、カレントタスクＩＤレジスタ１３０２と、タスク鍵（あるいはプログラム鍵）テーブル１３０３と、コンテキスト鍵テーブル１３０４と、データ鍵テーブル１３０５を含む。ここでは図示はしないが、データ鍵テーブル１３０５は、４つのテーブル（０〜３）を含む。ＫＶＴ９１２は、パス１３１５を介してバス９０５と接続される。
【０１００】
高速暗号鍵処理モジュール（ＦＣＭ）９１１は、ディスパッチャ１３１１と、鍵生成モジュール１３１２と、暗号処理モジュール１３１３を含む。鍵生成モジュール１３１２は、鍵生成単位として並列に１３１２−１〜１３１２−３を有し、暗号処理モジュール１３１３は暗号処理単位として１３１３−１〜１３１３−３を有する。ディスパッチャ１３１１は、後述するように、鍵生成単位や暗号処理単位の空きのある部分に処理を割り振り、並列処理を可能にする。ＦＣＭ９１１は、パス１３１４を介してバス９０５に接続される。
【０１０１】
ＫＶＴ９１２からＦＣＭ９１１へ、パス１３１６を介して暗号鍵が転送され、パス１３１７を介して相対アドレス値が転送される。
【０１０２】
図１１は、データキャッシュ９０４の詳細を示す。データキャッシュ９０４は、カレントタスクＩＤレジスタ１４０１と、アドレス範囲を保持するＭＴＲＲ（memory type range register）テーブル１４０３と、このテーブルを管理しＭＴＲＲテーブルのアドレス範囲とターゲットアドレスを比較するＭＴＲＲテーブル管理比較部１４０２と、暗号属性送出部１４１１と、データキャッシュメモリ１４３１と、データＴＬＢ１４３３を有するＭＭＵ１４４２と、保存予定コンテキスト識別子レジスタ１４３４を含む。暗号属性送出部１４１１は、データやコンテキストを外部メモリへ書き戻すときに、その暗号属性を確認するために、読み込み要求データ暗号識別子レジスタ１４１２と、読み込み要求コンテキスト暗号鍵識別子レジスタ１４１３と、書き出し要求データ暗号鍵識別子レジスタ１４１４と、書き出し要求コンテキスト暗号鍵識別子レジスタ１４１５と、アクセス検証部１４２１を有する。ＭＭＵ１４４２は、所定の変換情報に基づいて、コア９０２から出力される仮想アドレスから物理アドレスへと変換してメモリアクセスを行う。
【０１０３】
ＫＶＴ９１２の６種類のテーブル、すなわちプログラム鍵テーブル１３０３、コンテキスト鍵テーブル１３０４、データ鍵テーブル１３０５（０−３）は、それぞれタスクＩＤでインデックスされ、鍵生成に使う２種類の秘密情報を保持できる。ブロックの復号鍵生成に使われる２つの秘密情報、例えば図４に示すプログラムのためのＫｘ１１２２とＣｘ１１２３は、ＫＶＴ９１２のプログラム鍵テーブル１３０３のタスクＩＤ＃１の欄に書き込まれる。
【０１０４】
一方、このプログラム領域のオフセット値１１１２は、命令キャッシュ９０３内のオフセットテーブル１２０７のタスクＩＤ＃１の欄に書き込まれる。
【０１０５】
データキャッシュ９０４のＭＴＲＲテーブル１４０３は、タスクＩＤと０〜３の値をとるＭＴＲＲ識別子で識別される。すなわち、ＭＴＲＲテ−ブル１４０３は、１タスク当たり４個のＭＴＲＲ（アドレス範囲レジスタ）を持ち、それぞれにデータ領域のアドレス範囲と鍵の値を登録することができる。タスク登録時においては、ＭＴＲＲ識別子０、１に対応する初期化データと、作業領域（スタック）に対応するＭＴＲＲが設定される。また、ＭＴＲＲ２，３の内容は０で初期化される。
【０１０６】
あるタスクがメモリを参照する時、ターゲットアドレスとＭＴＲＲのアドレス範囲とが比較され、一致したＭＴＲＲに対応する暗号化属性（すなわち鍵）が使用される。
【０１０７】
データについても、ＭＴＲＲの先頭番地をオフセットとして、相対アドレス値を使用して、上述した手順の暗号鍵生成が適用される。
【０１０８】
テーブルの内容に矛盾が発生するのを防ぐため、これらのテーブルを書き換えている期間は、コア９０２ではこのタスクに対するあらゆるオペレーションが禁止される。
【０１０９】
テーブルの書換えが完了すると、タスクスイッチャー（ＳＴＳ）９１４のタスク状態テーブル９２１で、このタスクＩＤに対応するエントリが状態ＮＵＬＬからＩＮＩＴに書き換えられ、登録の完了が、割り込みによってコア９０２に通知される。
【０１１０】
なお、本実施例ではこれらの登録オペレーションをハードウェアで実装した例を示したが、ファームウェアとしてプロセッサ内部に組み込まれたソフトウェアとして実装してもよい。ただし、ファームウェアは悪意を持つシステムユーザによって改変されることがないような注意が必要である。
【０１１１】
＜タスクの実行＞
１．タスクの実行開始
タスクを実行するには、ＩＮＩＴ状態にあるタスクに対して、ＯＳがタスクＩＤをパラメータとしてstart命令を実行する。すると制御がプログラム領域の先頭に移される。
【０１１２】
ＩＮＩＴ状態にあるタスク以外を指定してstart命令を実行した場合、エラーとなり、なにも実行されない。
【０１１３】
図１２は、タスク実行開始命令の処理フローを示す。あるタスクについてそのタスクＩＤを指定してstart命令が発行されると、まず、そのタスク状態がＩＮＩＴにあるかどうか、すなわち、タスク実行の準備が整った状態にあるか否かを判断する（Ｓ４０１）。ＩＮＩＴ以外の状態にあるタスク識別子を指定してstart命令が出された場合は（Ｓ４０１でＮＯ）、タスク状態テーブル９２１がＩＮＶＡＬＩＤにされ（Ｓ４０７）、エラーとなる。
【０１１４】
タスクがＩＮＩＴ状態にある場合は（Ｓ４０１でＹＥＳ）、コア９０２が保持するカレントタスクＩＤが、新しいタスクに設定され（Ｓ４０２）、レジスタアレイ９１５が初期化される（Ｓ４０３）。また、プログラムカウンタ（不図示）の値が、プログラム領域の先頭に設定される（Ｓ４０４）。
【０１１５】
続いて、新しいタスクＩＤが、タスクチャンネル９１６を通じて、命令キャッシュ９０３、データキャッシュ９０４、鍵値テーブル９１２に通知され、それぞれのカレントタスクＩＤレジスタ１２０４、１４０１、１３０２に保持される（Ｓ４０５）。
【０１１６】
その後、コア９０２のタスク状態テーブル９２１で、タスク状態がＩＮＩＴからＲＵＮに書き換えられ（Ｓ４０６）、実行が開始される。
【０１１７】
本実施形態では、ブロックごとに暗号化され保護されたプログラムを実行するので、外部メモリのプログラムがキャッシュに読み込まれる際に、タスクＩＤに対応して登録されたプログラム鍵に基づいて、ブロックごとにプログラムの復号化が行われ、復号結果である平文がキャッシュに読み込まれ、実行される。このとき、タスク登録時に配置されたメモリアドレスに合わせて、オフセットを命令キャッシュ９０３内部のオフセットテーブル１２９７に登録し、メモリアクセスとオフセットの差を相対アドレス値として使用するので、プログラマが暗号化したプログラムがＯＳによりどのアドレスに配置されていても、正しく復号化できる。
【０１１８】
なお、実施形態ではＮＵＬＬ状態から中間のＩＮＩＴ状態を経てＲＵＮ状態へ移行する例が書かれているが、これは配布鍵の公開鍵アルゴリズム処理を非同期的に実行することにより、公開鍵アルゴリズム処理中の比較的長い応答不能時間を短縮することが目的である。応答不能時間を許容すれば中間のＩＮＩＴ状態を省略してもさしつかえない。（非同期的公開アルゴリズム処理については、同一出願人による特許出願第２００１−０２４４８０号を参照されたい。）
２．命令キャッシュの読み込み
次に、命令キャッシュ９０３の読み込み処理について、図１３の処理フローを参照して説明する。
【０１１９】
タスクの実行が開始されてキャッシュに読み込まれたラインには、通常のメモリアドレスの一致を判定するタグに加えて、このタスクのタスクＩＤタグが付けられる。
【０１２０】
そして、読み込まれたキャッシュラインにアクセスがあると、命令キャッシュ９０３のアクセス検証部１２０５で、ラインに付されたタスクＩＤのタグと、アクセスのあったカレントタスクＩＤの一致、不一致が判断される。不一致の場合は、たとえメモリアドレスのタグが一致していてもキャッシュのミスヒットとして扱われ、このキャッシュラインの情報が再度外部メモリから読み込まれることになる。別のタスクによりこのラインに対応する外部メモリの内容が再読み込みされても、新たにアクセスしたタスクのタスクＩＤに対応する鍵で復号化されて読み込まれることになる。つまり、本来の鍵と異なる鍵で復号化された結果を実行することになり、正常な処理は行われない。
【０１２１】
なお、以下の説明で、相対アドレスの計算は仮想アドレスに基づいて行なわれるが、キャッシュのヒット、ミスヒットの判定は、物理アドレスに対して行われる。キャッシュのヒット、ミスヒットの判定に仮想アドレスを使用すると、同一のメモリブロックがキャッシュ上に複数存在するエイリアスと呼ばれる現象が発生するからである。この現象は特に同一の物理アドレス領域を複数のタスクが共有する場合に問題となるので、本実施形態では、通常のキャッシュヒット、ミスヒットは物理アドレスによって判定している。
【０１２２】
図１３は、命令キャッシュ９０３の読み込み処理フローを示す。このフローでは、説明の簡略化のため、命令キャッシュ９０３と、ＦＣＭ９１１、ＢＩＵ９０６の動作を一体として示している。
【０１２３】
まず、コア９０２から読み出し要求があると、命令キャッシュ９０３はＢＩＵ９０６に対して、ターゲットアドレスブロックの読み出し要求を送る。読み出し要求には、リクエストＩＤ、保護の有無、ターゲットアドレス範囲、要求元ＩＤの情報が含まれている。
【０１２４】
ここで、ターゲットアドレスと、読み込まれたキャッシュラインに付されているアドレスタグとの一致、不一致が判断される（Ｓ５０１）。物理アドレスが一致しない場合は（Ｓ５０１でＮＯ）、ミスヒットとして、読み出し要求された新たなタスクＩＤに対応するオフセットアドレスの取得を開始する。オフセットアドレスは、オフセットテーブル１２０７の中の、カレントタスクＩＤに対応するエントリから取得する（Ｓ５０２）。
【０１２５】
次に、取得したオフセット値から相対アドレスを計算する。相対アドレスは、メモリアドレスからオフセット値を引き算することによって求められる（Ｓ５０３）。なお、保護タスク実行中にキャッシュメモリへのアクセスがあると、命令キャッシュ９０３は、キャッシュメモリのアクセスと並行して、相対アドレスの計算を行なう。
【０１２６】
命令キャッシュ９０３は、求めた相対アドレス値とタスクＩＤとを、内部バス９０５を通じて鍵値テーブル（ＫＶＴ）９１２へ送る。このとき、リクエストＩＤがつけられる。ＫＶＴ９１２は、はタスク鍵テーブル１３０３からタスクＩＤに対応する鍵の値を取得し、鍵の値とオフセット値を、チャネル１３１６を通じて、高速暗号鍵処理モジュール（ＦＣＭ）９１１の鍵生成モジュール１３１２へと送る。同時にＫＶＴ９１２は、オフセット値とリクエストＩＤ、要求元ＩＤを、チャネル１３１７を通じて、ＦＣＭ９１１の暗号処理モジュール１３１３へ送る。
【０１２７】
ＦＣＭ９１１の鍵生成モジュール１３１２は、ＫＶＴ９１２から鍵の値とオフセット値を受け取ると、すぐにそのブロックに対応する鍵の計算を開始する。すなわち、プログラムの秘密定数Ｃｘに相対アドレス値を加算した中間値を求め（Ｓ５０４）、求めた中間値をプログラムの秘密鍵Ｋｘで暗号化して、プログラムのブロックに対応するブロック対応鍵を生成する（Ｓ５０５）。
【０１２８】
この鍵の計算は暗号化処理なので、複数サイクルの時間を要する。効率よく計算をするため、鍵生成モジュール１３１２には複数の鍵生成単位１３１２−１〜１３１２−３が設けられ、ディスパッチャ１３１１が、空きの鍵生成単位に処理要求を割り振る。１つのリクエストが複数の暗号ブロックで構成される場合は、すべての暗号ブロック対応の鍵を生成するまで相対アドレス値を増分してＳ５０２〜５０５を繰り返す。
【０１２９】
一方、ＢＩＵ９０６は外部メモリから読み出した結果を、暗号ブロックの大きさのデータになるまでバッファリングする。もともと保護されていない非暗号化データが要求されている場合は、データは直接要求元の命令キャッシュへ送られるが、本実施形態では、暗号化データに対する要求なので、読み出し結果はＦＣＭ９１１へ送られる。ＦＣＭ９１１の暗号処理モジュール１３１３は、鍵生成モジュールによって生成されたブロック暗号鍵で、ＢＩＵ９０６から供給されたデータを復号する（Ｓ５０６）。
【０１３０】
復号には複数サイクルの時間がかかるので、前の復号処理が完了する前にキャッシュラインを構成する次の暗号ブロックが到着した場合は、別の暗号処理単位が割り当てられ、並列的に処理が行なわれる。図１０には、暗号処理単位として１３１３−１〜１３１３−３だけが示されているが、十分な数の暗号処理単位を準備すれば、暗号処理単位の処理サイクルよりも短い間隔でデータが到着しても遅延を発生させることなく復号化処理が可能となる。
【０１３１】
復号を完了したブロックは、直ちに内部バス経由で要求元の命令キャッシュ９０３に送られる。命令キャッシュ９０３は、このキャッシュラインにデータを格納し、ラインを構成するすべてのデータがそろうと、キャッシュタグにライン有効の表示、暗号化ありの表示、実行中のタスクＩＤを書き込む（Ｓ５０７）。
【０１３２】
キャッシュラインが有効になると、コア９０２はこのラインからデータを読み出し、プログラムの実行を再開する（Ｓ５０８）。
【０１３３】
次に、Ｓ５０１でターゲットアドレスとキャッシュラインのアドレスタグ（物理アドレス部分）が一致した場合、つまり、それまで実行されていたタスクＡと異なるタスクＩＤを有するタスクＢが、たまたま同一のメモリ領域をアクセスしてキャッシュラインがヒットした場合を考える。キャッシュの物理アドレスがヒットしたということは、タスクＢは、従来の資源管理的な意味でこのアドレスのメモリのアクセス権があることになる。
【０１３４】
この場合は、命令キャッシュ９０３のアクセス検証部１２０５が、現在のタスクＩＤレジスタ１２０４の値と、このキャッシュラインにつけられているタスクＩＤタグとを、さらに比較する（Ｓ５０９）。比較結果が一致しない場合、たとえばカレントタスクＩＤレジスタ１２０４には“Ｂ”と書かれているが、キャッシュラインタグのタスクＩＤ欄には“Ａ”と書かれ、その暗号特性は暗号化ラインであることを示している場合には（Ｓ５０９でＮＯ）、キャッシュがフラッシュされ、タスクＢにタスクＩＤに対してＳ５０２〜Ｓ５０７を繰り返す。すなわち、タスクＢのオフセットアドレスから相対アドレスが計算され、キャッシュラインアドレスに対応する外部メモリのデータをタスクＢのプログラム鍵で復号した結果が、このキャッシュラインに読み込まれる。
【０１３５】
タスクＡとタスクＢのプログラム鍵が一致していれば、別々に読み込まれたとしても２つのタスクは同一のプログラムを実行するだけであるが、外部メモリのデータを暗号化した本来の鍵がタスクＡのプログラム鍵であり、タスクＢの鍵がそれとは違うものである場合、タスクＢは本来のプログラムとは異なるでたらめなプログラムを実行することになり、意図する攻撃ができない。
【０１３６】
一方、カレントタスクレジスタの値とキャッシュラインのタスクＩＤタグが一致すれば（Ｓ５０９でＹＥＳ）、要求されたアドレスの内容が、コア９０２に送られる（Ｓ５０８）。
【０１３７】
このように、あるタスクの実行中に、別のタスクによって同じキャッシュラインが再度読み込まれた場合、外部メモリの内容は、本来の鍵とは異なる鍵で復号化されてキャッシュラインに読み込まれる。本来の鍵と異なる鍵で復号化した結果を実行したプログラムはもちろん正常な動作をしない。
【０１３８】
この制御はＯＳの特権をもっても覆すことはできない。ＯＳが自由にタスク鍵テーブル１３０３を操作できとしたならば、他のプログラムの秘密を取得することができるが、本発明では、ＯＳがプログラム鍵の登録に代表されるタスクの状態管理と秘密情報の操作を実行できるのは、図５に示すような一連のタスク制御命令の発行に制限されている。したがって、本発明のマイクロプロセッサでは、たとえＯＳの資源特権をもっても、アプリケーションのプログラムまたはデータの各ブロックに対応する鍵を知らない限り、それを正しく実行したり読み出したりすることはできない。
【０１３９】
この機構により、アプリケーションプログラムの独立性を保証するマルチパーティのプログラム保護環境が提供できるのである。
【０１４０】
なお、Ｓ５０６と関連して複数の暗号処理単位１３１３により迅速な復号処理が可能であると述べたが、１個の暗号処理単位に十分なスループットがあれば、複数の暗号処理単位を備えることは不要である。例えば、ＤＥＳのように同一種類の演算の繰り返しにより構成される暗号処理では、処理をパイプライン化することにより高いスループットが得られることが知られている。
【０１４１】
しかし、このようなパイプライン実装は、ハードウェア規模においても、設計の困難さにおいても大きなコストが必要である。また、一般に利用可能なＩＰの形で提供される暗号処理単位は、設計に高度のノウハウと時間を必要とするので、必要な処理能力に見あった番号処理単位をその都度設計することを大きな負担となる。多様な条件への対応を考えた時、本実施形態のように既存の暗号処理単位を複数並列動作させることが、設計の柔軟性の点で有利である。また、ハードウェア設計コストを含めた全体のコスト削減の効果がある。
【０１４２】
３．データキャッシュでの実行処理
次に、データキャッシュの動作について説明する。初期化データ、作業領域（スタック）などのデータの保護については、タスクが動的に確保したデータ領域を、任意の暗号鍵によって暗号化保護することができる。初期化データ、作業領域、動的領域など、複数の保護領域を定義し、各々異なる鍵を設定することが可能である。たとえば初期化データの場合、外部メモリにはすでに暗号化済みのデータがおかれており、これを読み出し、復号する際の手順は基本的にはプログラムの場合と同じである。
【０１４３】
前述したプログラム（実行コード）の場合は、暗号属性は、命令キャッシュ９０３でカレントタスクＩＤとキャッシュタグのタスクＩＤを比較することによって判断されていたが、データの場合は、属性の判断がカレントタスクＩＤとＭＴＲＲ（アドレス範囲レジスタ）との比較で行なわれるところが異なる。
【０１４４】
データアクセスがあった場合、図１１に示すデータキャッシュ９０４のＭＴＲＲテーブル管理比較部１４０２でアクセス属性が判定される。具体的には、ＭＴＲＲテーブル管理比較部１４０２にカレントタスクＩＤとターゲットアドレスが入力されると、タスクＩＤに対応するＭＴＲＲテーブル１４０３のエントリ（０〜３）のアドレス範囲とターゲットアドレスがそれぞれ比較される。
【０１４５】
ＭＴＲＲエントリに合致するものがひとつだけであれば、その属性が無条件に採用され、タスクＩＤとＭＴＲＲエントリＩＤの組が当該メモリアクセスの暗号属性となる。
【０１４６】
ＭＴＲＲエントリが重複したアドレス範囲を持ち、ターゲットアドレスが複数のエントリのアドレス範囲に合致した場合、あらかじめＭＴＲＲごとに定められた優先順位にしたがってただひとつのＭＴＲＲが選ばれ、このメモリアクセスの暗号属性となる。
【０１４７】
こうしてＭＴＲＲテーブル管理比較部１４０２で決定されたメモリアクセス属性は、データ読み込みの場合、暗号属性送出部１４１１の読み込みデータキーＩＤレジスタ１４１２に一時的に保持される。また、ＭＴＲＲテーブル管理比較部１４０２では、ヒットしたＭＴＲＲエントリの先頭アドレスとメモリアクセスのターゲットアドレスから相対アドレス値が計算される。
【０１４８】
これらのメモリアクセス属性と相対アドレス値は、プログラムメモリのアクセスの場合と同様に、内部バス９０５を通じて鍵値テーブル（ＫＶＴ）９１２に送られる。
【０１４９】
データキャッシュがＢＩＵ９０６にデータ読み出しを要求し、メモリアクセス属性がＫＶＴ９１２に送られ、データがＦＣＭ９１１に送られて復号化され、データキャッシュに返されるシーケンスは、命令キャッシュの場合と同一である。
【０１５０】
最後にキャッシュタグにメモリアクセス属性と相対アドレス値が書き込まれてキャッシュの読み込みは完了する。
【０１５１】
次に、アドレス変換機構を持つ場合のデータキャッシュの非同期書き込みに関する問題と、本実施形態で提供する機構について説明する。
【０１５２】
図１４に、本実施形態のデータキャッシュのデータ構造を示す。データキャッシュメモリ１４３１は、２５６本のライン１５０１―０〜１５０１−２５５で構成されている。
【０１５３】
各ライン（たとえばライン０）は、外部メモリの内容を格納するラインバッファ１５０１−０−０と、物理アドレスタグ１５０１−０−１と、相対アドレス値１５０１−０−２と、タスク識別子１５０１−０−３と、ＭＴＲＲ識別子１５０１−０−４と、フラッグ領域１５０１−０−５を有する。
【０１５４】
データキャッシュ９０４が命令キャッシュ９０３と異なる点は、データの書き戻し、すなわち割り込み時などに、外部メモリに一時的に退避される場合があることである。
【０１５５】
あるタスクＡに読み込まれたキャッシュラインは、必ずしもタスクＡの実行中にフラッシュされて外部メモリに書き戻されるとは限らない。別のタスクＢの実行中にフラッシュされる可能性もある。アドレス変換機構を持つプロセッサの場合、タスク毎に異なるメモリマップを持つことできるため、キャッシュラインの保存先物理アドレスは、仮想アドレスから一意に決定することはできない。
【０１５６】
従来、この問題は、キャッシュタグに物理アドレスタグ１５０１−０−１をもうけて、保存先の物理アドレス情報を付与すれば、現在実行中のタスクが何であるかに関わらずキャッシュラインの保存先を決定できる。
【０１５７】
ところが、これに本発明のブロック対応鍵を利用した暗号化を適用しようとすると、問題が生じる。ブロック対応鍵は、上述したように、キャッシュラインの仮想アドレスと、オフセット値の差である相対アドレス値から生成されている。一般にはこの相対アドレス値は物理アドレスから生成することはできないので、キャッシュの書き戻しにあたってのデータ暗号化ができない。
【０１５８】
本実施形態では、データキャッシュメモリ１４３１のキャッシュタグに、相対アドレス値を格納するタグ１５０１−０−２をもうけて、このキャッシュラインの確保時に付与された相対アドレス値を保存することで、書き戻し時の暗号化の問題を解決している。
【０１５９】
タグの書き込みは、このキャッシュラインの暗号属性決定時に行う。
【０１６０】
別の方法として、キャッシュタグに仮想アドレスを保持しても同様の機能が実現される。キャッシュの非同期書き戻しを実行するときに、メモリ領域情報はＭＴＲＲテーブル１４０３に保持されているので、仮想アドレスとタスク識別子からＭＴＲＲのオフセット情報を取得して相対アドレス値を計算すればよい。
【０１６１】
データキャッシュ９０４では、配布鍵で決められた初期化データと作業領域の他に、２箇所のデータ領域を追加することができる。これらの領域は、ＭＴＲＲ（アドレス範囲レジスタ）のＩＤ２、３で指定される。
【０１６２】
データ領域の追加は、setkeyと呼ぶ特別な命令をタスクが発行することで行なわれる。プロセッサの所定のレジスタにデータの暗号鍵、補助定数とメモリ領域およびＭＴＲＲ  ＩＤを格納してsetkey命令を発行する。Setkey命令は自タスクＩＤのデータ暗号化属性のみに有効なので、命令で明示的にタスクＩＤを指定する必要はない。
【０１６３】
Setkey命令は、プロセッサコア９０２の内部で、データキャッシュ９０４のＭＴＲＲテーブル１４０３へのアクセスと、鍵値テーブル９１２のデータ鍵テーブル１３０５へのアクセスという、２つのステップに分解されて実行される。
【０１６４】
タスクの初期状態において、ＭＴＲＲ（アドレス範囲レジスタ）の２、３は無効化された状態、すなわちアドレス範囲の大きさが０である状態にある。この状態ではいかなるメモリアクセスもアドレス範囲に該当しない。
【０１６５】
Setkey命令が発行されると、最初にタスクＩＤとＭＴＲＲのＩＤに一致するデータキャッシュラインがフラッシュされる。
【０１６６】
次に、鍵値テーブル９１２のデータ鍵テーブル１３０５のタスクＩＤとＭＴＲＲのＩＤでインデックスされた欄に、暗号鍵が書き込まれる。
【０１６７】
次に、データキャッシュ９０４のＭＴＲＲテーブル１４０３の指定タスクＩＤとＭＴＲＲ  ＩＤでインデックスされた欄に、アドレス範囲が書き込まれる。
【０１６８】
ＭＴＲＲのアドレス範囲の長さが０を越えるとその暗号化指定が有効になる。以下、追加データの読み書きについては初期化データの場合と同様である。
【０１６９】
設定したＭＴＲＲを変更、すなわちデータ領域の属性を変更するには、再度setkey命令を発行する。上述のように、setkey命令を発行するとＭＴＲＲのＩＤに対応するキャッシュ上のラインはすべてフラッシュされ、外部メモリへと書き出される。その後、データ鍵テーブル１３０５，ＭＴＲＲテーブル１４０３に新しい設定が書き込まれ、新しい設定での読み書きが始まる。
【０１７０】
いったん外部メモリに書き戻されて保存された暗号データは、先に使用した暗号鍵Ｋｘ、補助定数Ｃｘ、オフセットアドレスが一致して初めて正しく読み出せる。たとえ暗号鍵、補助定数が一致していてもオフセットアドレスが一致しなければ正しい値を復号化することはできない。このことはタスク間で共有される共有メモリやディスクデータの読み書きにおいて重要である。この理由でsetkey命令が実行されると、対応するキャッシュラインは無条件にフラッシュされる。
【０１７１】
逆に、あるデータ領域が外部メモリ上で別の絶対メモリアドレスに領域にコピーされたとしても、ＭＴＲＲの領域指定先頭アドレスが移動先アドレスに対応して設定されれば、暗号鍵、補助定数が一致する条件の下で、元のデータを正しく読み出すことができる。
【０１７２】
このように、本実施形態ではデータの暗号化においても、ブロック交換攻撃防止のためのブロックごとの個別暗号鍵方式と、メモリの再配置（リロケーション）とを、矛盾なく両立させることができる。
【０１７３】
＜タスクの一時中断＞
マルチタスクＯＳでは、タスクの実行はしばしば割り込みにより中断される。
【０１７４】
割り込み後はＯＳの割り込みハンドラが実行され、必要に応じて、別のタスクに実行が切替えられる場合と、タスクの切り替えなしに元のタスクに復帰する場合がある。
【０１７５】
本実施形態のプロセッサでは、割り込みコントローラから割り込み要求があると、保護タスクの実行は中断され、割り込みベクタで指定されるアドレスの割り込みハンドラの実行が開始される。すなわち、それまでの保護タスクのレジスタ値（コンテキスト情報）が、割り込みハンドラによりコア９０２のレジスタバッファ（アレイ）９１５に退避され、ＯＳを含む他のタスクからの読み出しから保護される。この割り込みにより、図６の状態遷移に示されるように、タスク状態テーブル９２１の値がＲＵＮからＳＴＯＰＰＥＤに移行する。
【０１７６】
ＳＴＯＰＰＥＤ状態では、中断されたタスクのコンテキストは、コア９０２のレジスタバッファ９１５を占有しているが、この状態でＳＵＳＰＥＮＤ命令（タスク実行状態保存命令）が発せられると、レジスタバッファの内容は、ＳＵＳＰＥＮＤ命令で指定されたメモリ領域に保存され、タスク状態はＳＵＳＰＥＮＤへ移行する。
【０１７７】
割り込みハンドラは、レジスタバッファの内容を読み出すことはできないが、それを一括してメモリに保存することはできるのである。
【０１７８】
割り込み処理時間が長い場合や、タスク切り替えがある場合は、レジスタバッファの内容は、キャッシュメモリに保存される。また、保存されたコンテキスト情報が、さらに外部メモリへ書き出される場合もある。この場合、コンテキスト情報が所定のコンテキスト鍵で暗号化されてから、外部メモリに書き出される。
【０１７９】
ＳＵＳＰＥＮＤ（保存）状態のタスクを再開するには、図５および６に示すように、タスクＩＤとコンテキスト情報の保存先アドレスを指定して、resume命令を発行する。
【０１８０】
ＳＴＯＰＰＥＤ状態（レジスタ値が保存されず、単に退避されている状態）からタスクを再開するには、continue命令を発行する。たとえば、割り込み処理が簡単に終りタスクの切り替えが起きない場合や、ソフトウェアタイマーのカウンタインクリメント処理では、それまで実行されていたレジスタ値を保存せずに、レジスタバッファアレイ９１５に退避させるにとどまる。この場合は、レジスタバッファからレジスタ値が復帰され、割り込み前のタスク実行が再開される。タスクの状態は、ＳＴＯＰＰＥＤからＲＵＮに戻される。
【０１８１】
図１５は、suspend（タスク状態保存）命令が出されたときの処理フローである。
【０１８２】
まず、suspend命令の発行を受けて、タスク状態テーブル９２１を参照して、指定されたタスク状態がＳＴＯＰＰＥＤであるか判断される（Ｓ６０１）。ＳＴＯＰＰＥＤでない場合は（Ｓ６０１でＮＯ）、それまのレジスタ値がコア９０２のレジスタバッファ（アレイ）９１５に退避されていないことになるので、この状態でsuspend命令が出されても無効にされ、タスク状態はＩＮＶＡＬＩＤにされる（Ｓ６０５）。
【０１８３】
指定されたタスク状態がＳＴＯＰＰＥＤの場合は（Ｓ６０１でＹＥＳ）、レジスタバッファアレイ９１５にある内容が、suspend命令で指定されたアドレスのメモリ領域に書き込まれ、保存が開始される（Ｓ６９２）。
【０１８４】
保存はキャッシュへの保存が基本であり、保存開始前にタスクチャネル９１６を通じてそれまで実行していたタスクのＩＤが、データキャッシュの保存予定コンテキスト識別子レジスタ１４３４に保持される。そして、データキャッシュメモリ１４３１上でコンテキスト情報を書き込むためのキャッシュラインが確保され、データの転送が開始される。ラインの書き込み完了ごとに、キャッシュラインのタグにコンテキストを表す識別子とタスクＩＤが書き込まれる。
【０１８５】
コンテキスト情報の保存は元のメモリの内容を完全に上書きするものである。コンテキスト情報はキャッシュラインサイズの整数倍で、その先頭アドレスがかならずキャッシュラインサイズでアラインされており、通常必要とされる書き込み前に保存先内容を読み出す動作（ライトアロケート）は不要となる。
【０１８６】
そして、コア９０２のハッシュ計算部９２２で、レジスタバッファの内容全体のハッシュが計算され、タスクＩＤとともに、メモリ上のレジスタ情報の最後にハッシュ値が付加される（Ｓ６０３）。多数ラインにわたる場合は、コア９０２のタスクスイッチャ（ＳＴＳ）９１４は、レジスタバッファアレイ９１５の情報を順次キャッシュラインに書き込みながらハッシュを計算する。
【０１８７】
コンテキスト領域の最後にタスクＩＤとハッシュ値を書き込み、タグの付加が終わるとsuspend命令の実行は完了となり、タスクの状態はＳＵＳＰＥＮＤに移行する（Ｓ６０４）。
【０１８８】
保存されたコンテキスト情報は、データと同様に、タスクの実行とは非同期的に外部メモリ１０８へと書き出される。外部メモリへの書き出し時のコンテキスト情報の取り扱いで、他の情報と異なる点が２点ある。ひとつは相対アドレス値の扱いであり、もうひとつは読み込み処理の違いである。
【０１８９】
コンテキスト情報は複数のブロックで構成されるが、相対アドレス値として同一の値が使われる。相対アドレス値には、あらかじめ定められた定数が用いられる。コンテキスト情報にはハッシュが付加されているため、ブロックの交換に元々耐性があるためである。コンテキスト情報が保存されたキャッシュラインがフラッシュされる時、取り出された暗号属性は書き出しコンテキストキーＩＤ１４１５に一時的に保持される。その後の処理は、データキャッシュの書き出しと同様である。
【０１９０】
図１６は、保存されたコンテキスト情報からタスクを再開する処理フローである。
【０１９１】
まず、保存されたコンテキスト情報を読み込んでタスクの実行を再開するために、タスクＩＤと保存先メモリアドレスをパラメータとしたresume命令が発行されると、指定されたタスク状態がＳＵＳＰＥＮＤであるかどうか判断される（Ｓ７０１）。ＳＵＳＰＥＮＤ状態にない場合は（Ｓ７０１でＮＯ）、コンテキスト情報が保存されていないので、タスク状態はＩＮＶＡＬＩＤにされる（Ｓ７０７）。換言すれば、resume命令はタスク状態がＳＵＳＰＥＮＤＥＤ以外の場合は、無効である。
【０１９２】
ＳＵＳＰＥＮＤ状態にある場合は（Ｓ７０１でＹＥＳ）、アドレスとタスクＩＤが、それぞれアドレスラインとタスクチャンネルを通して、データキャッシュ９０４に送られる。キャッシュのアドレスがヒットして、かつタグがコンテキストを示しており、タスクＩＤが一致する場合、キャッシュメモリ１４３１上のデータが、レジスタバッファに転送され、タスクの再開処理が開始される（Ｓ７０２）。
【０１９３】
レジスタバッファへのデータ転送と並行してハッシュ計算が行なわれる（Ｓ７０３）。計算したハッシュが期待値と一致するかどうか判断され（Ｓ７０４）、不一致の場合、再開処理は中止され、タスクはＩＮＶＡＬＩＤ状態となる（Ｓ７０７）。
【０１９４】
ハッシュが一致した場合は（Ｓ７０４でＹＥＳ）、カレントタスクレジスタに指定されたタスクのＩＤを設定し（Ｓ７０５）、タスクの状態をＲＵＮに変更して実行が再開される（Ｓ７０６）。
【０１９５】
図１６のフローには記載されていないが、resume命令で指定されたコンテキスト情報の領域がキャッシュにヒットしない場合は、保存されたデータが外部メモリに書き出されている場合である。この場合は、外部メモリからのデータ読み込みが開始される。すなわち、タスクＩＤレジスタ１４０１に保持されたタスクＩＤと、resume命令で指定されたアドレスに対応するメモリの読み出し要求がデータキャッシュ９０４からＢＩＵ９０６に送られる。そして、タスクＩＤとコンテキストを意味する暗号属性が鍵値テーブル９１２へ送られ、ＦＣＭ９１１で復号のための鍵が生成される。ある時点で保存されたタスクのコンテキスト情報は、すべて同じ鍵で暗号化されているので、ブロック単位の鍵生成は行なわない。
【０１９６】
復号が完了したブロックは、順次データキャッシュ９０４へと送られ、タスクスイッチャ（ＳＴＳ）９１４はレジスタバッファアレイ９１５にその内容を読み込む。以後の処理はキャッシュがヒットした場合と同じである。
【０１９７】
＜タスクの終了＞
タスクを終了して、割り当てたタスクＩＤとプロセッサ内の各種テーブルを別の新しいタスクのために再利用するには、タスクＩＤを指定してdelete命令を発行する。本実施形態では、それまでのタスクの内容が不正に覗き見されないように、システム動作中は、一度登録したタスクのタスクＩＤは、その登録を削除しない限り、新しいタスクのために使用することはできない。
【０１９８】
図１７は、タスク削除の処理フローを示す。
【０１９９】
まず、タスクに対してdelete命令が発行されると、指定されたタスクがＩＮＩＴ、ＳＴＯＰＰＥＤ、ＳＵＳＰＥＮＤのいずれかの状態にあるかが判断される（Ｓ８０１）。上記のいずれの状態にもない場合（すなわちＲＵＮ，ＮＵＬＬである場合）には、タスクはＩＮＶＡＬＩＤにされ（Ｓ８０５）、エラーとなる。
【０２００】
上記のいずれかの状態にある場合は（Ｓ８０１でＹＥＳ）、指定されたタスクＩＤに対応するタグが付与されたキャッシュラインがフラッシュされ（Ｓ８０２）。
【０２０１】
これにより、対応する鍵テーブル１３０３〜１３０５、命令キャッシュのオフセットテーブル１２０７、データキャッシュのＭＴＲＲテーブル１４０３もクリアされる（Ｓ８０３）。
【０２０２】
これらの動作が完了すると、タスク状態がＮＵＬＬにされる（Ｓ８０４）。
【０２０３】
Delete命令を発行するのはタスク自身ではなくＯＳであり、delete命令を発行できるのはＲＵＮとＮＵＬＬ以外の状態にあるタスクに対してである。
【０２０４】
タスクが削除されてタスクＩＤがＮＵＬＬ状態となれば、再びregister命令により配布鍵を登録して、新しいタスクを実行することができる。
【図面の簡単な説明】
【０２０５】
【図１】本発明の実施形態に係るマルチパーティのアプリケーション保護環境を示す図である。
【図２】図１のターゲットシステムに内蔵されたマイクロプロセッサの概略構成図である。
【図３】図１のマルチパーティ保護環境を実現するためのブロック対応暗号鍵生成手順を示す図である。
【図４】本発明の実施形態で用いられる情報配置記述子と配布鍵の構成と、これらの情報が配置される仮想アドレス空間のメモリマップを示す図である。
【図５】タスク制御命令の例を示す図である。
【図６】タスク状態遷移の例を示す図である。
【図７】マイクロプロセッサ上でのタスク登録の動作を示す図である。
【図８】タスク登録の処理手順を示すフローチャートである。
【図９】図２に示すマイクロプロセッサ内の命令キャッシュの概略構成図である。
【図１０】図２に示すマイクロプロセッサ内の鍵値テーブルと高速暗号鍵処理モジュールの概略構成図である。
【図１１】図２に示すマイクロプロセッサ内のデータキャッシュの概略構成図である。
【図１２】タスク実行開始の処理手順を示すフローチャートである。
【図１３】命令キャッシュの読み込み（フェッチ）手順を示すフローチャートである。
【図１４】データキャッシュ内部のデータ構造を示す図である。
【図１５】タスク状態保存（ＳＵＳＰＥＮＤ）の処理手順を示すフローチャートである。
【図１６】中断されたタスク再開の処理手順を示すフローチャートである。
【図１７】タスクの終了（削除）の処理手順を示すフローチャートである。
【図１８】従来のマルチパーティアプリケーション保護環境の図である。
【符号の説明】
【０２０６】
１０２  ターゲットシステム（ユーザーシステム）
１０３  マイクロプロセッサ
１０５  秘密鍵
１０８  外部メモリ
１１３  公開鍵
１２１  ソフトウェアベンダ
１２５  配布鍵
１２６  ブロック対応暗号処理部
２００  プロセッサパッケージ
９０２  コア
９０３  命令キャッシュ
９０４  データキャッシュ
９０５  内部バス
９０６  バスインターフェイスユニット（ＢＩＵ）
９１１  高速暗号鍵処理モジュール（ＦＣＭ）
９１２  鍵値テーブル
９１３  配布鍵管理モジュール
９１３−１  シーケンサ
９１３−２  公開鍵復号モジュール
９１４  タスクスイッチャ
９１５  レジスタバッファアレイ
９２１  タスク状態テーブル
９２２  ハッシュ計算部
１１１１  情報配置記述子
１２０３  命令キャッシュメモリ
１２０４、１３０２、１４０１  カレントタスクＩＤレジスタ
１２０５  アクセス検証部
１２０７  オフセットテーブル
１３０３〜１３０５  キーテーブル
１３１１  ディスパッチャ
１３１２  鍵生成モジュール
１３１３  暗号処理モジュール
１４０２  ＭＴＲＲテーブル管理比較部
１４０３  ＭＴＲＲ（アドレス範囲レジスタ）テーブル
１４１１  暗号属性送出部
【図１】
0004643702.tif 000002
【図２】
0004643702.tif 000003
【図３】
0004643702.tif 000004
【図４】
0004643702.tif 000005
【図５】
0004643702.tif 000006
【図６】
0004643702.tif 000007
【図７】
0004643702.tif 000008
【図８】
0004643702.tif 000009
【図９】
0004643702.tif 000010
【図１０】
0004643702.tif 000011
【図１１】
0004643702.tif 000012
【図１２】
0004643702.tif 000013
【図１３】
0004643702.tif 000014
【図１４】
0004643702.tif 000015
【図１５】
0004643702.tif 000016
【図１６】
0004643702.tif 000017
【図１７】
0004643702.tif 000018
【図１８】
0004643702.tif 000019