(57)【特許請求の範囲】
【請求項１】
プログラム命令に応答して、データ処理操作を実施するように構成された処理回路であって、異なる安全レベルを有する複数の操作ドメインを有し、安全ドメイン及びさらなる異なる安全ドメインを備え、前記安全ドメイン内で動作するときに、前記さらなる異なる安全ドメインではアクセスすることができない少なくともいくつかのデータにアクセスすることができる処理回路と、
データと命令とを格納するためのデータ・ストアであって、それぞれの領域が操作の前記複数のドメインのうちの１つに対応する複数の領域を備え、また、前記安全ドメイン内で動作している前記データ処理回路によってアクセスすることができ、前記さらなる異なる安全ドメイン内で動作している前記データ処理回路によってアクセスすることができない、機密データを格納するための少なくとも１つの安全領域と、機密性の低いデータを格納するための低安全領域とを備えるデータ・ストアとを備える、データ処理装置であって、
前記処理回路が、
実行されるべきプログラム命令のために、前記プログラム命令を格納している前記データ・ストアの領域が、前記処理回路の操作の現在のドメインに対応することを検証し、
前記処理回路の操作の前記現在のドメインに対応しない前記データ・ストアの領域に前記プログラム命令が格納されていることを検出することに応答して、
前記プログラム命令がガード命令を備えるかどうかを検証し、
前記プログラム命令が前記ガード命令を備える場合、操作の前記ドメインを、前記プログラム命令を格納している前記データ・ストアの前記領域に対応するドメインに切り替え、
前記プログラム命令が前記ガード命令を備えない場合、安全性違反表示を生成するように構成されている、データ処理装置。
【請求項２】
前記さらなる異なる安全ドメインが、前記安全ドメインよりも低安全であるドメインを備える、請求項１に記載のデータ処理装置。
【請求項３】
前記処理回路が、前記処理回路の操作の現在のドメインの前記安全レベルよりも高安全レベルを有する前記ドメインのうちの１つに対応する前記データ・ストアの領域に前記プログラム命令が格納されていることを検出することだけに応答して、前記プログラム命令がガード命令を備えるかどうかを検証するように構成されている、請求項１又は２に記載のデータ処理装置。
【請求項４】
操作の現在のドメインの前記安全レベルよりも低安全レベルである前記ドメインのうちの１つに対応する前記データ・ストアの領域に格納されている前記プログラム命令に応答して、前記処理回路が、前記命令が前記ガード命令を備えるかどうかにかかわらず、操作の前記ドメインを、前記低安全レベルに切り替えるように構成されている、請求項３に記載のデータ処理装置。
【請求項５】
例外を生成して、フォールト・ハンドリング・コードを実行するために、前記処理回路が前記安全性違反表示に応答する、請求項１から４までのいずれか一項に記載のデータ処理装置。
【請求項６】
前記処理回路が、異なる長さの命令を有する命令セットからプログラム命令を実行するように構成され、前記処理回路によって必要とされる命令アドレス整列が前記異なる長さに依存し、前記ガード命令の長さが、前記ガード命令の先頭が前記プログラム命令のうちの１つの中の前記命令アドレス整列ポイントの少なくとも１つのサブセットのうちの１つに配置されていたとしたら、前記ガード命令の一部が次の命令の先頭と重複し、常に前記命令を超えるほどの長さである、請求項１から５までのいずれか一項に記載のデータ処理装置。
【請求項７】
前記命令アドレス整列ポイントの少なくとも１つのサブセットが、前記命令アドレス整列ポイントのすべてを備える、請求項６に記載のデータ処理装置。
【請求項８】
前記ガード命令の前記長さが、前記命令セットからの最長プログラム命令の長さと等しい、請求項６又は７に記載のデータ処理装置。
【請求項９】
前記ガード命令が複数の部分で構成され、前記複数の部分のうちの少なくとも２つが、前記処理回路によって必要とされる前記命令アドレス整列間の最小距離の長さを有し、前記複数の部分のうちの前記少なくとも２つが同じ値を有する、請求項６から８までのいずれか一項に記載のデータ処理装置。
【請求項１０】
前記ガード命令が前記２つの部分を備える、請求項９に記載のデータ処理装置。
【請求項１１】
前記同じ値が、前記命令セットからの他の任意の命令の有効な操作コードでもなく、操作コードの先頭セグメントでもない、請求項９又は１０に記載のデータ処理装置。
【請求項１２】
前記処理回路によって必要とされる前記アドレス整列と整列する場合、前記命令セットからの別の命令と重複し得る前記ガード命令の任意の部分の値が、前記命令セットからの他の任意の命令の有効な操作コードでもなく、操作コードの先頭でもない、請求項６から１１までのいずれか一項に記載のデータ処理装置。
【請求項１３】
前記データ・ストアが、前記ガード命令と同じ値を有するプログラム・コード内のリテラルとして、どのデータ値も格納しないように構成されている、請求項１から１２までのいずれか一項に記載のデータ処理装置。
【請求項１４】
前記データ・ストアの少なくとも１つのあらかじめ定められたセクションが、前記ガード命令を有効に格納することを許可されるように前記データ・ストアをセグメント化するように構成されており、前記少なくとも１つのあらかじめ定められたセクションではない、前記データ・ストアのセグメント内に配置された前記ガード命令を検出することに応答して、安全性違反表示を生成するように構成されている、請求項１から１３までのいずれか一項に記載のデータ処理装置。
【請求項１５】
前記少なくとも１つのあらかじめ定められたセクションが、前記ガード命令と同じ値を有するどのデータ値も格納しないように構成されている、請求項１４に記載のデータ処理装置。
【請求項１６】
前記データ・ストアの低安全領域に格納されたプログラム・コードによって呼び出すことができる前記プログラム・コードの一部が、少なくとも１つのあらかじめ定められたセクションに格納されている、請求項１４又は１５に記載のデータ処理装置。
【請求項１７】
前記データ・ストアが、前記少なくとも１つのあらかじめ定められたセクション内の命令だけを格納するように構成されている、請求項１４から１６までのいずれか一項に記載のデータ処理装置。
【請求項１８】
前記データ・ストアへのアクセスを制御するためのメモリ・アクセス制御回路を備え、前記メモリ・アクセス制御回路が、前記メモリ・アクセス制御回路内の少なくとも１つのメモリ属性マーカを設定することによって、前記データ・ストアの少なくとも１つのあらかじめ定められたセクションを示すように構成されている、請求項１４から１７までのいずれか一項に記載のデータ処理装置。
【請求項１９】
前記処理回路が、前記ガード命令をドメイン切替え命令として処理し、前記ガード命令に応答して、操作の前記ドメインを、前記ガード命令を格納している前記データ・ストアの前記領域に対応するドメインに切り替えるように構成されている、請求項１から１８までのいずれか一項に記載のデータ処理装置。
【請求項２０】
前記処理回路が、操作の前記現在のドメインを示しているドメイン・フラグから、操作の前記現在のドメインを決定するように構成されている、請求項１から１９までのいずれか一項に記載のデータ処理装置。
【請求項２１】
分岐命令のリターン・アドレスを格納するように構成されたリンク・レジスタを備え、
前記リンク・レジスタに格納された前記リターン・アドレスに分岐するための、前記少なくとも１つの安全領域に格納された分岐命令の実行に続き、前記処理回路が、操作の前記現在のドメインを前記さらなる異なる安全ドメインに切り替えるように構成されている、請求項１から２０までのいずれか一項に記載のデータ処理装置。
【請求項２２】
プログラム命令に応答してデータ処理操作を実施するための処理回路であって、異なる安全レベルを有する操作の複数のドメインを有し、安全ドメイン及びさらなる異なる安全ドメインを備え、前記安全ドメイン内で動作するときに、前記さらなる異なる安全ドメインではアクセスすることができない少なくともいくつかのデータにアクセスすることができる処理回路と、データと命令とを格納するためのデータ・ストアであって、複数の異なる領域を備え、各領域が操作の前記複数のドメインのうちの１つに対応する、データ・ストアと
を備える装置のためのデータ処理方法であって、
（ｉ）実行されるべきプログラム命令のために、前記プログラム命令を格納している前記データ・ストアの領域が、前記処理回路の操作の現在のドメインに対応することを検証するステップと、
（ｉｉ）前記処理回路の操作の前記現在のドメインに対応しない前記データ・ストアの領域に前記プログラム命令が格納されていることを検出することに応答して、
（ｉｉｉ）前記プログラム命令がガード命令を備えるかどうかを検証するステップと、
（ｉｖ）前記プログラム命令が前記ガード命令を備える場合、操作の前記ドメインを、前記プログラム命令を格納している前記データ・ストアの前記領域に対応するドメインに切り替えるステップと、
（ｖ）前記プログラム命令が前記ガード命令を備えない場合、安全性違反表示を生成するステップとを備える、データ処理方法。
【請求項２３】
プログラム命令に応答してデータ処理操作を実施するための処理手段であって、異なる安全レベルを有する操作の複数のドメインを有し、安全ドメイン及びさらなる異なる安全ドメインを備え、前記安全ドメイン内で動作するときに、前記さらなる異なる安全ドメインではアクセスすることができない少なくともいくつかのデータにアクセスすることができる処理手段と、
データと命令とを格納するためのデータ格納手段であって、それぞれが操作の前記複数のドメインのうちの１つに対応する複数の領域を備え、また、前記安全ドメイン内で動作している前記データ処理手段によってアクセスすることができ、前記さらなる異なる安全ドメイン内で動作している前記データ処理手段によってアクセスすることができない、機密データを格納するための少なくとも１つの安全領域と、機密性の低いデータを格納するための低安全領域とを備えるデータ格納手段と
を備えるデータ処理装置であって、
前記処理手段が、
実行されるべきプログラム命令のために、前記プログラム命令を格納している前記データ格納手段の領域が、前記処理手段の操作の現在のドメインに対応することを検証し、
前記プログラム命令が、前記処理手段の操作の前記現在のドメインに対応しない前記データ格納手段の領域に格納されていることを検出することに応答して、
前記プログラム命令がガード命令を備えるかどうかを検証し、
前記プログラム命令が前記ガード命令を備える場合、操作の前記ドメインを、前記プログラム命令を格納している前記データ格納手段の前記領域に対応するドメインに切り替え、
前記プログラム命令が前記ガード命令を備えない場合、安全性違反表示を生成するためのものである、データ処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ処理の分野に関し、詳細には、安全性の異なるドメインを使用するデータ処理装置及び方法に関する。
【背景技術】
【０００２】
多くのデータ処理システム及びアーキテクチャは、機密データ及びコードのセクションを、権限のない人又は処理によるアクセスから隔離して保護する方法を提供する。安全性を提供できることは重要であるが、この保護に関連付けられる性能及び回路領域にオーバーヘッドがある。
【０００３】
データ及びコードを安全に維持する１つの方法は、ＴｒｕｓｔＺｏｎｅ（登録商標）アーキテクチャを有する英国、ケンブリッジのＡＲＭ（登録商標）によって提供され、ＴｒｕｓｔＺｏｎｅアーキテクチャでは、安全状態と非安全状態とが存在し、状態間を移行するために例外命令が使用され、例外ハンドラは安全側の安全性を保護する。この手法は高度な安全性を提供するが、安全性状態を変更するためにソフトウェア例外ハンドラの形で相当なソフトウェア介入を行う必要があり、ソフトウェア介入は、システムの性能を低下させるとともに、すべての呼出しが例外ハンドラを通じてプロキシされなければならないため、安全ソフトウェア用の外部アプリケーション・プログラム・インターフェースＡＰＩを開発するために必要な労力量を増加させる。
【０００４】
マイクロコントローラなどの小型システムの場合、ＴｒｕｓｔＺｏｎｅシステムに存在するオーバーヘッドは許容できない場合があり、したがって、安全性を損なうことなく性能の向上を提供する、状態間を移行するための異なる方法を見つける必要がある。
【０００５】
低安全ドメインから、オーバーヘッドが比較的低く、安全状態への複数のエントリ・ポイントを可能にする、高安全ドメインへ切り替える１つの方法は、パブリック・ドメインからプライベート・ドメイン内の関数に分岐する分岐命令を使用する。関数は、開始時に、それを呼び出している処理が、関数を呼び出すことを許可する十分な特権を有することを確認する安全性確認ルーチンを含むことができ、したがってパスワードがあってもよく、他の確認が実行されてもよい。
【０００６】
この確認を回避する１つの方法は、安全性確認ルーチンを越えたポイントでコードに分岐することであろう。別の攻撃は、関数の終わりに向かってプライベート関数に分岐することを含む場合があるが、これは関数がパブリック側に分岐して戻る前に１つ又は２つの命令の実行をもたらすにすぎない場合がある。しかしながら、これを複数回実行することができる場合、関数は、リターン指向プログラミングと呼ばれるものの中に構築することができる。
【０００７】
英国、ケンブリッジのＡＲＭ  Ｌｔｄに与えられた米国特許第８０１０７７２号は、関数の先頭に配置される許容命令（ｐｅｒｍｉｔｔｅｄ  ｉｎｓｔｒｕｃｔｉｏｎ）を利用してそのような関数の途中にジャンプする攻撃者の能力を阻害する方法を開示しており、処理回路は、低安全ドメインからの分岐命令が、高安全ドメインに分岐する場合、この許容命令に分岐することを確認する。このシステムの欠点は、プロセッサが、許容命令に送信した命令は、低安全ドメインからの分岐命令であったことが分かることを必要とすることである。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】米国特許第８０１０７７２号
【発明の概要】
【発明が解決しようとする課題】
【０００９】
図１は、パブリック側から、プライベート側の許容命令ＰＧへの分岐があるプログラム・コードの実例を示している。図１に示されるように、分岐命令と許容命令との間に例外が発生し、これはＰＧ命令の前に実行されるべき例外ハンドリング・コードを生じさせるので、プロセッサは、どの命令がそれを分岐させたかを、どのような直接的な方法でも決定することができなくなる。この時点で発生した例外の問題に対処する１つの方法は、たとえ例外が発生しても、後の命令が、低安全ドメインからの分岐が先に生じており、まだ確認されていないことが分かるようにするために、分岐命令が実行されるときに設定され得るフラグを使用することである。しかしながら、フラグ自体が改ざんされる可能性があるので、これは潜在的な安全性への影響につながる。
【００１０】
効率的な処理方法で、状態間の切替えの安全性を向上することが望ましい。
【課題を解決するための手段】
【００１１】
第１の態様から見ると、本発明は、
プログラム命令に応答して、データ処理操作を実施するための処理回路であって、異なる安全レベルを有する操作の複数のドメインを有し、安全ドメイン及びさらなる異なる安全ドメインを備え、前記安全ドメイン内で動作するときに、前記さらなる異なる安全ドメインではアクセスすることができない少なくともいくつかのデータにアクセスすることができる処理回路と、
データと命令とを格納するためのデータ・ストアであって、各領域が操作の前記複数のドメインのうちの１つに対応する複数の領域を備え、また、前記安全ドメイン内で動作している前記データ処理回路によってアクセスすることができ、前記さらなる異なる安全ドメイン内で動作している前記データ処理回路によってアクセスすることができない、機密データを格納するための少なくとも１つの安全領域と、機密性の低いデータを格納するための低安全領域とを備えるデータ・ストアとを備える、データ処理装置を提供し、
前記処理回路は、
実行されるべきプログラム命令のために、前記プログラム命令を格納している前記データ・ストアの領域が、前記処理回路の操作の現在のドメインに対応することを検証し、
前記処理回路の操作の前記現在のドメインに対応しない前記データ・ストアの領域に前記プログラム命令が格納されていることを検出することに応答して、
前記プログラム命令がガード命令を備えるかどうかを検証し、
前記プログラム命令が前記ガード命令を備える場合、操作の前記ドメインを、前記プログラム命令を格納している前記データ・ストアの前記領域に対応するドメインに切り替え、
前記プログラム命令が前記ガード命令を備えない場合、安全性違反表示を生成するように構成されている。
【００１２】
本発明は、異なる安全ドメイン間で処理を切り替えるときに生じる安全性への影響を認識し、そのうちのいくつかは異なる安全レベルを有する場合がある。この点で、多くの処理回路は、異なる安全レベルを有するドメイン内で動作し、高安全ドメイン内で動作しているときにのみ利用可能であるいくつかの機密データにアクセスする。異なるドメインは異なるレベルの安全性を有していてもよく、同じレベルの安全性を有しているが、相互から分離されている、兄弟ドメインであってもよい。一般的に、高安全ドメインにおける処理操作は、メモリの低安全領域内のデータにアクセスすることができ、またそれに対応して、メモリの安全領域内のデータにアクセスすることができる。異なるが、同じ安全レベルを有する、兄弟ドメインが存在する場合、それらは両方とも、データ・ストアの同じ低安全領域にアクセスすることができるが、それらのドメインに対応しないが、兄弟ドメインに対応する、安全レベルのメモリの領域に格納された同じ機密性のデータにアクセスすることはできない。処理されているプログラム命令は、データ・ストアの異なる安全領域にも格納され、現在実行されている命令が格納されているデータ・ストアの領域の安全レベルが格納され、一般的に操作の現在のドメインの安全レベルに対応する。この点で、兄弟ドメインに対応するメモリの領域もある。したがって、処理回路が、実行されるべき命令が、異なるドメインに対応する領域から、操作の現在のドメインの領域に取り出されたと決定する場合、これは、問題がある、又は、取り出された命令がガード命令である場合はドメイン切替えが発生するべきであるという表示である。
【００１３】
この点で、操作の現在のドメインの安全レベルよりも高安全であるデータ・ストアの領域に格納された機密データは、処理回路にとってアクセス可能ではなく、高安全領域、又は安全兄弟領域に格納された命令がフェッチされ得ることができる点に留意されたい。これは、命令フェッチはデータ・アクセスが提示するものと同じ安全性への影響を提示せず、命令フェッチはソフトウェアにとって不可視であるので、データ・アクセスと命令フェッチとでは、アクセス許可が異なるように設定されているためである。高安全領域、又は異なる安全領域に格納されたフェッチ命令に関連付けられる安全性への影響はない可能性があるが、それらを実行することに関連付けられる安全性への影響がある可能性がある。
【００１４】
したがって、命令をフェッチする際に、それがフェッチされたデータ・ストアの領域が操作の現在のドメインに対応するか確認するために、確認が行われる。対応しない場合、プログラム命令がガード命令か否かが決定される。プログラム命令がガード命令である場合、処理回路は、ガード命令が取り出されたデータ・ストアの領域に対応する操作のドメインに切り替えて、プログラム命令がガード命令ではない場合、安全性違反表示が生成される。
【００１５】
このように、分岐によってトリガされる、異なるドメイン内の命令へのドメイン切替えは、ガード命令を介してのみ許可される。これによって、ドメイン内の切替えは、ガード命令に到着する方法についての何らかの知識を有することを処理回路が必要とすることを回避しながら、ガード命令だけで生じることが確実になる。処理回路は、単に、操作の現在のドメイン、及び実行されるべき次の命令が格納されている領域に対応するドメインを知るだけでよい。これは、ガード命令がアクセスされる後までドメイン切替えが発生しないのでうまくいき、したがって、切替え前の操作のドメインは、それが操作の現在のドメインであるので知られており、ガード命令の存在は、切替えが許容可能であることを示すのに十分である。さらに、命令の確認をトリガするのは、操作の現在のドメインに対応しないメモリの領域からの命令のフェッチ、及びそれがガード命令である場合は可能なドメイン変更なので、確認及びドメイン変更は、単一の原子操作（ａｔｏｍｉｃ  ｏｐｅｒａｔｉｏｎ）として実行され、それは、操作は途中で中断することができないことを意味する。
【００１６】
異なるドメインに対応する領域内にあり、またガード命令ではない命令がアクセスされると、安全性違反表示が生成される。
【００１７】
これは、ドメイン及びデータ・ストアは対応する安全レベルを有する場合があるが、１対１の関係がない場合がある点に留意されたい。この点で、処理回路の操作のドメイン内よりも、データ・ストア領域内に高安全レベルが存在し得る。しかし、各領域はドメインに対応し、したがって、パブリック・ドメインとプライベート・ドメインの２つの処理ドメイン、並びにパブリック・ドメインに対応するパブリック領域、及びそれぞれプライベート・ドメインに対応する、異なる安全性レベルを有するメモリの３つの異なる安全領域のデータ・ストアの４つの領域があってよく、プライベート領域のうちのいずれかに格納されたガード命令が、プライベート・ドメイン内の処理の切替えをトリガする。
【００１８】
ある実施例では、さらなる異なる安全ドメイン及び安全ドメインは、同じ安全レベルを有する兄弟ドメインでよく、他の実施例では、すべてのドメインが異なる安全レベルを有し、前記さらなる異なる安全ドメインは、前記安全ドメインよりも低安全であるドメインを備える。
【００１９】
いくつかの実施例では、前記処理回路は、前記処理回路の操作の現在のドメインの前記安全レベルよりも高安全レベルを有する前記データ・ストアの領域に前記プログラム命令が格納されていることを検出することだけに応答して、前記プログラム命令がガード命令を備えるかどうかを検証するように構成されている。
【００２０】
いくつかの実施例では、操作の現在のドメインの前記安全レベルよりも低安全レベルであるドメインに対応する前記データ・ストアの領域に格納されている前記プログラム命令に応答して、前記処理回路は、前記命令が前記ガード命令を備えるかどうかにかかわらず、操作の前記ドメインを、前記低安全レベルに切り替えるように構成されている。
【００２１】
一般的に、ガード命令は、異なる安全レベル間の切替えを制御するために使用され得るが、いくつかの実施例では、ガード命令は、低安全ドメインから高安全ドメインに切り替えるときにのみ使用される。安全性問題は、低安全ドメインから高安全ドメインに切り替えるときに、より頻繁に発生することは明らかであり、したがって、この切替えでは、実行する必要があるあらゆる安全性確認を実行できるようにするために、あらかじめ定められたポイントで切り替えることが重要である。したがって、低安全ドメインから高安全ドメインへの切替えを制御するために、ガード命令は特に有用であり、場合によっては、命令の領域が高安全レベルであり、低安全レベルへのドメイン切替えが常に許可される場合、処理回路だけがガード命令を確認する。
【００２２】
しかしながら、特に３つ以上のドメインがある他の場合では、低安全ドメインか高安全ドメインのいずれかから非常に安全であるドメインへの切替えは、同じ方法で実行される場合、すなわちガード命令を介する場合、効率的に管理される。この対称性があれば、そのような切替えを制御するためのソフトウェアの書込みをより簡単にし、コードをより効率的にする。
【００２３】
いくつかの実施例では、例外を生成して、フォールト・ハンドリング・コードを実行するために、前記処理回路が前記安全性違反表示に応答する。
【００２４】
異なるドメインに対応するデータ・ストアの領域からの命令がガード命令ではない場合、異なる安全操作が実行され得る。たとえば、例外が生成されてよく、次いで、現在実行されているソフトウェアがおそらく攻撃ソフトウェアであり、プロセッサの安全側へのアクセスを許可するべきではないことを認識するフォールト・ハンドリング・コードが起動されてよい。高安全システムでは、プロセッサのシャット・ダウン、又は、極端な場合では、回路自体の破壊などの、他の操作が実行されてよい。
【００２５】
いくつかの実施例では、前記処理回路は、異なる長さの命令を有する命令セットからプログラム命令を実行するように構成され、前記処理回路によって必要とされる命令アドレス整列は前記異なる長さに依存し、前記ガード命令の長さは、ガード命令の先頭が前記プログラム命令のうちの１つの中の前記アドレス整列ポイントのサブセットのうちの少なくとも１つに配置されている場合、前記ガード命令の一部が次の命令の先頭と重複するほどの長さである。
【００２６】
他のコードを使用して、ガード命令を誤って模倣することができないことは、明らかに重要である。命令セットが異なる長さの命令を有する場合、処理回路は、異なる長さの命令によって支配される、あるアドレス整列ポイントで命令にアクセスすることができる。命令は、これらのアドレス整列ポイントのうちの１つの途中でアクセスされることがあり、これは、長さが異なるために命令内で時々発生する。これは、命令セットは、ガード命令が他の命令と比較して一意のコードを有するように書かれていることがあるが、ある命令の一部と比較すると一意ではない場合があるので、問題を引き起こす場合がある。これは命令の先頭ではないアドレス整列ポイントのうちの１つで命令に分岐することによって、異なる安全ドメインに不注意なエントリ・ポイントを提供することがある。リターン指向プログラミング攻撃を実行する際に、命令に意図的に分岐することによって有用なコード・シーケンスを見つけることは、一般的な技法である。
【００２７】
ガード命令を模倣することができない隣接する命令の部分の命令の組合せのどの部分も、ガード命令のために大量の符号化空間が予約されることを必要とする場合があることを保証する。この潜在的な問題は、十分に長いガード命令を提供することによって対処されるので、別の命令内で開始する場合、次の命令の先頭と重複することがある。このように、不注意に模倣されないようにするためにガード命令のために予約されなければならない符号化空間の量が減少する。
【００２８】
ある実施例では、たとえばいくつかのアドレス整列が符号化制約のために模倣ハザードをもたらさない場合、考慮されなければならないのはアドレス整列ポイントのサブセットだけでよいが、他の実施例では、別の命令内で開始する際に次の命令との重複を保証するためにガード命令の必要な長さを決定する際に考慮されなければならないのはすべてのアドレス整列ポイントでよい。
【００２９】
場合によっては、これは、ガード命令の長さが、命令セットからの最長プログラム命令の長さと等しいことを意味する。
【００３０】
上記は、たとえば、２つの長さの命令があり、一方は他方の２倍であるケースの可能性がある。そのような場合、命令が命令の先頭と正確に整列しない場合、常に次の命令と重複することを保証するために、最長プログラム命令の長さを有する必要がある。
【００３１】
いくつかの実施例では、前記処理回路によって必要とされる前記アドレス整列と整列する場合、前記命令セットから別の命令と重複し得る前記ガード命令の任意の部分の値は、前記命令セットからの他の任意の命令の有効な操作コードでもなく、操作コードの先頭でもない。
【００３２】
不注意な模倣を回避する１つの方法は、別の命令と重複し得るガード命令の任意の部分の値が、命令セットからの他の任意の命令からの有効な操作コードでもなく、操作コードの先頭でもないことを保証することによるものである。ガード命令のために予約される必要がある符号化空間の量は、そのよう場合、ガード命令と重複する操作コードの一部だけがあり、したがって、この部分も、ガード命令を不注意に模倣しないように予約される必要がある場合があるので、命令の非整列可能性とともに増加する。
【００３３】
これに対処する１つの方法は、命令アドレス整列ポイント間の最小距離の長さと等しい部分のガード命令を符号化して、次いでこれらの部分に同じ値を提供することである。他の命令と重複するのはこの値なので、同じ値が使用される場合、他の命令の操作コード又は操作コードの先頭として使用するために回避される必要があるのはこの値だけである。このように、ガード命令のために予約される符号化空間の量が減少する。
【００３４】
場合によっては、２つの命令長を有し、一方は他方の２倍である場合があり、ガード命令は２つの部分を備え、実際には対称であり、２つの部分における値は、命令セットにおける他の命令のうちのいずれかの操作コード又は操作コードの先頭によって使用される値ではない値である。
【００３５】
いくつかの実施例では、前記同じ値は、前記命令セットからの他の任意の命令の有効な操作コードでもなく、操作コードの先頭セグメントでもない。
【００３６】
前述のように、この同じ値は、前記命令セットの他の任意の命令の有効な操作コードであるべきではなく、実際には、操作コードの先頭セグメントであるべきでもない。
【００３７】
いくつかの実施例では、前記データ・ストアは、ガード命令と同じ値を有するプログラム・コード内のリテラルとして、どのデータ値も格納しないように構成されている。
【００３８】
命令セットからの命令の操作コードが、ガード命令を不注意に模倣することを停止することが１つであるが、いくつかのプログラム・コードでは、データ値はリテラルとしてプログラム・コード内に格納され、これらのリテラルは、コード内の命令によってアクセスされる様々なアドレスに格納されている。この種類のプログラム・コードでは、リテラルも攻撃の間の分岐のターゲットでよく、したがって、これらのリテラルもガード命令を不注意に模倣しないことが重要である。したがって、いくつかの実施例では、どのデータ値も、ガード命令と同じ値を有するプログラム・コード内にリテラルとして格納されないことを保証するための処理がある。
【００３９】
いくつかの実施例では、一致するリテラルの生成は、コード生成時間で回避され得る。たとえば、コンパイラは、リテラル・プール内の一致するリテラル値を放出する要件を削除するために、リテラル・アクセスが一致するリテラルをフェッチして、生成されたコードを変更するケースを検出するように構成され得る。ある実施例では、コンパイラは、データ処理操作を使用して、いくつかの非一致リテラル・アクセスの値を結合することによって、プロセッサ・レジスタ内に所望の値を形成することができる。たとえば、一致するリテラルが４の場合、これを２×２に変更することができる。別の実施例では、コンパイラは、即時移動（ｍｏｖｅ  ｉｍｍｅｄｉａｔｅ）のシーケンス及びデータ処理操作を使用することによって、所望の値を形成することができる。
【００４０】
いくつかの実施例では、実行可能なプログラムは、ガード命令と同じ値を有するリテラル値を検出するために、スキャンされたポスト・ジェネレーションでよい。いくつかの実施例では、スキャニング処理は、プログラム開発処理の一部でよく、ソフトウェアを配布する前に確認として使用されてよい。他の実施例では、スキャニング処理は、実行するためにロードされた、一致するリテラル値が発見されると、プログラムが実行されることを防止する効果を有する、実行可能な処理として実行されてよい。
【００４１】
いくつかの実施例では、前記データ処理装置は、前記データ・ストアの少なくとも１つのあらかじめ定められたセクションが、前記ガード命令を有効に格納することを許可されるように前記データ・ストアをセグメント化するように構成されており、前記データ処理回路は、前記少なくとも１つのあらかじめ定められたセクションではない、前記データ・ストアのセグメント内に配置された前記ガード命令を検出することに応答して、安全性違反表示を生成するように構成されている。
【００４２】
ガード命令が不注意に模倣されることを防止する別の方法は、データ・ストアをセグメント化して、あらかじめ定められたセクションだけに格納することである。これが行われると、ガード命令を不注意に格納していないことを確認するために監視される必要があるのはこれらのセクションだけである。ガード命令に分岐する際、アクセスされるデータ・ストアの領域があらかじめ定められたセクションであることを確認するために確認が行われ、あらかじめ定められたセクションではない場合、安全性違反表示が生成される。これによって、リテラルの形態でガード命令を格納しないが、データ・ストアをセグメント化して、このセグメント化を何らかの方法で示す必要性のオーバーヘッドを有することを保証するために確認される必要があるコードの量が減少する。
【００４３】
いくつかの実施例では、低安全コードによって呼び出すことができる前記プログラム・コードの一部は、前記少なくとも１つのあらかじめ定められたセクションに格納されている。
【００４４】
ガード命令は、コードのある部分でのみ発生する。ガード命令が、低安全ドメインから高安全ドメインへ切り替えるためだけに使用されるいくつかの実施例では、コードのこの部分は、低安全関数によって呼び出すことができるコードである。この場合は、コードのこれらの部分をあらかじめ定められたセクション内に格納することは、ガード命令がこれらのセクション内に常に配置されていることを意味する。
【００４５】
代替で、及び／又はさらに、前記データ・ストアは、前記少なくとも１つのあらかじめ定められたセクションに命令だけを格納するように構成されている。
【００４６】
前述のように、命令がガード命令を不注意に模倣することを回避することは非常に簡単であるが、データ・リテラルは任意の値を有することができるので、データ・リテラルがガード命令を不注意に模倣することを回避することはより困難である。したがって、これに対処する１つの方法は、データ・ストアを、ガード命令を発見することができ、命令だけが格納され得る、あらかじめ定められたセクションにセグメント化することである。言い換えれば、データ・リテラルはこれらのコードのセクションでは許可されない。内部にデータ・リテラルを有することを回避するためにコードをコンパイルすることは、コードのサイズ及び速度に著しい影響がある。しかしながら、このようにコンパイルする必要があるガード命令を含むことができるのがコードのあるセクションだけの場合、性能及びコード・サイズへの全体的な効果は低い。
【００４７】
いくつかの実施例では、前記データ処理装置は、前記データ・ストアへのアクセスを制御するためのメモリ・アクセス制御回路を備え、前記メモリ・アクセス制御回路は、前記メモリ・アクセス制御回路内のメモリ属性マーカを設定することによって、前記データ・ストアの少なくとも１つのあらかじめ定められたセクションを示すように構成されている。
【００４８】
あらかじめ定められたセクションをマークする１つの方法は、メモリ・アクセス制御回路内の属性マーカでマークすることによる。一般的に、メモリ・アクセス制御回路は、データ・ストアの異なる安全セクションへのアクセスを制御するために存在し、データ・ストアのセクションの属性は、アクセス要求のアドレスと様々な領域のアドレスとを比較して、特定のアドレスが有しているのはどの属性か、及びアクセスが許可されるべきか否かを決定する、メモリ・アクセス制御回路内に格納されている。さらなるメモリ属性マーカは、データ・ストアの特定のセクションが、ガード命令を格納することを許可された、あらかじめ定められたセクションであることを示すために使用され得る。
【００４９】
あらかじめ定められたセクションをマークする別の方法は、メモリ・アクセス制御回路を、あらかじめ定められたセクションとしてマッピングされたアドレス空間の領域を有する固定されたアドレス・マップで構成することである。いくつかの実施例では、前記処理回路は、前記ガード命令をドメイン切替え命令として処理し、前記ガード命令に応答して、操作の前記ドメインを、前記ガード命令を格納している前記データ・ストアの前記領域に対応するドメインに切り替えるように構成されている。
【００５０】
処理回路は、処理回路の操作の現在のドメインとは異なるドメインに対応するデータ・ストアの領域に格納されている適切な値を有する命令を検出することに応答してドメインを切り替えるように構成することができるが、場合によっては、実行されると、ドメインを、それが格納された領域のドメインに切り替えるよう処理回路を制御する制御信号を生成するのは、ガード命令自体である。
【００５１】
本発明の第２の態様は、
プログラム命令に応答してデータ処理操作を実施するための処理回路であって、異なる安全レベルを有する操作の複数のドメインを有し、安全ドメイン及びさらなる異なる安全ドメインを備え、前記安全ドメイン内で動作するときに、前記さらなる異なる安全ドメインではアクセスすることができない少なくともいくつかのデータ、並びにデータ及び命令を格納するためのデータ・ストアにアクセスすることができ、前記データ・ストアが複数の異なる安全領域を備え、各領域が操作の前記複数のドメインのうちの１つに対応する、処理回路を備える、装置のためのデータ処理方法を提供し、前記方法は、
実行されるべきプログラム命令のために、前記プログラム命令を格納している前記データ・ストアの領域のドメインが、前記処理回路の操作の現在のドメインに対応することを検証するステップと、
前記処理回路の操作の前記現在のドメインに対応しない前記データ・ストアの領域に前記プログラム命令が格納されていることを検出することに応答して、
前記プログラム命令がガード命令を備えるかどうかを検証するステップと、
前記プログラム命令が前記ガード命令を備える場合、操作の前記ドメインを、前記プログラム命令を格納している前記データ・ストアの前記領域に対応するドメインに切り替えるステップと、
前記プログラム命令が前記ガード命令を備えない場合、安全性違反表示を生成するステップとを備える。
【００５２】
本発明の第３の態様は、
プログラム命令に応答してデータ処理操作を実施するための処理手段であって、異なる安全レベルを有する操作の複数のドメインを有し、安全ドメイン及びさらなる異なる安全ドメインを備え、前記安全ドメイン内で動作するときに、前記さらなる異なる安全ドメインではアクセスすることができない少なくともいくつかのデータにアクセスすることができる処理手段と、
データと命令とを格納するためのデータ格納手段であって、それぞれが操作の前記複数のドメインのうちの１つに対応する複数の領域を備え、また、前記安全ドメイン内で動作している前記データ処理手段によってアクセスすることができ、前記さらなる異なる安全ドメイン内で動作している前記データ処理手段によってアクセスすることができない、機密データを格納するための少なくとも１つの安全領域と、機密性の低いデータを格納するための低安全領域とを備えるデータ格納手段と
を備えるデータ処理装置であって、
前記処理手段が、
実行されるべきプログラム命令のために、前記プログラム命令を格納している前記データ格納手段の領域が、前記処理手段の操作の現在のドメインに対応することを検証し、
前記プログラム命令が、前記処理手段の操作の前記現在のドメインに対応しない前記データ格納手段の領域に格納されていることを検出することに応答して、
前記プログラム命令がガード命令を備えるかどうかを検証し、
前記プログラム命令が前記ガード命令を備える場合、操作の前記ドメインを、前記プログラム命令を格納している前記データ格納手段の前記領域に対応するドメインに切り替え、
前記プログラム命令が前記ガード命令を備えない場合、安全性違反表示を生成するためのものである、データ処理装置を提供する。
【００５３】
本発明を、ほんの一例として、添付の図面に示される本発明の実施例を参照してさらに説明する。
【図面の簡単な説明】
【００５４】
【図１】従来技術における、ドメインの切替えを示す命令ストリームを示す図である。
【図２】本発明のある実施例による、データ処理装置を示す図である。
【図３】処理ドメインの３つの異なる安全レベルを示す図である。
【図４】本発明のある実施例による、メモリ保護ユニットを示す図である。
【図５】本発明のある実施例による、メモリ・アドレス空間のセグメント化を示す図である。
【図６】命令が、複数の長さを有する命令と正しく整列されない方法を示す図である。
【図７】２者間の切替えがある、パブリック・ドメイン及びプライベート・ドメイン内で実行しているコードを示す図である。
【図８】本発明のある実施例による、方法におけるステップを示す流れ図である。
【図９】操作の異なるドメインの実例を示す図である。
【図１０】メモリ属性確認フローを示す流れ図である。
【発明を実施するための形態】
【００５５】
図２は、本発明のある実施例によるデータ処理装置１０を示しており、たとえばマイクロコントローラでよい。データ処理装置１０は、命令を処理するための処理回路２０と、処理回路２０によって処理されるデータを格納するための、及び処理回路２０が実行するプログラム・コードを格納するためのデータ・ストア３０とを備える。
【００５６】
プログラム・コードはコンパイルされたコードでもよく、コンパイラ（図示せず）によって処理装置上でコンパイルされたコードでもよい。プログラム・コードは、異なるタスクを実行するために処理回路２０を制御するプログラム命令で構成されている。
【００５７】
この実施例では、処理回路２０は、命令フェッチ段階２２、命令復号段階２４、及び命令実行段階２６を有するパイプラインの形態である。理解されるように、これは簡略図であり、レジスタ・リネーミング段階などのさらなる段階があってよい。処理回路は、安全である、又は低安全である操作のドメインを有し、この実施例では、これは一般的に、実行されているコードが格納されているデータ・ストア領域の安全性レベルによって決定される。
【００５８】
データ・ストア３０は、安全領域３２と低安全領域３４の、安全性の異なる２つの領域を有する。安全領域３２に格納されたデータは、実行する際に、低安全領域３４に格納されたコードにとってアクセスすることはできない。しかしながら、安全領域３２に格納された命令は、命令はソフトウェアには不可視であるので、低安全ドメイン内で動作するときに、処理回路２０のフェッチ段階２２によってフェッチすることができ、したがって、ドメインを横切る命令へのアクセスが許可される。
【００５９】
データ・ストアは単一のブロックとして示されているが、多くの場合、データは異なるレベルのキャッシュ及びメイン・メモリなどの異なるヒエラルキを有する複数のタイプのデータ・ストレージで構成されている。これらのストアのそれぞれは、安全領域又は低安全領域にデータを格納する。
【００６０】
データ処理装置１０は、アクセス許可のこのセグメント化を制御するメモリ保護ユニットＭＰＵ（ｍｅｍｏｒｙ  ｐｒｏｔｅｃｔｉｏｎ  ｕｎｉｔ）４０も有する。この制御は、図示されるように、中央メモリ保護ユニットを通じて行うことができるが、他の実施例では、現在実行及び格納されている領域コードを監視して、これに依存してメモリの異なる領域へのアクセスを制御する、処理装置内の回路によって、より分散された方式で行うことができる。
【００６１】
この実施例では、ＭＰＵは２つのセクションを有し、１つがデータ・ストア３０に格納された命令へのアクセスを制御し、１つがデータへのアクセスを制御する。前述のように、安全部分に格納された命令への命令フェッチは、低安全ドメイン内で実行している処理回路から許可される。
【００６２】
この実施例では、データ処理の間に使用される汎用レジスタを有するレジスタ・バンク５０がある。これらの汎用レジスタは、どの命令が次に実行されるべきかを示すプログラムカウンタＰＣと、分岐命令のリターン・アドレスを格納するためのリンク・レジスタなどの特定の機能を有する他のレジスタとを含む。
【００６３】
レジスタ・バンク５０内には、処理されているデータ値を格納するためのデータ・レジスタもある。或いは、いくつかの実施例では、レジスタはデータ値を格納するために使用されず、値はスタックに格納されて、レジスタのうちの１つに格納されるスタック・ポインタを介して間接的にアクセスされる。これは、明らかに領域節約（ａｒｅａ  ｓａｖｉｎｇ）になるが、パフォーマンス・ヒットがない。
【００６４】
前述のように、この実施例では、処理回路２０が実行しているドメインは、一般的に現在実行されているコードが格納されている領域から決定される。したがって、安全データ・ストア３２に格納された安全プログラム・コードは、一般的に安全ドメインで実行される。実行のドメインは、処理回路２０によって設定されるドメイン・フラグ４４によって示され、アクセス許可を決定するためにＭＰＵ４０によってアクセスされる。
【００６５】
処理回路２０が実行するための命令をフェッチして、ドメイン・フラグが、それは処理回路が現在実行されていないドメインからであると示すと、処理回路２０が、命令がガード命令であることを検証するための確認を実行する。処理回路２０は、ガード命令の知られている操作コードに対してフェッチされた命令の操作コードを確認することによってこれを行う。それがガード命令である場合、これは復号化されて実行され、これは、ドメインを、ガード命令がフェッチされたメモリの領域に対応するドメインに切り替えるために、ドメイン・フラグ４４を更新するために処理回路を制御する。したがって、たとえば、処理回路２０が、低安全ドメイン内で現在動作しており、メモリの安全領域３２からのガード命令がフェッチされるように分岐が実行される場合、処理回路は安全ドメイン内での実行に切り替える。
【００６６】
ガード命令は、安全領域への許可されたエントリ・ポイントに配置され、ガード命令に従って実行されるコードは、安全ドメインへの呼出しが有効であることを検証するために安全確認ルーチンを備えてよく、これは、パスワードの確認、又は供給される他の関数の引数の有効性の確認を含み得る。
【００６７】
フェッチされた命令がガード命令ではなく、操作の現在のドメインとは異なるドメインを有する安全領域からである場合、安全性違反表示が生成される。これは、生成されている例外、及び実行されているフォールト・ハンドリング・ルーチンの形態をとることができる。
【００６８】
図３は、最低安全ドメイン、安全ドメイン、及び最高安全ドメインの、非常に概略的な３つの処理ドメインを示している。これらのドメインのそれぞれの中で、プログラミング・コードが実行されて、ドメインに応じて、データ・ストアからの異なるレベルの安全データがアクセスされ得る。データへのアクセス許可は、実行のドメインの安全性レベル、及びデータが格納されているメモリの領域の安全性レベルに応じて与えられる。この実施例では、ドメイン間のどの切替えも、この実例ではＰＧとして示されるガード命令を介して実行される。場合によっては、ガード命令は、低安全ドメインから高安全ドメインに切り替えるときにのみ必要とされるが、この切替え要件が対称的に実行される場合、高安全領域から低安全領域に行くときに転送もガード命令を介して実行されるように、システムを実装することがより効率的である場合がある。したがって、異なる安全ドメイン内でルーチンを呼び出す場合、これは、ルーチンの先頭に配置されたガード命令をフェッチすることによって行われる。
【００６９】
この実施例では、３つのドメインが異なる安全レベルを有するものとして示されているが、いくつかの実施例では、ドメインのうちの少なくとも２つは、同じ安全レベルを有しているが、相互から分離されている、兄弟ドメインでよい点に留意されたい。したがって、安全ドメイン、及び最高安全ドメインは、実際には安全１及び安全２でよく、これらの２つの安全ドメインにおける処理操作は、メモリの最低安全領域内のデータ、及びそれら自体のドメインに対応するメモリの安全領域にアクセスすることができるが、それらの兄弟ドメインにアクセスすることはできない。
【００７０】
図４は、図２のメモリ保護ユニット４０をより詳細に示している。メモリ保護ユニットＭＰＵ４０は、処理回路２０からデータ・ストア３０へのアクセスを制御して、適切な属性を有するデータ・ストア３０の領域だけがアクセスすることができることを保証する。
【００７１】
この実施例では、データ・アクセス及び命令アクセスは、異なるポートで受信されて、並列に処理され得る。比較器４１及び４２は、データ・アクセスのアクセス・アドレス及び命令アクセスを、それぞれコンフィギュレーション・レジスタ４３から取り出された領域のアドレスと比較する。コンフィギュレーション・レジスタ４３は、データ・ストア３０の異なる領域の詳細を格納する。すなわち、コンフィギュレーション・レジスタ４３は、領域のアドレス、領域のサイズ、及び領域の属性を格納する。これらの属性は、安全性レベル又は領域、領域が読出し専用領域又は書込み専用領域かどうか、などを示す。したがって、アクセスが対象としているのはメモリのどの領域かを比較器が一旦決定すると、属性確認ブロック４５は、アクセスが許可されるか否かを決定するために、コンフィギュレーション・レジスタ４３に格納されたその領域の属性を使用する。属性確認ブロック４５は、ドメイン・フラグ４４にアクセスすることができ、アクセスが許可されるべきか否かを決定するときに、処理回路２０の操作の現在のドメインの安全レベルを決定することができる。データ・アクセスが有効なアクセスであると決定されると、メモリにアクセスすることができ、データ・アクセスが有効なアクセスではないと決定されると、フォールトが生成される。
【００７２】
この点で、命令アクセスが、ドメイン・フラグ４４によって示されたドメインに対応しないメモリの領域内の命令へのアクセスである場合、属性確認はこれを決定して、命令を返すときにこれを処理回路２０に信号で伝える。
【００７３】
この信号に応答して、処理回路は、返された命令がガード命令かどうかを確認する。返された命令がガード命令である場合、ドメイン・フラグ４４は、命令がフェッチされたデータ・ストア３０の領域のドメインに対応するドメインに更新され、返された命令がガード命令ではない場合、処理回路２０によって安全性違反表示が生成される。
【００７４】
ガード命令が検出された場合のみドメイン間の切替えが許可されるので、このガード命令を模倣し得る、分岐され得る不注意な符号化がないことが重要である。１つだけの命令サイズを有する命令セットでは、他の任意の命令によって使用されないガード命令の一意の操作コードを単に有することが十分な場合がある。しかしながら、プログラム・コード内で符号化されたリテラルがある場合、たとえ単一の命令長であっても、ガード命令の符号化がプログラム・コード・セクションにリテラルとして不注意に格納されないよう注意しなければならない。
【００７５】
これが生じることを回避するために、ガード命令を符号化していないことを確認するために、格納されるすべてのリテラルへの確認があってよい。或いは、メモリの特定のセクションだけがガード命令を含むことを許可されるようにするために、メモリがセグメント化されてよい。これらのセクションは、データ・リテラルを格納することを禁止される場合があり、或いは、このセクションに格納されるすべてのデータ・リテラルが確認され得る。
【００７６】
図５は、このようにセグメント化されたデータ・ストア３０を概略的に示している。したがって、予約されたセクション、低安全セクション３４、及びガード命令を格納することができる単一のセクション３５を有する安全セクション３２がある。このセクションは、メモリ保護ユニット４０内のコンフィギュレーション・レジスタにおいて、この特定の属性を有するものとしてマークされ得る。したがって、ガード命令が識別されて、データ・ストア内の別の場所に格納されると、これは安全性違反表示を生成する。
【００７７】
このようにメモリをセグメント化することによって、ガード命令を不注意に符号化していないことを確認せずに、リテラルをメモリ内の別の場所に格納することができるようになる。本システムは、リテラルがここに格納されないようにするために、実行専用コードだけがセクション３５に格納されるように構成され得る。コードをコンパイルするときに、リテラル・プールを削除することができるが、これはコード・サイズ及び処理速度に著しい影響を及ぼす。しかしながら、このようにコンパイルされるのがコードの小さな部分だけである場合、全体的な効果及び性能、並びにコード・サイズは非常に小さい。セクション３５のサイズ及び配置は、初期化時に設定されてもよく、現在実行されているコードに応じて処理回路によって設定されてもよい点に留意されたい。
【００７８】
このセクションに格納されているコードのタイプを制限する別の可能な方法は、低安全関数から呼び出すことができるあらゆるコードをここに格納することである。ガード命令は、ドメイン間で移動する際に使用され、またいくつかの実施例では、高安全ドメインと低安全ドメインとの両方の間で移動するために使用され得るが、低安全ドメインから高安全ドメインに移動するときの方が明らかにより重要であり、場合によっては、使用されるのはこれらのインスタンスにおいてのみである。そのような場合、低安全関数から呼び出すことができるのはコードのみであり、そのコードはその中にガード命令を有する場合があり、したがって、このコードの格納をセクション３５に制限することによって、ガード命令が別の場所で見つかると、これはフォールトであり、不注意な符号化に違いないことを保証する。
【００７９】
データ・リテラルからのガード命令の模倣は、回避することが明確に非常に難しい問題であるが、命令による不注意な符号化は対処することが比較的容易である。しかしながら、場合によっては、また具体的には、異なる長さの命令がある場合、これ自体が何らかの問題を提起する場合がある。
【００８０】
たとえば、図６は、３２ビット命令と１６ビット命令の２つの長さの命令を有する命令ストリームの実例を示している。命令の先頭が配置されなければならない、処理回路によって必要とされるアドレス整列ポイントがあり、これらは１６ビットごとに発生し、この場合は最小命令長に対応する。各命令は、命令の関数を決定する操作、又は操作コードで開始し、この実例では、宛先レジスタが識別されて、データ値又は即値が提供される、さらなる部分がある。
【００８１】
リターン指向プログラミング攻撃を実行する際に、命令の途中に意図的に分岐することによって有用なコード・シーケンスを見つけようとすることは、一般的な技法である。したがって、どの命令もガード命令を模倣しないことだけでなく、正しく整列されない符号化が偶然ガード命令を模倣しないことが重要である。この場合、命令長が２つだけあり、ガード命令のあらゆる不注意な模倣を回避するために、ガード命令は最大長を有するように作成されて、それぞれが同じ値を有する２つの部分と対称的に作成される。このように、たとえ正しく整列されない場合でも、後半の部分は次の命令の先頭、したがってその操作コードと重複するので、各部分は他の任意の命令の操作コード、又は操作コードの先頭セクションを有してはならない。したがって、部分内のガード命令を等しい値で符号化することによって、操作コード内で使用されることから除外されるのはこの値だけであり、したがって、ガード命令専用にする必要がある符号化空間の量が減少する。
【００８２】
想像できるように、必ずしも相互の直接倍数ではない、より長い長さの命令を有する場合、アドレス整列ポイントは、命令内の異なる可能な位置でより頻繁になってよい。そのような場合、ガード命令が、命令内で開始する場合、次の命令と重複することが重要である。このように、重複する部分は、操作コードの少なくとも一部に位置しており、この部分が、他の任意の操作コード、又は他の操作コードの開始と比較して無効である場合、たとえ分岐が命令の先頭をターゲットとしなくても、命令セット内のどの命令によってもガード命令を模倣することはできない。
【００８３】
図７は、実行されているプログラム・ストリームを概略的に示している。まず、パブリック・メモリに格納されたコードがパブリック処理ドメインで処理され、この実行の間、以前のリンク・レジスタ値がスタックに保存され、次いで、分岐命令が実行されて、これによって、プライベート・メモリに格納されたコードへの処理回路の分岐、及びリンク・レジスタへの新しい分岐リターン・アドレスの格納が生じる。この実例では、プライベート・メモリからフェッチされた命令はガード命令であり、これは処理回路が依然としてパブリック・ドメイン内で動作している間にフェッチされる。したがって、ドメイン・フラグがパブリック・ドメインを示して、ＭＰＵは、処理回路がパブリック・ドメインで実行していても、取り出された命令がプライベート・メモリに格納されていることを検出する。ＭＰＵが、現在のドメインの安全レベルよりも高安全である領域内の命令がフェッチされたことを処理回路に示す。
【００８４】
これによって、フェッチされた命令がガード命令であることを確認して、ガード命令であることを検証する際に、プライベート・メモリに格納された後続の命令を実行できるようにするために、プライベート・ドメインを示すためにドメイン・フラグを設定することによって処理ドメインを切り替えるように、処理回路がトリガされる。次いで、関数呼出しが有効であることを保証する安全性確認ルーチンから開始する後続のコードが実行されて、次いでプライベート関数が実行される。
【００８５】
このように、安全性確認ルーチンが回避されることを許可するプライベート関数の途中で命令への分岐は発生できない。これは、現在動作しているドメインの安全レベルよりも高安全であるメモリの領域からフェッチされている命令に応答して発生する命令確認が、フェッチされた命令はガード命令ではないことを示し、安全性違反表示が生成されるためである。
【００８６】
図８は、本発明の実施例の方法によるステップを示す流れ図を示している。まず、命令がフェッチされて、フェッチされるメモリの領域が、処理回路の現在処理しているドメインに対応するかどうかが決定される。これは、図２に示されるドメイン・フラグ４４を見ることによって行われる。
【００８７】
対応するドメインを有している場合、命令が実行されて、次の命令がフェッチされる。異なるドメインに対応する場合、命令がガード命令か否かが決定される。命令がガード命令ではない場合、安全性違反があり、安全性違反表示がアサートされる。命令がガード命令である場合、処理ドメインが、ガード命令を格納したデータ・ストアの領域に対応する処理ドメインに切り替えられ、この場合、次の命令をフェッチする前に処理回路もガード命令を実行する。このように、ドメインの切り替えは、ガード命令が見つかったときのみ発生する。
【００８８】
この詳細は、異なるドメイン間の切替えがガード命令を必要とする、非常に一般的な方法であるが、図７に関して開示されるものなどのいくつかの実施例では、ガード命令は、低安全ドメインから高安全ドメインに切り替える場合のみ必要であり、最初の評価が、処理ドメインの安全レベルよりも高安全である命令を格納しているデータ・ストアの領域の安全レベルであり、それがガード命令であるか否かを検証するために命令が確認される場合のみあてはまり、ガード命令ではない場合は命令が単に実行される点に留意されたい。
【００８９】
特定の実施例のいくつかのさらなる詳細を以下で説明する。
【００９０】
注：いくつかのレジスタはパブリック状態とプライベート状態との間にバンクされており、以下の命名規約は、レジスタのどのバージョンがアクセスされるべきかを定義するために使用される：
・＜ｒｅｇｉｓｔｅｒ  ｎａｍｅ＞−特定のバージョンは指定されず、現在の状態に関連付けられるバージョンが使用される。この通知は、バンクされていないレジスタのためにも使用される。
・＜ｒｅｇｉｓｔｅｒ＿ｎａｍｅ＞＿Ｐ−レジスタのプライベート・バージョンが使用される。
・＜ｒｅｇｉｓｔｅｒ＿ｎａｍｅ＞＿ＮＰ−レジスタの非プライベート／パブリック・バージョンが使用される。
【００９１】
プライベート状態
図９に示されるように、既存のスレッド／ハンドラ・モードに直交するコア（及びより広範なシステム）に、新しいプライベート状態が追加される。システムがパブリック状態のうちの１つで実行しているときに、プライベートとしてマークされているリソースにアクセスしようとすることは、障害をもたらす。
【００９２】
プロセッサが実行しているのはこれらの４つの状態のうちのどれかは、既存のスレッド／ハンドラ・ロジックと、ソフトウェアにとって直接には不可視である新しいアーキテクチャ・フラグとの組合せによって定義される。擬似コードでは、このフラグはＣｕｒｒｅｎｔＳｔａｔｅと呼ばれる変数によって表わされ、以下のように定義される：
ｅｎｕｍｅｒａｔｉｏｎ  ＰｒｉｖａｃｙＳｔａｔｅ  ｛ＰｒｉｖａｃｙＳｔａｔｅ＿Ｐｕｂｌｉｃ，ＰｒｉｖａｃｙＳｔａｔｅ＿Ｐｒｉｖａｔｅ｝；
ＰｒｉｖａｃｙＳｔａｔｅ  ＣｕｒｒｅｎｔＳｔａｔｅ；
【００９３】
アドレス空間保護
プライベートとしてマークされ得るすべてのメモリ、及び周辺にマッピングされた他のメモリは、チップ上にあると仮定され、したがってそれらを保護するための暗号化は必要ない。アドレス空間への任意のアクセスは、トランザクションをパブリック又はプライベートとしてマークするために使用される、新しい属性Ｐ−Ａｔｔｒを含む。Ｐ−Ａｔｔｒの伝達は、処理系定義（ｉｍｐｌｅｍｅｎｔａｔｉｏｎ  ｄｅｆｉｎｅｄ）である。
【００９４】
プライベートとしてマークされたすべてのアドレス範囲は、それらの開始及び終了アドレスを３２バイト境界に整列する必要がある。
【００９５】
資産保護拡張は、以下を必要とする：
・プライベートとしてマークされたアドレス空間の領域は、プライベートに設定されたＰ−Ａｔｔｒを有するトランザクションによってのみアクセス可能でなければならない。パブリックに設定されたＰ−Ａｔｔｒを有するプライベートアドレスへのどのアクセスも、要求を生成したコンポーネントに報告されるエラーをもたらさなければならない。
・プロセッサは、アドレスのプライバシー状況を決定することができ、これは以下のオプションのうちの１つによって達成される：
・Ａ  ＰＡＵ（ｐｒｉｖａｃｙ  ａｔｔｒｉｂｕｔｉｏｎ  ｕｎｉｔ）
【００９６】
資産保護拡張は、新しいＰ−Ｒｅｑ属性も定義する。新しいＰ−Ｒｅｑ属性は、データ・トランザクションが実行されるようコアが要求するプライバシー状態を定義し、そうでない場合は、指定されたＰ−Ｒｅｑはコアのプライバシー状態と等しい。
【００９７】
ＭＰＵ拡張
資産保護拡張は、以下の方法でＭＰＵ機能性を拡張する：
・ＭＰＵコンフィギュレーション・レジスタが、プライバシーでバンクされる。ＭＰＵメモリ属性及び特権確認は、現在プライバシー状態を実行しているプロセッサに対応するコンフィギュレーション・レジスタを使用する。
・プライバシー属性ユニット（ＰＡＵ）−この新しいブロックは、パブリック又はプライベートのいずれかとしてメモリ領域を帰属することを担当する。
【００９８】
プライバシー属性ユニット
プライバシー属性ユニット（ＰＡＵ）が以下の機能を実行する：
・トランザクションの早期スクリーニング。これによって、プライバシー侵害を早期に（すなわち、メモリ・アクセスが実行される前に）捕えて、ＢｕｓＦａｕｌｔとして報告される代わりに、有意義な形で報告することができるようになる。
・命令がフェッチされる、プライバシー・ドメインについての情報を提供する。
【００９９】
ＰＡＵコンフィギュレーションはいくつかのメモリ領域を定義し、領域の数はＩＭＰＬＥＭＥＮＴＡＴＩＯＮ  ＤＥＦＩＮＥＤであり、ＰＡＵ＿ＴＹＰＥ．ＰＲＥＧＩＯＮフィールドを読むことによって発見可能である。これらの領域はＰＡＵ＿ＲＥＧＩＯＮｎと名付けられ、ｎは０からＰＡＵ＿ＴＹＰＥ．ＰＲＥＧＩＯＮ−１への数である。これらの領域に関連付けられるコンフィギュレーション・フィールドに直接アクセスすることはできないが、代わりに、以下の表に示されるウインドウ・レジスタを介して間接的にアクセスする：
【０１００】
【表１】
0006272875.tif 000002
【０１０１】
メモリ・アクセスが実行されると、ＰＡＵが照会される。アドレスが、ＰＡＵで定義された領域のうちの１つに一致する場合（すなわち、ＰＡＵ＿ＲＥＧＩＯＮｎ．ＢＡＤＤＲ＜＝Ａｄｄｒｅｓｓ＜ＰＡＵ＿ＲＥＧＩＯＮｎ．ＬＡＤＤＲ）、メモリが、ＰＡＵ＿ＣＴＲＬ．ＲＭＮＰビットによって定義されたプライバシー状態でマークされる。ＰｒｉｖａｔｅＦａｕｌｔは、プライバシー侵害が検出されると（たとえば、パブリックに設定されたＰ−Ｒｅｑを有するプライベート・メモリへのアクセス）生成される。ＰｒｉｖａｔｅＦａｕｌｔを生成させる要求は、実行されているメモリ・アクセスをもたらさず、同様に、そのようなアクセスは、ＭＰＵコンフィギュレーションに関わらず、ＭｅｍＭａｎａｇｅフォールトの生成をもたらさない。ＰＦＳＲ（Ｐｒｉｖａｔｅ  Ｆａｕｌｔ  Ｓｔａｔｕｓ  Ｒｅｇｉｓｔｅｒ）で報告されるシンドローム情報に加えて、フォールトを生じさせたトランザクションのアドレスを格納するためにＭＭＦＡＲレジスタのプライベート・バージョンが使用される。このフォールトは、プライベート状態のプライバシーを侵害する試みを示すのでＭｅｍＭａｎａｇｅフォールトとは異なり、したがって異なるように処理される必要があり、したがってファームウェア・ベンダはこれらの２つのフォールトに異なる優先順位を割り当てたい場合がある。プロセッサの現在の状態に対応するＭＰＵコンフィギュレーションは、ＰｒｉｖａｔｅＦａｕｌｔを生成しないアクセスの特権確認及びメモリ属性を実行するために使用される（図１０を参照）。
【０１０２】
ＰＡＵ＿ＣＴＲＬ．ＥＮＡＢＬＥフィールドを消去することによって、以下のＰＡＵ行動がもたらされる：
・データ・アクセスのためにＰ−ＡｔｔｒがＰ−Ｒｅｑに設定され、命令フェッチのためにプライベートに設定される。
・命令フェッチの目的で、アドレス空間全体がプライベートであると報告される。これによって、ブート処理の間にプロセッサが不注意にパブリック状態に移行することを防止する。
【０１０３】
ＰＡＵに関連付けられるコンフィギュレーション・レジスタは、プライベート特権状態からのみアクセス可能であり、他の任意の段階からのアクセスはＢｕｓＦａｕｌｔを生成する。
【０１０４】
ＰＡＵ＿ＣＴＲＬ
プライバシー属性ユニット制御レジスタ、アドレス０ｘＥ０００ＥＤＤ０、０×０又はＩＭＰＬＥＭＥＮＴＡＴＩＯＮ  ＤＥＦＩＮＥＤにリセットする（以下のメモを参照）
【０１０５】
【表２】
0006272875.tif 000003
ＥＮＡＢＬＥ（ビット［０］）１に設定される場合、ＰＡＵは使用可能である
ＲＭＮＰ（ビット［１］）非プライベートとしてマークされた領域、このビットが、メモリの領域が領域によってマークされる方法を制御する。
０：領域が、メモリの領域をプライベートとしてマークし、領域のいずれとも一致しないアドレスがパブリックとしてマークされる。
１：領域が、メモリの領域をパブリックとしてマークし、領域のいずれとも一致しないアドレスがプライベートとしてマークされる。
【０１０６】
ＰＡＵ＿ＴＹＰＥ
プライバシー属性ユニット・タイプ・レジスタ、アドレス０ｘＥ０００ＥＤＤ４、読出し専用
【０１０７】
【表３】
0006272875.tif 000004
ＰＲＥＧＩＯＮ（ビット［７：０］）実装されたＰＡＵ領域の数。このフィールドがゼロとして読める（ｒｅａｄｓ−ａｓ−ｚｅｒｏ）場合、プロセッサはＰＡＵを実装しない。
【０１０８】
ＰＡＵ＿ＲＮＲ
プライバシー属性ユニット領域ベースのアドレス・レジスタ、アドレス０ｘＥ０００ＥＤＤ８、ＵＮＫＮＯＷＮにリセットする
【０１０９】
【表４】
0006272875.tif 000005
ＲＥＧＩＯＮ（ビット［７：０］）ＰＡＵ＿ＲＢＡＲ及びＰＡＵ＿ＲＡＳＲレジスタによって現在アクセスされている領域を選択する。
【０１１０】
ＰＡＵ＿ＲＢＡＲ
プライバシー属性ユニット領域ベースのアドレス・レジスタ、アドレス０ｘＥ０００ＥＤＤＣ、ＵＮＫＮＯＷＮにリセットする
【０１１１】
【表５】
0006272875.tif 000006
ＲＥＧＩＯＮ（ビット［７：０］）どの領域が修正されるべきかを選択する。
ＶＡＬＩＤ（ビット［４］）０に設定される場合、ＲＥＧＩＯＮフィールドが無視されて、どの領域が修正されるべきかを定義するためにＰＡＵ＿ＲＮＲレジスタにおける値が使用される。
ＢＡＤＤＲ（ビット［３１：５］）領域のベース・アドレスのビット３１：５、注：ベース・アドレスのビット［４：０］は、０×０として定義される。
【０１１２】
ＰＡＵ＿ＲＬＡＲ
プライバシー属性ユニット領域のリミット・アドレス・レジスタ、アドレス０ｘＥ０００ＥＤＥ０、ＵＮＫＮＯＷＮにリセットする
【０１１３】
【表６】
0006272875.tif 000007
ＲＥＧＩＯＮ（ビット［７：０］）どの領域が修正されるべきかを選択する
ＶＡＬＩＤ（ビット［４］）０に設定される場合、ＲＥＧＩＯＮフィールドが無視されて、どの領域が修正されるべきかを定義するためにＰＡＵ＿ＲＮＲレジスタにおける値が使用される。
ＬＡＤＤＲ（ビット［３１：５］）領域のリミット・アドレスのビット３１：５、注：ベース・アドレスのビット［４：０］は、０×０として定義される。
【０１１４】
ＰＡＵ＿ＲＡＲ
プライバシー属性ユニット領域の属性レジスタ、アドレス０ｘＥ０００ＥＤＥ４、ＵＮＫＮＯＷＮにリセットする
【０１１５】
【表７】
0006272875.tif 000008
ＲＥＧＩＯＮ（ビット［７：０］）どの領域が修正されるべきかを選択する
ＶＡＬＩＤ（ビット［４］）０に設定される場合、ＲＥＧＩＯＮフィールドが無視されて、どの領域が修正されるべきかを定義するためにＰＡＵ＿ＲＮＲレジスタにおける値が使用される。
ＮＰＣ（ビット［３１］）非プライベート呼出し可能。ＮＰＣが１に設定されると、領域は他のプライバシー状態から呼出し可能とマークされる。ＮＰＣが１に設定された領域をターゲットとしないプライバシー状態に移行を生じさせる任意の分岐は、生じているフォールトをもたらす。これによって、ＰＧガード命令にさらなるレベルの保護を提供し、リテラル・プールに存在しているガード命令操作コードに関連付けられるリスクを排除するために使用され得る。必要なＰＡＵ領域の数を減らすために、プライベート・コードへのすべてのエントリ・ポイントを単一の領域内にグループ化することが好都合である。この領域内のコードは、実行専用としてコンパイルすることができるので、どのようなリテラル・プールも含まない。
【０１１６】
ＣＰＵ生成されたトランザクション
データ
データ・アクセスは、以下のように設定されたＰ−Ａｔｔｒで生成される：
・Ｐ−Ｒｅｑがパブリックに設定される場合（たとえば、プロセッサがパブリック状態である）、Ｐ−Ａｔｔｒもパブリックに設定される。
・ＰＡＵを有するプロセッサの場合−Ｐ−Ｒｅｑがプライベートに設定される場合（たとえば、プロセッサがプライベート状態である）、また、アドレスがＰＡＵ内の領域のうちの１つに一致する場合、Ｐ−ＡｔｔｒはＰＡＵ＿ＣＴＲＬ．ＲＭＮＰに設定され、アドレスがＰＡＵ領域に一致しない場合、Ｐ−Ａｔｔｒは逆プライバシー状態のＰＡＵ＿ＣＴＲＬ．ＲＭＮＰに設定される。
これによって、ＰＡＵを有するより容易な統合Ｍ−ｐｒｏｆｉｌｅコアをＴｒｕｓｔＺｏｎｅ対応システムに提供しながら、パブリック・コードが、プライベートとマークされた位置から読み取られる／そこに書き込まれることを防止する。
【０１１７】
命令フェッチ
命令フェッチ行動は、プロセッサがＰＡＵを含むかどうかに依存する：
・ＰＡＵを含む場合−アドレスがＰＡＵ領域のうちの１つに一致する場合、命令は、ＰＡＵ＿ＣＴＲＬ．ＲＭＮＰに設定されたＰ−Ａｔｔｒとともにフェッチされる。このＰ−Ａｔｔｒ値は、プロセッサのプライバシー状態を決定するためにも使用される。
【０１１８】
注：命令操作コードが保護ドメイン間の境界にまたがる場合、ＰｒｉｖａｔｅＦａｕｌｔが生じる。
【０１１９】
状態移行
命令が実行されるべきプライバシー状態は、命令がフェッチされた位置のプライバシー状況から推測される。結果として、パブリック状態でプライベート・コードを実行すること、又はプライベート状態でパブリック・コードを実行することは不可能である。しかしながら、攻撃（リターン指向プログラミング）を防ぐために、プライバシー状態へのエントリは以下のメカニズムによって厳密に制御される：
・プロセッサの状態にかかわらず、すべての命令フェッチが、メモリ・アクセスによっていかなるプライバシー違反も生成されないように設定されたＰ−Ａｔｔｒで実行される。
・命令がフェッチされた位置のプライバシー状態が、ＰＣがパブリック・コードに移動したことを示す場合、以下の動作のうちの１つが発生する。
○分岐がドメイン・クロッシングとしてマークされる場合、コアがパブリック状態に移行する。
○そのようにマークされない場合、ＰｒｉｖａｔｅＦａｕｌｔが生じる。この状況は、プライベート・コードがクラッシュすると発生する場合があり、フォールトの発生によってあらゆるプライベート・レジスタがパブリック・ドメインにさらされることを防止することができる。
・プライベート状態への移行は、ＰＧガード命令の存在によって有効なエントリ・ポイントとしてマークされたプライベート・メモリ位置に分岐することによって行われる。パブリック・メモリ内のＰＧへの分岐は、プライベート状態への移行を生じさせない。
【０１２０】
ガード命令は、パブリック・コードが、プライベート・コード・ベース内の任意の位置にジャンプすることを防止する。このガード命令の存在は以下の擬似コードによって確認され、これは各命令の実行の前に実行されるべきである。詳細は以下のセクションで説明する：
／／ＰｒｉｖａｔｅＥｎｔｒｙＰｏｉｎｔＣｈｅｃｋ（）  
／／＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
ＰｒｉｖａｔｅＥｎｔｒｙＰｏｉｎｔＣｈｅｃｋ（）  
ｉｎｓｔＳｔａｔｅ＝ＩｎｓｔＭｅｍＳｔａｔｅ（）；
ＣｕｒｒｅｎｔＳｔａｔｅ！＝ｉｎｓｔＰｒｉｖａｔｅの場合、
／／例外、リニア・コード・フロー、又は分岐のいずれかによってプライベート・コードに移行している場合、新しい命令が有効なエントリ・ポイント（すなわち、ＰＧ）か確認する。
ＩｎｓｔＳｔａｔｅ＝＝ＰｒｉｖａｃｙＳｔａｔｅ＿Ｐｒｉｖａｔｅ＆＆ＯｐＣｏｄｅ！＝０ｘＥ９７ＦＥ９７Ｆの場合、
ＥｘｃｅｐｔｉｏｎＥｎｔｒｙ（ＰｒｉｖａｔｅＦａｕｌｔ  ＴＲＵＥ）；
ｒｅｔｕｒｎ；
／／パブリック状態に移行した場合、プライベート状態からの制御されない出口がある。したがってフォールトが生じる。
ｉｎｓｔＳｔａｔｅ＝＝ＰｒｉｖａｃｙＳｔａｔｅ＿Ｐｕｂｌｉｃの場合、
ＥｘｃｅｐｔｉｏｎＥｎｔｒｙ（ＰｒｉｖａｔｅＦａｕｌｔ  ＴＲＵＥ）；
ｒｅｔｕｒｎ；
【０１２１】
この手法は、ドメイン間の高速／効率的な呼出しを可能にし、プライベート・コードへの任意の数のエントリ・ポイントを許可する。概念的な資産保護は、特権状態／特権状態の間に既に存在するものと類似する、プライベート状態／パブリック状態間の特徴を提供し、以下の違いがある（詳細は後続のセクションで概要を述べる）：
・エントリは、ＳＶＣ例外ではなく、ＰＧ命令によってゲートされる。
○実行優先順位に変更なし−割込み優先計画に織り込まれる必要はない
○単一のエントリ・ポイントに限定されない−ルーティング／プロキシ・オーバーヘッドがない
○引数はレジスタを介して渡すことができる（ＳＶＣ命令とＳＶＣ例外ハンドラとの間に発生する例外の可能性のために、ＳＶＣでは不可能である）
○必要に応じて（たとえば、５以上の引数がある場合）、複数の条件付きＭＲＳ命令がスタック・ポインタを取得せずに、スタックを介して引数を渡すことを迅速に行うことができる
・各エントリ・ポイントは、パブリック状態とプライベート状態の両方から呼び出すことができる。
【０１２２】
この手法は、プライベート外部ＡＰＩ関数のいくつかの特別な処理を必要とするが、プライベート・ドメイン内のコードの大部分、及びパブリック・ドメイン内のすべてのコードはどのような修正も必要としない。後方互換性の増加に加えて、これによって、まだ更新されていないレガシー・ライブラリ、又はコンパイラも、パブリック・コード・ベースの全体のために使用されるこれらの拡張（たとえば、ＧＣＣ）をサポートすることが可能になる。特別な処理を必要とするプライベート境界関数が、単純なアセンブリ・ラッパー関数（潜在的に、いくつかのスクリプトで自動的に生成し得る）として実装され得ることは、注目に値する。これによって、特別なコンパイラ・サポートなしに資産保護拡張を使用できるようになる。
【０１２３】
ターゲット状態ビット
いくつかの状況では、プロセッサが、新しいドメインから第１の命令をフェッチする前に、どの状態に移行するかを知っている場合、アーキテクチャを単純化する。ＡＲＭｖ７−Ｍアーキテクチャは、ＡＲＭ命令セットを含まず（また、将来それを必要とする可能性は極めて低く）、したがって、分岐ターゲット・アドレスのそのようなビット・ゼロ（ＡＲＭｖ７−ＡＲアーキテクチャにおいてＡＲＭ／Ｔｈｕｍｂ相互作用ビットとして使用される）は現在使用されない。資産保護拡張は、プライベート状態における分岐のターゲット状態を信号で通知するために、このビットを以下のように再使用する：
・ターゲット・アドレス［０］＝１、分岐のターゲット状態はプライベートである。Ｔｈｕｍｂ命令セットを指定するために、以前に使用されている。
・ターゲット・アドレス［０］＝０、分岐のターゲット状態はパブリックである。ＡＲＭ命令セットを指定するために、以前に予約されている。
【０１２４】
プロセッサはプライベート状態を起動し、またＴｈｕｍｂ命令セットだけがサポートされるので、アーキテクチャは、ＬＳＢが１に設定されたアドレスに分岐するレガシー・コードと下位互換性がある。パブリック状態で実行する場合、ｔａｒｇｅｔ＿ａｄｄｒ［０］を０に設定した位置への分岐はＩＮＶＳＴＡＴＥ  ＵｓａｇｅＦａｕｌｔを発生させ、ｔａｒｇｅｔ＿ａｄｄｒ［０］＝１である分岐は通常の分岐として行動し、プライベート状態への移行を生じさせず、この手法は以下の利点を有する。
・パブリック・コードがこのビットを潜在的な攻撃ベクタとして利用する（ｕｓｅ  ｌｅｖｅｒａｇｅ）ことを防止する。
・ＬＳＢが１に設定されたアドレスに分岐する、レガシー・ライブラリ、又はレガシー・ツールでコンパイルされたコードの既存の行動を保存する。
要約すると、パブリック・コードを呼び出すプライベート関数だけが、呼出しアドレスのＬＳＢを０に設定する必要がある。
【０１２５】
プライベート・コードへの関数呼出し
何らかの分岐（又は、リニア・コード・フロー）がパブリック・コードからプライベート・コードへの移行を生じさせる場合、プライベート・コードの第１の命令はＰＧ命令でなければならない。
【０１２６】
図７は、ドメイン移行が発生している場所を強調しているプライベート関数を呼び出しているパブリック・コードの単純な実例を示している。ＰＧ命令が実行されるまでプロセッサはパブリック状態のままなので、レジスタ状態（ＬＲを含む）は信用できないものと扱われ、したがって、ＢＬとＰＧとの間にパブリック割込みが発生した場合は保護する必要はない。別の主な特徴は、ＢＸＮＰ  ＬＲ命令の後に、プロセッサがパブリック状態に戻ることである。これによって、次の命令がパブリック・ドメインにない場合に、又は別のＰＧ命令がプライベート・ドメイン内にある場合に、例外を生成させることによって、リターン攻撃を防止する。ＢＸＮＰ  ｌｒ命令は、ＬＲレジスタのＬＳＢを調べることによって、事前にターゲットのプライバシー状態を決定することができる。ＰＧ命令はリターン・アドレスを自動的にサニタイズするので、この時点でＬＲレジスタのＬＳＢを信用することができる。
【０１２７】
さらなる命令
ＰＧ
プライベート・ゲートウェイ。このガード命令は、アドレスが、非プライベート・コードからの分岐にとって有効な分岐ターゲットであることを示すために使用される。注：この命令は、ＬＤＲＤ（リテラル）のＴｌ符号化におけるＵＮＰＲＥＤＩＣＴＡＢＬＥ空間にフィットする。ＡＲＭ  ＡＲＭｖ７−Ｍ  ｉｓｓｕｅ  Ｄ  ｓｅｃｔｉｏｎ  Ａ７．７．５０を参照されたい。この符号化は、上位及び下位の１６ビットの語が同じ値を有し、ちょうど上部１６ビットが命令を現在のＩＳＡにおけるＵＮＰＲＥＤＩＣＴＡＢＬＥとしてマークするので、意図的に選ばれる。これは、たとえ３２ビット命令の中間で分岐が実行されても、このビット・パターンが通常コード内で見つかる可能性を極めて低くする。
【０１２８】
符号化Ｔ１  資産保護拡張
ＰＧ
【０１２９】
【表８】
0006272875.tif 000009
ＩｎＩＴＢｌｏｃｋ（）の場合、ＵＮＰＲＥＤＩＣＴＡＢＬＥ；
ｉｎｓｔＳｔａｔｅ  ＝  ＩｎｓｔＭｅｍＳｔａｔｅ（）；
ＬＲ＝ＣｕｒｒｅｎｔＳｔａｔｅ＝＝ＰｒｉｖａｃｙＳｔａｔｅ＿Ｐｒｉｖａｔｅの場合、ＬＲ＜３１：１＞：‘１’
そうではない場合、ＬＲ＜３１：１＞：‘０’；
ＣｕｒｒｅｎｔＳｔａｔｅ＝ｉｎｓｔＳｔａｔｅ；
【０１３０】
この命令の唯一の副作用は、命令がフェッチされた位置と一致するために、ＬＲ［０］を修正すること、及びプロセッサのプライバシー状態を更新することである。したがって、この命令はパブリック状態から実行可能であると定義される。
【０１３１】
例外
ベクトル・テーブル
資産保護拡張は、新しいＶＴＯＲＰレジスタによって指摘された、現在のＶＴＯＲレジスタと同様のセマンティックを有し、既存のＶＴＯＲレジスタと同じアドレス（プライベート状態からＶＴＯＲＰにアクセスする）でバンクされる、第２のベクトル・テーブルを追加する。プライベート状態をターゲットとするあらゆる例外は、ベクトル・テーブルのベース・アドレスを決定するために、ＶＴＯＲではなくＶＴＯＲＰレジスタを使用する。プライベート・ベクトル・テーブルを保護するために、ＶＴＯＲＰが、プライベートとしてマークされており、したがってパブリック状態からアクセスすることができないメモリの領域を指摘することが重要である。以下のルールは、例外がターゲットとするのはどの状態かを決定するために使用される：
・例外数＜１６：一般的に、ほとんどの低い数値の例外は、ＣｕｒｒｅｎｔＳｔａｔｅ変数によってとして決定されるように、プロセッサが現在入っている状態をターゲットとする。以下の例は、一般的なルールから逸脱する：
○ＰｒｉｖａｔｅＦａｕｌｔ−常にプライベート状態をターゲットとする
【０１３２】
ＰｒｉｖａｔｅＦａｕｌｔ
例外数が７である、新しいＰｒｉｖａｔｅＦａｕｌｔ例外が定義される。この例外は、実行される様々な安全性確認によってトリガされる（たとえば、パブリック・コードから、有効なエントリ・ポイントとしてマークされていないプライベート・コード内のアドレスにジャンプするときに）。この例外を生成することができるすべてのケースの完全な詳細は、本明細書を通じて擬似コードにおいて見ることができる。
【０１３３】
ＰｒｉｖａｔｅＦａｕｌｔの優先順位は、ＳＨＰＲ１レジスタ内のＰＲＩ＿７フィールドを使用して構成することができる。したがって、このフィールドはパブリック状態からアクセスされるときに、ＲＡＺ／ＷＩと定義される。
【０１３４】
ＰｒｉｖａｔｅＦａｕｌｔは、常にプライベート状態をターゲットとし、したがって、パブリックベクトル・テーブル内の例外数７が予約される。
【０１３５】
ＰＦＳＲ
プライベート・フォールト・ステータス・レジスタ、アドレス０ｘＥ０００ＥＤ８Ｃ、ＵＮＫＮＯＷＮにリセットする、ＡＲＭｖ６−Ｍに存在しないレジスタ
利用制限：
・対応するフォールトを消去するために、レジスタビットに１を書く。
・フォールト・ビットは付加的である；すなわち、複数のフォールトが発生すると、すべての関連ビットが１に設定される。
・プライベート特権状態からのみアクセス可能であり、他の状態からのアクセスはＢｕｓＦａｕｌｔを生成する。
【０１３６】
【表９】
0006272875.tif 000010
ＩＮＶＥＰ（ビット［０］）無効なエントリ・ポイント。パブリック状態からの関数呼出し又は例外が、プライベート状態における非ＰＧ命令をターゲットとする場合、このビットが設定される。
ＩＮＶＭＳ（ビット［１］）無効なマジック・シグネチャ。アンスタッキング操作中に、例外スタック・フレーム内のマジック・シグネチャが無効であることが分かった場合、このビットが設定される。
ＩＮＶＥＲ（ビット［２］）無効な例外リターン。パブリック状態の例外から戻るときにＥＸＣ＿ＲＥＴＵＲＮ．ＳＣＲＳが０であったことを示す。
ＰＡＵＶＩＯＬ（ビット［３］）ＰＡＵ違反。パブリックに設定されたトランザクションのためにＰ−Ｒｅｑでプライベートとしてマークされたアドレス空間の一部にアクセスする試みが行われたことを示す。
ＩＮＶＡＬＩＧＮ（ビット［４］）無効な整列。この例外は、命令がプライベート・ドメイン境界に整列していない場合に発生する。すなわち、命令は境界を横切る。
ＩＮＶＴＲＡＮ（ビット［５］）無効な移行。この例外は、ドメイン・クロッシングとしてフラグ付けされていない分岐が、プライベート・メモリからパブリック・メモリに移行を生じさせるときに発生する。
【０１３７】
Ｍｉｓｃ  ＰｓｅＵｄｏ  ｃｏｄｅ
ＩｎｓｔＭｅｍＳｔａｔｅ（）
この擬似コード関数は、現在の命令がフェッチされたメモリのＰｒｉｖａｃｙＳｔａｔｅに戻る。
【０１３８】
本発明の様々なさらなる態様及び特徴は、添付の特許請求の範囲において定義される。説明される前に、本発明の範囲から逸脱することなしに、本明細書の実施例に様々な修正が行われてよい。
【図１】
0006272875.tif 000011
【図２】
0006272875.tif 000012
【図３】
0006272875.tif 000013
【図４】
0006272875.tif 000014
【図５】
0006272875.tif 000015
【図６】
0006272875.tif 000016
【図７】
0006272875.tif 000017
【図８】
0006272875.tif 000018
【図９】
0006272875.tif 000019
【図１０】
0006272875.tif 000020