(57)【要約】  有界ポインタの使用を制御する装置及び方法が提供される。装置は複数の有界ポインタ記憶素子を有し、各有界ポインタ記憶素子は、有界ポインタと、有界ポインタの使用が許容されていることを示す関連許可属性とを格納するのに用いられる。本技術によれば、関連許可属性は、有界ポインタがコピー操作を受けることを許容されているか否かを示すコピー許可属性を含む。そして、処理回路は、コピー操作を指定する少なくとも１つの命令に応答して、ソース有界ポインタ記憶素子のソース有界ポインタ及び関連許可属性から、ディスティネーション有界ポインタ記憶素子に格納されるディスティネーション有界ポインタ及び関連許可属性を生成する。また、処理回路は、ソース有界ポインタのコピー許可属性が、ソース有界ポインタがコピー操作を受けないようになっていることを示しているか否かに応じて、ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークする。これによって、装置上でソフトウェアを実行する際に制御フローの整合性の妨害を抑制する、効果的な機構が提供される。
2018538610.tif 000002
【特許請求の範囲】
【請求項１】
複数の有界ポインタ記憶素子であって、各有界ポインタ記憶素子が、有界ポインタと、前記有界ポインタの使用が許容されていることを示す関連許可属性とを格納し、前記関連許可属性が、前記有界ポインタがコピー操作を受けることを許容されているか否かを示すコピー許可属性を備える、複数の有界ポインタ記憶素子と、
前記コピー操作を指定する少なくとも１つの命令に応答して、ソース有界ポインタ記憶素子のソース有界ポインタ及び関連許可属性から、ディスティネーション有界ポインタ記憶素子に格納されるディスティネーション有界ポインタ及び関連許可属性を生成し、前記ソース有界ポインタの前記コピー許可属性が、前記ソース有界ポインタが前記コピー操作を受けないようになっていることを示しているか否かに応じて、前記ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークする処理回路とを備える装置。
【請求項２】
各有界ポインタ記憶素子が、それに関連付けられた、前記有界ポインタ記憶素子が有効有界ポインタを格納しているか否かを示す有効性フィールドを有し、
前記処理回路が、前記ソース有界ポインタ記憶素子と関連付けられた前記有効性フィールドを更新して前記ソース有界ポインタが無効であると指定することによって、前記ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークするように構成される、請求項１に記載の装置。
【請求項３】
前記有効性フィールドが、前記関連有界ポインタ記憶素子の内容のデータタイプを識別するタグフィールドであって、前記タグフィールドが第１の値を有する場合、前記内容は、有界ポインタ及び関連許可属性を形成し、前記タグ値が前記第１の値以外の値を有する場合、前記内容は、有界ポインタ及び関連許可属性以外のデータとして扱われる、請求項２に記載の装置。
【請求項４】
前記処理回路が、前記コピー操作を指定する前記少なくとも１つの命令を実行する際、前記ソース有界ポインタの前記コピー許可属性が、前記ソース有界ポインタが前記コピー操作を受けないようになっていることを示している場合に、前記ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークするように構成される、請求項１〜３のいずれか一項に記載の装置。
【請求項５】
前記関連許可属性が、前記有界ポインタが複数のスレッド間で共有されているか否かを示す共有属性を備え、
前記処理回路が、前記コピー操作を指定する前記少なくとも１つの命令を実行する際、前記ソース有界ポインタの前記コピー許可属性が、前記ソース有界ポインタが前記コピー操作を受けないようになっていることを示しており、且つ前記共有属性が、前記有界ポインタが複数のスレッド間で共有されていないことを示している場合に、前記ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークするように構成される、請求項１〜３のいずれか一項に記載の装置。
【請求項６】
前記ソース有界ポインタがポインタ値と関連範囲情報とを備え、前記コピー操作の間、前記ポインタ値の変更が禁じられる、請求項１〜５のいずれか一項に記載の装置。
【請求項７】
前記ソース有界ポインタが、機能ポインタを判断するのに用いられる、請求項６に記載の装置。
【請求項８】
前記コピー操作によって、前記ディスティネーション有界ポインタ及び前記関連許可属性が、前記ソース有界ポインタ及び前記関連許可属性の複製となる、請求項１〜７のいずれか一項に記載の装置。
【請求項９】
前記コピー操作によって、前記ディスティネーション有界ポインタ及び前記関連許可属性の少なくとも１つが、前記ソース有界ポインタ及び前記関連許可属性の変更版となる、請求項１〜７のいずれか一項に記載の装置。
【請求項１０】
前記コピー操作の間、前記有界ポインタの境界線の延長が禁じられる、請求項９に記載の装置。
【請求項１１】
前記コピー操作の間、前記有界ポインタの許容された使用を増加させようとする前記関連許可属性の変更が禁じられる、請求項９又は１０に記載の装置。
【請求項１２】
前記ソース有界ポインタ記憶素子及び前記ディスティネーション有界ポインタ記憶素子の少なくとも１つが有界ポインタレジスタである、請求項１〜１１のいずれか一項に記載の装置。
【請求項１３】
前記ソース有界ポインタ記憶素子及び前記ディスティネーション有界ポインタ記憶素子の少なくとも１つがメモリロケーションである、請求項１〜１２のいずれか一項に記載の装置。
【請求項１４】
前記少なくとも１つの命令が、第２命令の「非コピー」バリアントである第１命令を備え、前記ソース有界ポインタの前記コピー許可属性が、前記ソース有界ポインタが前記コピー操作を受けないようになっていることを示している場合、前記処理回路が前記第２命令の実行に応答して、前記ソース有界ポインタのコピーが作成されないように所定の動作を実施する、請求項１〜１３のいずれか一項に記載の装置。
【請求項１５】
前記所定の動作が前記第２命令の実行を中断することを含む、請求項１４に記載の装置。
【請求項１６】
前記所定の動作が、前記ディスティネーション有界ポインタ記憶素子を、無効有界ポインタを格納するものとしてマークすることを含む、請求項１４に記載の装置。
【請求項１７】
前記少なくとも１つの命令が分岐命令を備え、プログラムカウンタ有界ポインタ記憶素子内に新たなプログラムカウンタ値として記憶するためのターゲットアドレスを生成するのに前記ソース有界ポインタが用いられる、請求項１〜１６のいずれか一項に記載の装置。
【請求項１８】
前記分岐命令がリンク付き分岐命令であり、前記リンク付き分岐命令の実行の間、前記処理回路が、前記プログラムカウンタ有界ポインタ記憶素子の現在の内容をリンクレジスタ有界ポインタ記憶素子内に格納して戻りアドレス有界ポインタを識別するように、且つ、前記リンクレジスタ有界ポインタ記憶素子内の前記コピー許可属性を、前記戻りアドレス有界ポインタが前記コピー操作を受けないようになっていることを示すように設定するように構成される、請求項１７に記載の装置。
【請求項１９】
各有界ポインタ記憶素子が、前記有界ポインタを格納する第１副素子と前記関連許可属性を格納する第２副素子とを備える、請求項１〜１８のいずれか一項に記載の装置。
【請求項２０】
各有界ポインタ記憶素子が、有界ポインタと、前記有界ポインタの使用が許容されていることを示す関連許可属性とを格納する、複数の有界ポインタ記憶素子を有する装置内で、有界ポインタの使用を制御する方法であって、
前記関連許可属性内に、前記有界ポインタがコピー操作を受けることを許容されているか否かを示すコピー許可属性を提供することと、
前記コピー操作を指定する少なくとも１つの命令に応答して、ソース有界ポインタ記憶素子のソース有界ポインタ及び関連許可属性から、ディスティネーション有界ポインタ記憶素子に格納されるディスティネーション有界ポインタ及び関連許可属性を生成し、前記ソース有界ポインタの前記コピー許可属性が、前記ソース有界ポインタが前記コピー操作を受けないようになっていることを示しているか否かに応じて、前記ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークすることとを含む方法。
【請求項２１】
複数の有界ポインタ記憶素子手段であって、各有界ポインタ記憶素子手段が、有界ポインタと、前記有界ポインタの使用が許容されていることを示す関連許可属性とを格納し、前記関連許可属性が、前記有界ポインタがコピー操作を受けることを許容されているか否かを示すコピー許可属性を備える、複数の有界ポインタ記憶素子手段と、
前記コピー操作を指定する少なくとも１つの命令に応答して、ソース有界ポインタ記憶素子手段のソース有界ポインタ及び関連許可属性から、ディスティネーション有界ポインタ記憶素子手段に格納されるディスティネーション有界ポインタ及び関連許可属性を生成し、前記ソース有界ポインタの前記コピー許可属性が、前記ソース有界ポインタが前記コピー操作を受けないようになっていることを示しているか否かに応じて、前記ソース有界ポインタ記憶素子手段を、無効有界ポインタを格納しているものとしてマークする処理手段とを備える装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術はデータ処理の分野に関する。
【背景技術】
【０００２】
幾つかのデータ処理装置では、特定のアドレスを示すポインタを、そのポインタに対するアドレスの許容範囲を示す範囲情報と関連付ける、有界ポインタをサポートできる。例えば、こうしたポインタは「ファットポインタ（ｆａｔ  ｐｏｉｎｔｅｒ）」と称されることもある。
【０００３】
ソフトウェアが直面している問題に、制御フローの整合性（ＣＦＩ）がある。具体的には、例えばレジスタ内に保持されたデータから得られるアドレスへと分岐する能力が濫用されることによって、コンピュータプログラムによる意図した制御フローが妨害されそうになることがある。上記の有界ポインタは、こうしたアドレスを決定する際に用いられることがある。このため、こうした濫用に対するレジリエンスを向上させる機構をもった有界ポインタの提供が望まれるといえよう。
【発明の概要】
【課題を解決するための手段】
【０００４】
構成の一例では、複数の有界ポインタ記憶素子であって、各有界ポインタ記憶素子が、有界ポインタと、有界ポインタの使用が許容されていることを示す関連許可属性とを格納し、関連許可属性が、有界ポインタがコピー操作を受けることを許容されているか否かを示すコピー許可属性を備える、複数の有界ポインタ記憶素子と、コピー操作を指定する少なくとも１つの命令に応答して、ソース有界ポインタ記憶素子のソース有界ポインタ及び関連許可属性から、ディスティネーション有界ポインタ記憶素子に格納されるディスティネーション有界ポインタ及び関連許可属性を生成し、ソース有界ポインタのコピー許可属性が、ソース有界ポインタがコピー操作を受けないようになっていることを示しているか否かに応じて、ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークする処理回路とを備える装置が提供される。
【０００５】
構成の他の例では、各有界ポインタ記憶素子が、有界ポインタと、有界ポインタの使用が許容されていることを示す関連許可属性とを格納する、複数の有界ポインタ記憶素子を有する装置内で、有界ポインタの使用を制御する方法であって、関連許可属性内に、有界ポインタがコピー操作を受けることを許容されているか否かを示すコピー許可属性を提供することと、コピー操作を指定する少なくとも１つの命令に応答して、ソース有界ポインタ記憶素子のソース有界ポインタ及び関連許可属性から、ディスティネーション有界ポインタ記憶素子に格納されるディスティネーション有界ポインタ及び関連許可属性を生成し、ソース有界ポインタのコピー許可属性が、ソース有界ポインタがコピー操作を受けないようになっていることを示しているか否かに応じて、ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークすることとを含む方法が提供される。
【０００６】
構成の更に他の例では、複数の有界ポインタ記憶素子手段であって、各有界ポインタ記憶素子手段が、有界ポインタと、有界ポインタの使用が許容されていることを示す関連許可属性とを格納し、関連許可属性が、有界ポインタがコピー操作を受けることを許容されているか否かを示すコピー許可属性を備える、複数の有界ポインタ記憶素子手段と、コピー操作を指定する少なくとも１つの命令に応答して、ソース有界ポインタ記憶素子手段のソース有界ポインタ及び関連許可属性から、ディスティネーション有界ポインタ記憶素子手段に格納されるディスティネーション有界ポインタ及び関連許可属性を生成し、ソース有界ポインタのコピー許可属性が、ソース有界ポインタがコピー操作を受けないようになっていることを示しているか否かに応じて、ソース有界ポインタ記憶素子手段を、無効有界ポインタを格納しているものとしてマークする処理手段とを備える装置が提供される。
【０００７】
本技術は、例として、添付の図面に示すその実施例を参照しながら詳細に説明される。
【図面の簡単な説明】
【０００８】
【図１】一実施例に係る装置のブロック図である。
【図２】関連範囲情報が示す範囲の外のアドレスを指定するのにポインタ値が用いられ、一組の有界ポインタ記憶素子内でそのポインタ値を設定されそう、又はそれにアクセスされそうな場合にエラーをトリガーする命令の種類の例を示す。
【図３】一実施例に係る、有界ポインタと関連付けられたタグビットの使用を示す。
【図４】一実施例に従って提供されるコピー可能属性を含む、有界ポインタと関連付けられて提供できる所定の許可属性を示す表である。
【図５】メモリがどのようにローカルメモリ及びグローバルメモリへと区分けできるかを示す。
【図６】非信用プロセスが有界ポインタのコピーを作成する能力を有する場合に生じうる制御フローの整合性の問題を示す。
【図７】一実施例に係る、ストアケイパビリティ命令の実行を示すフロー図である。
【図８】一実施例に係る、ロードケイパビリティ命令の実行を示すフロー図である。
【図９】一実施例に係る、ムーブケイパビリティ命令の実行を示すフロー図である。
【図１０】一実施例に係る、ケイパビリティ命令の「非コピー」バリアントをどのように利用できるかを示すフロー図である。
【図１１】一実施例に係る、分岐命令をどのように処理できるかを示すフロー図である。
【発明を実施するための形態】
【０００９】
添付の図面を参照しながら実施例について述べる前に、以下に実施例の説明を提供する。
【００１０】
幾つかの処理装置では、有界ポインタの使用をサポートできる。ポインタ自体は、例えば、アクセスされるデータ値のアドレス又は実行される命令を指し示すか、それらを決定するのに使用できる。しかしながら、このポインタは、ポインタの使用時にアドレスの許容範囲を示す関連範囲情報も有することができる。これは、例えば、ポインタによって決定されたアドレスが所定の境界内に留まり、挙動のセキュリティ又は機能正確性を確保するのに有用となりうる。例えば、所定のケイパビリティが既定のプロセス用に定義されるケイパビリティベースアーキテクチャへの関心が高まってきており、定義されたケイパビリティの外で操作が実行されそうになるとエラーをトリガーできる。有界ポインタ用の範囲情報は、こうしたアーキテクチャ用に定義されたケイパビリティ情報の一部であってもよく、ケイパビリティベースアーキテクチャ内では、（その関連ケイパビリティ情報を含む）こうした有界ポインタをケイパビリティと称してもよい。或いは、有界ポインタを定義できるようにする幾つかの非ケイパビリティベースアーキテクチャが存在してもよい。
【００１１】
従って、装置は、ポインタの使用時にアドレスの許容範囲を示す関連範囲情報を有するポインタを格納するのに用いられる、有界ポインタ記憶素子を有してもよい。各有界ポインタ記憶素子は、レジスタ、又は、例えばスタックメモリ上のロケーションである、汎用メモリ内のメモリロケーションであってもよい。
【００１２】
命令の動作中に必要なメモリ内のアドレスを得るのに用いられるポインタを取得するために、所定の命令を用いて、こうした有界ポインタ記憶素子を参照することができる。ポインタは、直接的な使用でメモリアドレスを識別してもよいし、例えばポインタ値にオフセットを追加してメモリアドレスを得るように使用されてもよい。
【００１３】
上述のＣＦＩの問題を考慮する場合、上記のケイパビリティベースアーキテクチャ内で使用されるような有界ポインタの所定の特性によって、ＣＦＩの問題をある程度軽減できる。例えば、関連範囲情報は、有界ポインタ記憶素子に格納されたポインタからターゲットアドレスを得る際に分岐命令によってターゲットとされうるアドレスの範囲を制限することができる。ケイパビリティベースアーキテクチャでは、関連範囲情報は、分岐ターゲットアドレスを得るケイパビリティとして一般データが使用されるのを防止する機構を提供するものとしても知られており、更に、所定のケイパビリティを確保できるロケーションも限定できる。しかしながら、こうした制限の中でも、例えば予期せぬプログラムアドレスへの制御移行を可能にすることで、コンピュータプログラムによる意図した制御フローが妨害されるような形で、不正なプロセスによって有界ポインタが操作されることが未だ有り得る。
【００１４】
従って、本明細書に記載の技術は、生じうるこうした濫用に対するレジリエンスを更に向上させて、ＣＦＩを向上させることを目的とする。
【００１５】
発明者らは、後から再利用できる形で有界ポインタのコピーを作成することが、ＣＦＩが妨害されそうになりうる一手法であることに気付いた。これによって、例えば、戻りアドレスといったターゲットアドレスを演算するのに有界ポインタが使用可能になるという、ＣＦＩの問題が生じる。
【００１６】
有界ポインタには、有界ポインタの許容された使用法を示すように、関連許可属性が設けられてもよい。例えば、許可属性は、有界ポインタが参照するのを許容されている動作の種類を識別してもよく、つまり、例えば、ロード又はストアを行うデータを識別したり、フェッチされる命令を識別したりするのにポインタを使用できるか否かを識別してもよい。本明細書に記載の技術によれば、こうした許可属性は、関連有界ポインタがコピー操作を受けることを許容されているか否かを示すのに使用できる値を有したコピー許可属性が追加されることで補完される。そして、処理回路がこうしたコピー操作を処理する際にコピー許可属性を参照でき、コピー許可属性の値に応じて、有界ポインタのコピーを防止するステップが作成される。
【００１７】
より具体的には、一実施例では、処理回路は、コピー操作を指定する少なくとも１つの命令に応答して、ソース有界ポインタ記憶素子のソース有界ポインタ及び関連許可属性から、ディスティネーション有界ポインタ記憶素子に格納されるディスティネーション有界ポインタ及び関連許可属性を生成する。このプロセスの結果、ソース有界ポインタ記憶素子の内容が引き続きアクセス可能な場合は、大元のソース有界ポインタのコピーが作成されたということが理解されよう。しかしながら一実施例によれば、処理回路は、更に、ソース有界ポインタのコピー許可属性が、ソース有界ポインタがコピー操作を受けないようになっていることを示しているか否かに応じて、ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークするように構成される。
【００１８】
この結果、コピー操作のデフォルト挙動をコピー許可属性の値に応じて変更できるようにすることで、事実上、プロセスの一環として、コピープロセスを、ソース有界ポインタが無効化されるムーブプロセスへと選択的に変換できることが理解されよう。
【００１９】
所定の有界ポインタと関連付けられたコピー許可属性を提供することで、特定の所望の有界ポインタに対する上記の機能を制限することが可能になる。このため、一実施例では、コピーに対して生じる上記の制限を、例えば、ターゲットアドレスの生成に使用される有界ポインタといった、ＣＦＩを妨害しようとする濫用の対象になりうるものとして考えられる所定の有界ポインタに限定することができる。こうした手法によって、ＣＦＩを妨害する不正プロセスの能力を著しく低減できることが明らかとなっている。
【００２０】
ソース有界ポインタ記憶素子を無効としてマークする方法は複数ある。一実施例では、各有界ポインタ記憶素子は、それに関連付けられた、有界ポインタ記憶素子が有効有界ポインタを格納しているか否かを示す有効性フィールドを有し、処理回路は、ソース有界ポインタ記憶素子と関連付けられた有効性フィールドを更新してソース有界ポインタが無効であると指定することによって、ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークするように構成される。
【００２１】
一実施例では、有効性フィールドの機能を実施するのに既存のフィールドが使用されてもよい。具体的には、例えば、所定のケイパビリティベースアーキテクチャにおいて、各有界ポインタ記憶素子と関連付けられたタグフィールドを提供して、そこに格納された内容のデータタイプを識別することが知られている。つまり、データタイプは、記憶素子が実際に有界ポインタ（すなわちケイパビリティ）を格納しているか否か、又は代わりに、例えばケイパビリティとしては使用できない一般データ等の或る他の種類の内容を格納しているか否かを識別するのに使用できる。従って、こうしたタグフィールドを有効性フィールドとして使用する場合、タグフィールドを第１の値に設定して、有界ポインタ記憶素子の内容が有界ポインタ及び関連許可属性を形成することを識別してもよいし、タグフィールドを第１の値以外の値に設定することで、内容を有界ポインタ及び関連許可属性以外のデータとして扱うべきであることを識別するようにできる。
【００２２】
従って、コピー許可属性が、ソース有界ポインタがコピー操作を受けないようにすべきと示している状況で、ソース有界ポインタ記憶素子を上記のコピー操作のために使用する場合は、タグ値を、内容が有界ポインタ及び関連許可属性でないことを示す値に効率的に設定することで、ソース有界ポインタ記憶素子を無効としてマークできる。これによって、ソース有界ポインタ記憶素子の内容が、その後有界ポインタ（すなわちケイパビリティ）として使用されないようになるため、確実に、有界ポインタの単一コピーのみが保持される（すなわちディスティネーション有界ポインタ記憶素子内のもの）。
【００２３】
コピー操作の実行中にソース有界ポインタ記憶素子を無効化するか否かを決定するようにコピー許可属性の値を検討できる方法は複数ある。一実施例では、ソース有界ポインタ記憶素子は、ソース有界ポインタのコピー許可属性が、ソース有界ポインタがコピー操作を受けないようになっていることを示している状況で、コピー操作の実行中に無効有界ポインタ記憶素子を格納しているものとして常にマークされる。
【００２４】
多くの実施では、メモリは、複数のプログラムスレッド間で共有できるグローバルメモリ（例えばヒープ）及び、例えばスタック内のスタックフレームといった、個別のプログラムスレッドの使用のために提供されるローカルメモリを形成するように区分けされてもよい。有界ポインタと関連付けられた許可属性は、有界ポインタがグローバルな効果を有するか否か、又はそれが特定のプログラムスレッドと関連付けられたローカル有界ポインタか否かを識別するのにも使用できる。
【００２５】
上記の使用例の場合、ソース有界ポインタ記憶素子は、グローバル有界ポインタ又はローカル有界ポインタを格納しているか否かに関係なく、無効としてマークされてもよい。有界ポインタがグローバル有界ポインタの場合、ソース有界ポインタ記憶素子がアトミック操作として確実に無効化されるように、所定のアトミック性制御手順の使用が必要となることがある。例えば、ソース有界ポインタ記憶素子がメモリロケーションで、グローバルとしてマークされた有界ポインタを格納している場合、アトミック性に関する特定の考慮を要することがあるため、複数のプログラムスレッドで共有される。アトミック操作を確実なものとするように使用できる既知の技術は複数あり、この状況で任意のこうした技術を使用できることが理解されよう。
【００２６】
しかしながら、所定の無効化操作の処理の必要性から、プロセスに対して或る複雑性がアトミックに加わる。代替の実施例では、コピー許可属性が、ソース有界ポインタがコピー操作を受けないようになっていることを示す状況で、ソース有界ポインタ記憶素子がコピー操作で使用されている場合に、ソース有界ポインタ記憶素子を常に無効としてマークするよりも、代わりに、有界ポインタが複数のスレッド間で共有されているか否かに応じて機能が限定される。具体的には、一実施例では、関連許可属性は、有界ポインタが複数のスレッド間で共有されているか否かを示す共有属性を含み、処理回路は、コピー操作を指定する上記の少なくとも１つの命令を実行する際、ソース有界ポインタのコピー許可属性が、ソース有界ポインタがコピー操作を受けないようになっていることを示しており、且つ共有属性が、有界ポインタが複数のスレッド間で共有されていないことを示している場合に、ソース有界ポインタ記憶素子を、無効有界ポインタを格納しているものとしてマークするように構成される。従って、本実施例では、有界ポインタが複数のスレッド間で共有されていないものとしても示されている場合、すなわち、その有界ポインタが、本明細書ではローカルケイパビリティとしても呼ばれるローカル有界ポインタである場合にのみ無効化が行われる。こうした手法によって、生じうる一切のアトミック性の問題が回避される。また、所定のグローバル有界ポインタのコピーを作成する完全に合理的な理由がある場合でも、ローカル有界ポインタには該当しないことが多いため、ローカル有界ポインタのコピーが作成されそうな場合というのは、生じうるＣＦＩへの攻撃を示すことが多い。このため、実用的観点から見れば、上記の動作を、有界ポインタが複数のスレッド間で共有されていないことを共有属性が示している場合に限定することが、未だＣＦＩ攻撃に対する強力な防御となる。
【００２７】
コピー操作は様々な形態をとることができるが、一実施例では、ディスティネーション有界ポインタ及び関連許可属性が、ソース有界ポインタ及び関連許可属性の複製になり、すなわち、コピープロセスの間に変更が行われなくなる。
【００２８】
しかしながら、代替の実施例では、コピー操作によって、ディスティネーション有界ポインタ及び関連許可属性の少なくとも１つが、ソース有界ポインタ及び関連許可属性の変更版になるようにしてもよい。
【００２９】
一実施例では、ソース有界ポインタは、ポインタ値と関連範囲情報とを含んでもよく、コピー操作の間は、ポインタ値自体の変更を禁じてもよい。しかしながら、コピー操作はある程度の範囲情報の調整を許容してもよいが、一実施例では、コピー操作の間、有界ポインタの境界線の延長が禁じられ、すなわち、範囲の縮小のみができて拡大はできない。同様に、コピー操作の間に関連許可属性の変更が行われる場合、コピー操作は、有界ポインタの許容された使用を増加させようとする変更を一切禁じてもよい。従って、概して、コピー操作の間に生じるこうした全ての変更によって、ソース有界ポインタに関連付けられた使用に対応して更に使用が限定された有界ポインタが生み出されるといえよう。
【００３０】
上述したように、上記のコピー許可属性をどの種類の有界ポインタと関連付けて使用するかを選択することができる。一実施例では、コピー許可属性の使用は、例えば、分岐動作の分岐先のアドレスといったターゲットアドレス、又は分岐動作に続いて戻される戻りアドレス等の機能ポインタを判断するのに用いられるソース有界ポインタと関連付けることができる。
【００３１】
有界ポインタ記憶素子は、レジスタ及び／又はメモリロケーションの形態をとってもよい。一実施例では、ソース有界ポインタ記憶素子及びディスティネーション有界ポインタ記憶素子の少なくとも１つが有界ポインタレジスタである。幾つかの場合では、ソース有界ポインタ記憶素子及びディスティネーション有界ポインタ記憶素子の両方がレジスタから形成されてもよいが、代替の実施例では、ソース有界ポインタ記憶素子及びディスティネーション有界ポインタ記憶素子の少なくとも１つがメモリロケーションであってもよい。実際、アーキテクチャが許容する場合には、ソース有界ポインタ記憶素子及びディスティネーション有界ポインタ記憶素子の両方がメモリロケーションであってもよい。
【００３２】
また、一実施例では、コピー操作を指定し、上述のように、処理回路がソース有界ポインタ記憶素子の選択的な無効化に取り掛かるようにする命令が、標準の既存の命令であってもよい。これは、例えばケイパビリティベースアーキテクチャでは、ケイパビリティ記憶素子を指定する所謂ケイパビリティ命令であってもよい。しかしながら、代替の実施例では、こうした命令の「非コピー（ｎｏ  ｃｏｐｙ）」バリアントが生成されてもよく、上記の機能が、「非コピー」バリアントが実行される状況に制限されてもよい。例えば、一実施例では、上記の手法で、処理回路がソース有界ポインタ記憶素子を選択的に無効化するようにする少なくとも１つの命令が、第２命令の「非コピー」バリアントである第１命令である。こうした実施例では、ソース有界ポインタのコピー許可属性が、ソース有界ポインタがコピー操作を受けないようになっていることを示している場合、処理回路は第２命令の実行に応答してもよく、ソース有界ポインタのコピーが作成されないように所定の動作を実施する。従って、確実にコピーが生じないように第２命令の実行を設定することは未だ可能であるが、実行される動作は、第１命令（すなわち非コピーバリアント）が実行されるときに行われる動作と異なってもよい。
【００３３】
所定の動作は様々な形態をとることができる。例えば、一実施例では、所定の動作は第２命令の実行を中断することを含んでもよい。
【００３４】
代替の実施例では、所定の動作は、上記のソース有界ポインタ記憶素子の無効化と同様の機構を用いて、ディスティネーション有界ポインタ記憶素子を、無効有界ポインタを格納するものとしてマークすることを含んでもよい。これによって、ディスティネーション有界ポインタ記憶素子が無効としてマークされている場合は、実質的に、コピー操作が生じていないものと見なされることが理解されよう。従って、これは、コピーが生じないことを確実なものとするのに未だ有効な機構である。
【００３５】
コピー操作を指定し、処理回路が上記の機構によってソース有界ポインタ記憶素子を選択的に無効化するようにする命令の種類は、様々な形態をとることができる。例えば、有界ポインタをメモリからレジスタへとロードするのに用いられるロード命令の形態、又は有界ポインタをレジスタからメモリへと戻すように格納するのに用いられるストア命令の形態をとってもよい。他の例では、有界ポインタをソースレジスタからディスティネーションレジスタに移動させるムーブ命令の形態をとってもよい。なお、命令がムーブ命令と称されていても、これは、概してムーブ命令自体がソースレジスタからデータを取り除くものではなく、つまり、実際は、上述した本技術の機能がない状態でコピーが作成されるものである。
【００３６】
また、更なる例では、命令は分岐命令を含んでもよく、プログラムカウンタ有界ポインタ記憶素子内に新たなプログラムカウンタ値として記憶するためのターゲットアドレスを生成するのにソース有界ポインタが用いられる。ここでも、上述した本技術は使用せずに、プログラムカウンタ有界ポインタ記憶素子が更新されるが、大元のソース有界ポインタがソース有界ポインタ記憶素子内に未だ存在しており、こうしてコピーが作成される。しかしながら、上記の技術を用いれば、１つのコピーのみ、すなわち、分岐命令の実行後にプログラムカウンタ有界ポインタ記憶素子に格納されたもののみを確実に保持することが可能である。
【００３７】
一実施例では、分岐命令はリンク付き分岐命令であり、リンク付き分岐命令の実行の間、処理回路は、プログラムカウンタ有界ポインタ記憶素子の現在の内容をリンクレジスタ有界ポインタ記憶素子内に格納して戻りアドレス有界ポインタを識別するように、且つ、リンクレジスタ有界ポインタ記憶素子内のコピー許可属性を、戻りアドレス有界ポインタがコピー操作を受けないようになっていることを示すように設定するように構成される。従って、プログラムカウンタ有界ポインタ記憶素子の現在の内容と関連付けられたどのコピー許可属性の値にも関係なく（又はこうしたコピー許可属性がプログラムカウンタ有界ポインタ記憶素子と関連付けられて使用されていない場合にも）、リンクレジスタ有界ポインタ記憶素子に戻りアドレス有界ポインタが入力されている場合に、コピー許可属性が、戻りアドレス有界ポインタがコピー操作を受けないようになっていることを示すように設定されることを確実なものにできる。こうして、例えばリンクレジスタの現在の内容が他のレジスタ又はメモリへとコピーされそうになった場合に、確実に、戻りアドレスのコピーができなくなる。
【００３８】
有界ポインタ記憶素子は様々な方法で構成できる。例えば、有界ポインタ及び関連許可属性は、隣接する情報ブロックとして単一の物理記憶素子に格納されてもよいが、代替の実施例では、有界ポインタ記憶素子が、有界ポインタを格納する第１副素子と関連許可属性を格納する第２副素子とを含んでもよい。また、有界ポインタ自体を考慮すると、有界ポインタ及び関連範囲情報を物理的に同じロケーションに格納する必要がないため、範囲情報をポインタ値自体と別々に格納することができる。
【００３９】
ここで、具体的な実施例を図面を参照しながら説明する。
【実施例１】
【００４０】
図１は、命令を処理する処理パイプライン４を含むデータ処理装置２の例を概略的に示す。この例では、処理パイプライン４は、フェッチステージ６と、復号ステージ８と、発行ステージ１０と、実行ステージ１２と、ライトバックステージ１４とを含む複数のパイプラインステージを含むが、他の種類のステージ又はステージの組み合わせが提供されてもよいことが理解されよう。例えば、幾つかの実施例では、レジスタの名前を変更する名前変更ステージが含まれてもよい。処理される命令はステージからステージへと移行し、或るステージで命令が進行中のときは、パイプライン４の異なるステージで他の命令が進行中であってもよい。
【００４１】
フェッチステージ６は、レベル１（Ｌ１）命令キャッシュ２０から命令をフェッチする。フェッチステージ６は、通常、連続した命令アドレスから連続的に命令をフェッチする。しかしながら、フェッチステージは、分岐命令の結果を予測する分岐予測部２２も有してもよく、フェッチステージ６は、分岐が行われると予測されると（非連続的な）分岐ターゲットアドレスから命令をフェッチでき、分岐が行われないと予測されると連続する次のアドレスから命令をフェッチできる。分岐予測部２２は、所定の分岐が行われようとしているか否かを予測する情報を格納する、１つ以上の分岐履歴テーブルを含んでもよい。例えば、分岐履歴テーブルは、以前に実行された分岐の実際の結果を追跡したり、分岐の予測の信頼度を表したりするカウンタを含んでもよい。分岐予測部２２は、分岐命令の以前のターゲットアドレスをキャッシュして、同じ分岐命令の連続的との出会いを予測できるようにする、分岐ターゲットアドレスキャッシュ（ＢＴＡＣ）２４も含んでもよい。
【００４２】
フェッチされた命令は、命令を復号して復号された命令を生成する復号ステージ８に渡される。復号された命令は、実行ステージ１２が適当な処理操作を実行するように制御する制御情報を含んでもよい。キャッシュ２０からフェッチされる幾つかのより複雑な命令については、復号ステージ８がこれらの命令を複数の復号された命令にマッピングしてもよく、これはマイクロ操作（μｏｐｓ又はｕｏｐｓ）として知られる。従って、Ｌ１命令キャッシュ２０からフェッチされる命令とパイプラインの後のステージで見られる命令との間に相関関係がなくてもよい。概して、本明細書にある「命令」への言及は、マイクロ操作を含むものとして解釈されるべきである。
【００４３】
復号された命令は、命令の実行に必要なオペランドが使用可能か否かを判断して、オペランドが使用可能な場合に実行の命令を発行する発行ステージに渡される。幾つかの実施例では、順番処理をサポートすることで、命令がＬ１命令キャッシュ２０からフェッチされるプログラム順序に対応した順序で、実行の命令が発行されてもよい。他の実施例では、非順番処理をサポートすることで、プログラム順序と異なる順序で、命令が実行ステージ１２に発行されてもよい。非順番処理は、オペランドを待つ間に先の命令が停止し、オペランドが使用可能な、プログラム順序では後の命令を先に実行できるため、性能の向上に有用となりうる。
【００４４】
発行ステージ１０は、様々なデータ処理操作を行うように命令が実行される実行ステージ１２に命令を発行する。例えば、実行ステージは、整数値に対して算術演算又は論理演算を行う算術論理演算器（ＡＬＵ）３０と、浮動小数点型で表された値に操作を行う浮動小数点（ＦＰ）部３２と、レベル１（Ｌ１）データキャッシュ３６からレジスタ４０にデータ値をロードするロード操作、又はレジスタ４０からＬ１データキャッシュ３６にデータ値を格納するストア操作を行うロード／ストア部３４とを含む、複数の実行部３０，３２，３４を含んでもよい。これらは提供可能な実行部の種類の幾つかの例に過ぎず、多くの他の種類のものも提供可能であることが理解されよう。処理操作を行うために、実行ステージ１２が一組のレジスタ４０からデータ値を読み取ってもよい。そして、実行命令の結果が、ライトバックステージ１４によってレジスタ４０にライトバックされてもよい。
【００４５】
Ｌ１命令キャッシュ２０及びＬ１データキャッシュ３６は、複数のキャッシュのレベルを含むキャッシュ階層の一部であってもよい。例えば、レベル２（Ｌ２）キャッシュ４４も提供されてもよく、任意で更なるキャッシュのレベルも提供できる。この例では、Ｌ２キャッシュ４４は、Ｌ１命令キャッシュ２０とＬ１データキャッシュ３６との間で共有されるが、他の例は、個別のＬ２命令キャッシュ及びＬ２データキャッシュを有してもよい。フェッチされる命令がＬ１命令キャッシュ２０にない場合はＬ２キャッシュ４４からフェッチでき、同様に、命令がＬ２キャッシュ４４にない場合はメインメモリ５０からフェッチできる。同様に、ロード命令に応答して、データがＬ１データキャッシュ３６にない場合はＬ２キャッシュ４４からフェッチでき、必要に応じてメモリ５０からフェッチできる。任意の既知のスキームをキャッシュ階層の管理に用いてもよい。
【００４６】
パイプライン４が使用する、プログラム命令及びデータ値を参照するためのアドレスは、仮想アドレスであってもよいが、少なくともメインメモリ５０及び任意で少なくとも幾つかのキャッシュ階層のレベルが、物理的にアドレス指定されてもよい。従って、パイプライン４４が使用する仮想アドレスを、キャッシュ又はメモリへのアクセスに使用される物理アドレスへと変換するために、トランスレーション・ルックアサイド・バッファ（ＴＬＢ）５２を提供してもよい。例えば、ＴＬＢ５２は、仮想アドレス空間の対応するページの仮想ページアドレスと、仮想ページアドレスがマッピングされるべき対応する物理ページアドレスとをそれぞれ指定する複数のエントリを含んで、対応するページ内の仮想アドレスを物理アドレスに変換するようにしてもよい。例えば、仮想ページアドレス及び物理ページアドレスは、対応する仮想アドレス及び物理アドレスの最上位の部分に対応してもよく、残りの最下位の部分は、仮想アドレスを物理アドレスにマッピングする際も変化しない。アドレス変換情報と同様に、各ＴＬＢエントリは、アドレスの所定のページがパイプライン４の所定の態様においてアクセス可能か否かを示す等、幾つかの情報指定アクセス許可も含んでもよい。幾つかの実施例では、ＴＬＢエントリは、キャッシュ階層のどのレベルが読み取り又は書き込み操作に応答して更新されるかを定義するキャッシュ方針情報（例えば、キャッシュがライトバックモードで動作すべきかライトスルーモードで動作すべきか）、又は、対応するページ内のアドレスへのデータアクセスを、データアクセスがパイプライン４によって発行された順序と比較して、メモリシステムによって再び順序付けることができるか否かを定義する情報といった、アドレスの対応するページの他の特性も定義できる。
【００４７】
図１は単一レベルのＴＬＢ５２を示すが、ＴＬＢの階層が提供されて、レベル１（Ｌ１）ＴＬＢ５２が、近頃アクセスされた複数のページ内のアドレスを変換するためのＴＬＢエントリを含むようにしてもよいし、レベル２（Ｌ２）ＴＬＢが、より多くのページ用のエントリを格納するように提供されてもよいことが理解されよう。Ｌ１ＴＬＢ内に必要なエントリがない場合は、Ｌ２ＴＬＢ又は階層内の更なるＴＬＢからフェッチできる。アクセスされるページに必要なエントリがどのＴＬＢにもない場合は、ページテーブルウォークを行ってメモリ５０内のページテーブルにアクセスできる。本技術では任意の既知のＴＬＢ管理スキームを使用できる。
【００４８】
また、幾つかのシステムでは、複数のレベルのアドレス変換をサポートしてもよく、これによって、例えば、第１ＴＬＢ（又はＴＬＢの階層）を仮想アドレスから中間アドレスへの変換に用いてもよいし、１つ以上の更なるＴＬＢを用いる第２レベルのアドレス変換によって、中間アドレスを、キャッシュ又はメモリへのアクセスに使用される物理アドレスへと変換してもよいことが理解されよう。これは、例えば、第１レベルのアドレス変換をオペレーティングシステムによって管理でき、第２レベルのアドレス変換をハイパーバイザによって管理できる、仮想化をサポートするのに有用となりうる。
【００４９】
図１に示すように、装置２は一組の有界ポインタレジスタ６０を有してもよい。図１では、一組の有界ポインタレジスタは、一組の汎用データレジスタ４０と物理的に別々に示されているが、一実施例では、汎用データレジスタ及び有界ポインタレジスタの両方を提供するのに同じ物理的な記憶装置が用いられてもよい。
【００５０】
各有界ポインタレジスタ６０は、アクセスされるデータ値のアドレスを判断するのに用いられるポインタ値６２と、対応するポインタ６２を用いる際のアドレスの許容範囲を指定する範囲情報６４とを含む。有界ポインタレジスタ６０は、ポインタの使用における１つ以上の限定／許可を定義できる限定情報６６（本明細書では許可情報とも呼ばれる）も含んでもよい。例えば、限定６６は、ポインタ６２を用いる命令の種類や、ポインタを使用できるパイプライン４の態様を限定するのに使用できる。従って、範囲情報６４及び限定情報６６は、その中でのポインタ６２の使用が許容されたケイパビリティを定義するものと考えられる。定義されたケイパビリティの外でポインタ６２が使用されそうになると、エラーをトリガーできる。範囲情報６４は、例えば、ポインタが所定の既知の境界内に留まり、敏感又はセキュアな情報を含みうるメモリアドレス空間の他の領域へと出ていかないことを確実なものとするのに有用となりうる。或る実施例では、同じ物理的な記憶装置が汎用データレジスタ及び有界ポインタレジスタの両方に用いられ、一実施例では、ポインタ値６２は、例えば、対応する汎用レジスタで使用されるように、同じストレージロケーションに格納されてもよい。
【００５１】
図２は、データ又は命令への無許可のアクセスに対する防御として許容範囲が用いられる命令の種類の例を示す。図２の上部に示すように、特定の有界ポインタレジスタＰＲ１が既定のポインタ値６２と範囲情報６４とを含み、この例では、範囲情報６４は、許容範囲の下限を定義する下限アドレス６８及び許容範囲の上限を定義する上限アドレス６９によって指定される。例えば、境界線６８，６９は、８００００〜８１０００のアドレスの範囲を定義するように設定される。特定の命令が有界ポインタレジスタＰＲ１を参照し、ポインタ６２から判断されるアドレスがこの範囲の外にある場合、エラーがトリガーされてもよい。
【００５２】
例えば、図２のＡの部分に示すように、幾つかのシステムでは、ポインタレジスタ６０内のポインタ６２の値が、範囲情報６４が指定する範囲の外の値に設定されそうになると、エラーがトリガーされてもよい（ここでは、ポインタが直接的にアドレスを指定するものとする）。これによって、ポインタ６２が指定範囲外の値を選択することを一切回避して、確実に、ポインタを用いたどのアクセスも許容範囲内で安全に行うことができる。或いは、図２のＢの部分に示すように、ポインタ６２のアドレスが指定範囲外にある場合に、命令がそのアドレスによって識別されるロケーションにアクセスしようとすると、エラーがトリガーされてもよい。つまり、ポインタ６２を指定範囲外の値に設定することは未だ許容可能だが、ポインタアドレス（又はポインタから得られたアドレス）でデータアクセスが行われそうになると、アドレスが許容範囲外にある場合は、エラーがトリガーされてもよい。図２のＡ及びＢの部分に示す命令の両方の種類に応じて、他のシステムがエラーをトリガーしてもよい。
【００５３】
範囲情報６４は様々な方法で設定できる。例えば、セキュアコード又はオペレーティングシステム若しくはハイパーバイザが、既定のポインタに許容される範囲を指定してもよい。例えば、命令設定アーキテクチャが、既定のポインタ６２に対して範囲情報６４を設定又は変更する複数の命令を含んでもよく、これらの命令の実行は、所定のソフトウェア又はプロセッサ４の所定の態様若しくは例外状況に限定されてもよい。範囲情報６４を設定又は変更する任意の既知の技術を使用できる。
【００５４】
実行ステージ１２でポインタを参照する所定の命令を実行する際に使用できる一組の有界ポインタ記憶素子６０に加えて、フェッチステージ６でレベル１命令キャッシュ２０から命令がフェッチされる際に同様の機能を提供するのに、プログラムカウンタケイパビリティ（ＰＣＣ）レジスタ８０も使用されてもよい。具体的には、一組の有界ポインタ記憶素子６０内で各ポインタが提供される範囲及び制限情報と同様に、範囲情報８４及び任意の適当な制限情報８６も提供するＰＣＣ８０によって、プログラムカウンタポインタがフィールド８２に格納されてもよい。
【００５５】
図３は、タグビットが、個別のデータブロックと関連付けられて、これらのデータブロックがケイパビリティ（すなわち有界ポインタ及び関連限定情報）を表しているのか通常データを表しているのかを識別するのに、どのように用いられるかを概略的に示す。具体的には、メモリアドレス空間１１０が、概して指定のサイズを有する一連のデータブロック１１５を格納する。純粋に例示として、この例では各データブロックが１２８ビットを有するものとする。各データブロック１１５と関連付けられて、或る例ではタグビットと呼ばれる単一のビットフィールドであるタグフィールド１２０が提供されるが、関連データブロックがケイパビリティを表すことを識別するようにセットされ、関連データブロックが通常データを表すことを示すようにクリアされるため、ケイパビリティとして扱うことはできない。セット状態又はクリア状態に関連付けられた実際の値は実施例に応じて変化してもよいが、純粋に例示のみを目的として、一実施例では、タグビットが１の値を有する場合は関連データブロックがケイパビリティであることを示し、０の値を有する場合は関連データブロックが通常データを含むことを示すことが理解されよう。
【００５６】
ケイパビリティが、図３に示すケイパビリティレジスタ１００といった（本明細書ではケイパビリティレジスタとも呼ばれる）有界ポインタレジスタ６０の１つへとロードされると、タグビットがケイパビリティ情報と共に移動する。このため、ケイパビリティがケイパビリティレジスタ１００へとロードされると、ポインタ１２０、範囲情報１０４及び限定情報１０６（以下、許可情報と呼ばれる）がケイパビリティレジスタへとロードされる。また、ケイパビリティレジスタと関連付けられるか、その中の特定のビットフィールドとして、タグビット１０８が、内容がケイパビリティを表すことを識別するように設定される。同様に、ケイパビリティがメモリに戻るように格納される場合、関連タグビット１２０が、ケイパビリティが格納されたデータブロックと関連付けられて設定される。こうした手法によれば、ケイパビリティと通常データとを区別することが可能になるため、確実に、通常データをケイパビリティとして使用できなくなる。
【００５７】
図４は、ケイパビリティの許可フィールド１０６内で指定できる様々な許可を示す表１３０である。列１３５には様々な許可が並び、列１４０によって各許可の意味が識別される。図４から、ケイパビリティ内で指定されたポインタを、ロード元アドレス若しくは格納先アドレス、汎用データ又はケイパビリティの識別に使用できるか否かを識別するのに、様々な許可を設定できることが分かるだろう。実行許可は、ケイパビリティ内で指定されたポインタを、そこから命令をフェッチするアドレスの識別に使用できるか否かを識別するのにも使用できる。また、グローバル許可は、ケイパビリティがグローバルスコープを有するか否か、又は、代わりに、そのケイパビリティが指名されたプログラムスレッドのみと関連付けられたローカルケイパビリティとして扱われるか否かを示すのに使用できる。また、一実施例では、ケイパビリティ内で指定されたポインタ値が非グローバルケイパビリティ用の格納アドレスの識別に使用できるか否かを識別するように「ローカル格納」許可が提供される。セットの場合は、グローバルケイパビリティ及びローカルケイパビリティの両方をポインタによって格納できるが、クリアの場合は、グローバルケイパビリティのみをポインタによって格納できる。
【００５８】
また、以下に記載の実施例では、本明細書では「コピー可能」許可と呼ばれる、ケイパビリティがコピー操作を受けられるか否かを識別するように追加の許可が提供される。コピー操作は様々な形態をとることができ、一実施例では、ケイパビリティの完全な複製を作成する操作のみではなく、ケイパビリティの変更版を作成する操作も含む。一実施例では、ケイパビリティのコピーは、範囲も許可もコピープロセスによる拡大ができないように限定される。また、コピー可能フィールドがセットの場合はケイパビリティがコピーできることが示されるが、セットでない場合はケイパビリティがコピーできないことが示される。
【００５９】
「コピー可能」許可は、本明細書で言及される「コピー許可属性」の例である。許可は、コピーが許容されたケイパビリティとそうでないケイパビリティとの区別が可能であれば、記載のものと異なる形で表現されてもよいことが理解されよう。例えば、「コピー不可能」許可をコピー許可属性の例として代わりに提供して、セットによってケイパビリティがコピーできないことを示し、クリアによってケイパビリティがコピーできることを示してもよい。
【００６０】
上述のように、プログラムスレッドにケイパビリティが割り当てられていると、一実施例では、ケイパビリティの変更が許容される範囲、及び具体的にはケイパビリティ内で指定された許可まで、例えば関連許可ビットをクリアすることで、許可の縮小のみは許容するが、許可の拡大は許容しないように限定される。つまり、データに設定されるロード許可は有するが命令に設定されない実行許可は有さないケイパビリティがプログラムスレッドに割り当てられている場合、スレッドによるロード許可のクリアは可能だが、スレッドによる実行許可のセットは不可能である。
【００６１】
図５に概略的に示すように、装置に使用可能なメモリアドレス空間は、ローカルメモリ１５０及びグローバルメモリ１６０へと区分けされるものが検討できる。ローカルメモリ１５０は、個別のプログラムスレッドにスタックフレームを割り当てて、これらのプログラムスレッドがローカルデータ（すなわちそのスレッドに特有のデータ）を格納できるようにする、１つ以上のスタックを含んでもよい。グローバルメモリ１６０は、例えばヒープを含んでもよく、複数のプログラムスレッド間で共有されるデータを格納できる領域を提供する。
【００６２】
図６は、非信用エンティティによるケイパビリティのコピーについて、そのコピーを非信用エンティティの後のプロセスで使用するために保持できるようにする場合に、制御フローの整合性（ＣＦＩ）の問題がどのように生じるかを示すフロー図である。具体的には、信用エンティティ１  ２００がプロセスＡ  ２１０を実行する間、分岐パス２１２が示すように、命令フローを非信用エンティティ２  ２０５のプロセスＢ  ２１５内のターゲットアドレスへと分岐させる分岐命令が実行されるものとする。プロセスＡ  ２１０が実行する分岐命令はリンク付き分岐命令であるため、分岐が行われる際には、現在のプログラムカウンタ値から戻りアドレスが生成されることで、戻りアドレスが、プロセスＢ  ２１５に対して使用可能なケイパビリティリンクレジスタに格納されるものとする。やがてプロセスＢが完了すると、戻りアドレスはケイパビリティリンクレジスタからアクセスされ、パス２１７を通ってプロセスＡ  ２１０へと処理が戻る。
【００６３】
上記の概要は通常の予想される挙動であり、その後信用エンティティ２００内の処理が継続し、「意図したフロー」部分と関連付けられた図６に示すように、プロセスＣ  ２２０が続いて実行され、非信用エンティティ２０５上のプロセスＤ  ２２５を呼び出すように、同様の分岐及び戻り動作がパス２２２及び２２７を通して生じる。
【００６４】
非信用エンティティ２０５上で動作するプロセスが、戻りアドレスによって信用エンティティに処理を戻すようにするためだけのものであるため、非信用エンティティ上で実行されるプロセスが、その通常の処理の間に戻りアドレスをコピーしなければならないという必要性は想定されていない。しかしながら、例えば、プロセスＢ  ２１５がケイパビリティリンクレジスタの内容をメモリロケーションへと格納するステップを包含していた場合、プロセスＤがアクセスするのを許容する形でそのコピーを保持することが可能である。これは、具体的な例として、図６の残りの部分に概略的に示されている。
【００６５】
具体的には、ローカルメモリ１５０がスタック２３０を含み、プロセスＡ  ２１０及びプロセスＢ  ２１５の実行の間、プロセスＡ及びプロセスＢの両方が、スタック２３０上の関連付けられたスタックフレーム２３５及び２４０にそれぞれ割り当てられるものとする。概して、スタックフレームはスタックの上の方から割り当てられ、個々のプロセスが完了すると、スタック上のデータが無効化されて、後続のプロセスに割り当てられるスタック上の空間を解放する。
【００６６】
この例では、或る時点で、プロセスＢ  ２１５が、そのケイパビリティリンクレジスタの内容をそのスタックフレーム２４０へと格納することで、スタックフレーム上に戻りアドレス２４５を配置させるものとする。この戻りアドレスのスタックフレーム上への初期格納は、プロセスＢの或る破壊工作の直接的な結果であることもあるが、実際には、例えば、ケイパビリティリンクレジスタの内容をスタックフレーム２４０上に一時的に格納することが必要となる例外の連鎖によって合法的に行われることもある。
【００６７】
戻りアドレス情報がスタックフレームの境界内に留まるだけの場合、例えば情報をケイパビリティリンクレジスタ内へと戻すようにロードしなければならなくなると、やがて最終的にスタックからポップされる。また、プロセスＢが完了したときにも未だ戻りアドレス情報がスタックフレーム上に留まっている場合は、概して、スタックフレームの割り当てを解除するときにそのデータが無効化される。
【００６８】
しかしながら、プロセスＢが、戻りアドレス情報２４５を、スタック２３０の下の方のロケーション２５０にコピーする場合、その戻りアドレス情報を長時間持続させることが可能になる。例えば、スタック２３０の全体が使用されていない場合が多いため、スタックの下の方のアドレスが無効化されることなく規則的に上書きされる。
【００６９】
これによって、図６の左下隅に示すような、意図したプログラムフローに起こりうる妨害が生じることがある。具体的には、プロセスＡ  ２１０及びプロセスＢ  ２１５に想定されるようなフローで、パス２２２を通してプロセスＤ２２５に向かう分岐を生じさせるプロセスＣ２２０へと実行が進む間、スタック２３０の下の方のロケーション２５０に格納されたプロセスＢの戻りアドレスにアクセスすることで、プロセスＤは、実行が信用エンティティ２００内の想定されるロケーションに戻るのを防ぐことができる。具体的には、その戻りアドレス情報が、プロセスＤが用いるケイパビリティリンクレジスタ内にコピーされると、プロセスＤがパス２６０を通ってプロセスＡに戻ることができるため、ＣＦＩを乱してしまう。
【００７０】
図６は、ケイパビリティをコピーする能力によってどのようにＣＦＩが乱されるかの極めて具体的な一例を示すだけのものであり、具体的なケイパビリティのコピーの作成によって非信用エンティティが制御フローを変えてしまうシナリオ例が、他にも多くあることが理解されよう。
【００７１】
一実施例では、以下により詳細に説明するように、図４に示すようなコピー可能属性といった新たなコピー許可属性が、所定の状況でのケイパビリティのコピー生成を防止することで、こうした動作を抑制するように使用される。
【００７２】
図７は、こうした手法を、ケイパビリティレジスタからメモリに格納されるケイパビリティを指定する命令であるストアケイパビリティ命令とどのように関連付けて採用できるかを示す。具体的には、この例では、図７のボックス３０５を参照してより詳細に説明されるように、ストアケイパビリティ命令が、２つのケイパビリティレジスタを識別するのに用いられる整数ｎ及びｔを指定するものとする。
【００７３】
具体的には、ステップ３００で、現在の命令がストアケイパビリティ命令であると判断されると、ステップ３０５で、ケイパビリティレジスタＣ［ｔ］、すなわち整数ｔによって識別されたケイパビリティレジスタに格納されたケイパビリティの内容が、変数ｃｔに入力される。メモリに格納されるのはこのケイパビリティの内容である。また、ケイパビリティレジスタＣ［ｎ］に格納されたケイパビリティが変数ｃｎに入力され、このケイパビリティは、格納先メモリ内のアドレスを演算するのに用いられるポインタを提供する。
【００７４】
そして、ステップ３１０は、一実施例で行うことができる基準確認を示すが、任意であるため、他の実施例では省略されてもよい。具体的には、ｃｔがグローバル許可クリアを有するか否か（すなわちローカルケイパビリティとして指定されているか否か）及びｃｎがストアローカル許可クリアを有するか否か（すなわちストアローカルケイパビリティとして使用できないか否か）を確認する。これらの条件のどちらも真の場合、プロセスは、偽が生じるステップ３１５へと進む。具体的には、これらの条件下ではｃｔがローカルケイパビリティとして識別されるため、ｃｎ内のポインタから得られたメモリアドレスはｃｔを格納するのに使用できない。
【００７５】
しかしながら、ステップ３１０で識別された条件のどちらも満たされず、格納を進めることができる場合、プロセスはステップ３２０に進む（又は、例えば「ストアローカル」許可が使用されない場合など、任意のステップ３１０が行われない場合は、ステップ３０５からステップ３２０に直接進む）。
【００７６】
ステップ３２０で、変数ｃｔによって識別されたケイパビリティが、変数ｃｎ内に含まれるポインタによって格納先メモリアドレスを識別するメモリに格納される。
【００７７】
そして、ステップ３２５で、変数ｃｔがコピー可能許可クリアを有するか否かが判断され、すなわちｃｔがコピーできないことを識別する。一実施例では、これがステップ３２５で行われる唯一の確認であり、コピー可能許可がクリアでない場合、プロセスはステップ３４０でただ終了する。しかしながら、コピー可能許可がクリアの場合は、変数ｃｔの一部を形成するタグビットが、そのタグビットが偽であること、すなわちタグビットがクリアされることをマークするように更新される。そして、ステップ３３５で、ステップ３３０で更新された変数ｃｔが、ケイパビリティレジスタＣ［ｔ］内にライトバックされる。変数ｃｔ内のタグビットがクリアされていることから、タグビットをクリアすることで内容をケイパビリティとして使用できないと示されているため、ソースケイパビリティレジスタＣ［ｔ］が効率的に無効化されることを意味することが理解されよう。従って、この時点では、唯一有効なケイパビリティのコピーはメモリに格納されているものである。そして、ステップ３４０でプロセスが終了する。
【００７８】
一実施例では、ステップ３２５でコピー可能許可のステータスを判定する際に、ケイパビリティがグローバルスコープを有するものとしてマークされているか否か、又はそれが或いはローカルケイパビリティか否かを判断するように、グローバル許可も評価される。一実施例では、ｃｔがコピー可能許可クリアを有し、ケイパビリティがローカルケイパビリティであることを示す場合にのみ、プロセスがステップ３３０に進み、他の全ての場合ではステップ３４０へのｎｏパスを辿る。従って、コピー可能許可がコピーが禁じられていることを示す状況でのソースケイパビリティの選択的な無効化は、ケイパビリティがローカルケイパビリティとしてマークされている状況に限定される。実際では、グローバルケイパビリティをコピーするのに所定の合理的な理由がある場合は、ローカルケイパビリティをコピーする合理的な理由がある可能性が低いことが明らかとなっており、実際、戻りアドレスといったターゲットアドレスを識別するのに用いられるような所定のローカルケイパビリティは、概してコピーされるべきではない。従って、こうしたケイパビリティがコピーされそうになることが、いずれも、ＣＦＩが妨害されそうになっていることを示しうる。
【００７９】
また、例えばロードケイパビリティ命令に関する図８を参照して以下に説明するように、機能がローカルケイパビリティだけでなくグローバルケイパビリティにも適用される場合、一連の更新操作を、確実に正しい操作となるようにアトミックに行わなければならないという、所定のアトミック性の問題が生じることがある。図７の例では、ソースケイパビリティに関して行われる（ステップ３０５，３３０及び３３５によって実施される）読み取り・変更・書き込み機能が、現在のプログラムスレッドが使用しているケイパビリティレジスタに関して行われるため、アトミック性は問題にならない。
【００８０】
図８は、一実施例に従って、ロードケイパビリティ命令がどのように処理されるかを示すフロー図である。ステップ４００で、現在の命令がロードケイパビリティ命令か否かを判断し、そうである場合は処理がステップ４０５に進む。図７に記載のストアケイパビリティ命令と同様に、ロードケイパビリティ命令は整数ｎ及びｔを指定するものとする。ステップ４０５では、変数ｃｔが、例えばゼロ値へと設定されて初期化される。この変数は、やがてケイパビリティレジスタへとロードされるケイパビリティを保持するのに用いられる。また、変数ｃｎには、ロードされるアドレスを演算するのに用いられるケイパビリティに格納されたポインタと共に、ケイパビリティレジスタＣ［ｎ］に格納されたケイパビリティ内容が入力される。
【００８１】
そして、ステップ４１０で、メモリ内の演算されたアドレスからケイパビリティがロードされて、変数ｃｔの更新に用いられることで、変数ｃｔがロードされたケイパビリティを含むようにする。
【００８２】
そして、ステップ４１５で、ｃｔが、コピーできないことを示すコピー可能許可クリアを有するか否かが判断される。図７のステップ３２５と同様に、任意で、ｃｔがグローバル許可クリアを有するか否かも判定でき、コピー可能許可がクリアな場合は、追加でグローバル許可もクリアな場合にのみｙｅｓパスを辿るようにしてもよい。
【００８３】
そして、ｙｅｓパスを辿る場合、ステップ４２０では、更なる変数である「ｃｔ＿ＮＯ＿ＴＡＧ」がｃｔと等しくなるように設定されて、変数ｃｔの他のコピーを作成する。そして、ステップ４２５で、変数ｃｔ＿ＮＯ＿ＴＡＧ内のタグビットが偽としてマークされ、その後ステップ４３０で、変数ｃｔ＿ＮＯ＿ＴＡＧが、ステップ４１０で以前のロードで用いられたアドレスのメモリに書き込まれる。これによって、メモリ内に保持されたケイパビリティのコピーを、もうケイパビリティではないとマークすることで、効率的に無効化する。
【００８４】
ステップ４３５で、変数ｃｔがケイパビリティレジスタＣ［ｔ］へと書き込まれ、その後ステップ４４０でプロセスが終了する。ステップ４１５からｎｏパスを辿る場合、ステップ４２０〜ステップ４３０は迂回され、プロセスはステップ４３５に直接進む。
【００８５】
ステップ４２０，４２５及び４３０によって、タグフィールドをクリアするようにメモリ内のケイパビリティを更新する１つの機構が提供されるが、代替の実施例では異なる機構が使用されてもよいことが理解されよう。例えば、所定の実施例では、メモリにライトバックされる個別の変数ｃｔ＿ＮＯ＿ＴＡＧを生成する必要なくメモリ内のタグフィールドをクリアする、より直接的な機構が提供されてもよい。
【００８６】
ステップ４１５が、コピー可能許可及びグローバル許可の両方がクリアな場合にのみｙｅｓパスを辿ることができ、それによってケイパビリティがローカルケイパビリティであることを識別するように制限されている場合、ステップ４１０，４２０，４２５及び４３０によって実施される読み取り・変更・書き込み操作と関連付けられたアトミック性の問題は存在しない。しかしながら、ケイパビリティがローカルかグローバルかに関係なく、コピー可能許可がクリアなときにはいつでもステップ４１５からｙｅｓパスを辿ることができる場合、読み取り・変更・書き込み操作が確実にアトミックに行われて、そのケイパビリティを共有しうる任意の他のスレッドに関する正しい操作が確実なものとなるように、追加のステップが必要となることがある。操作をアトミックに処理する既知の機構は複数あり、これらの手法のいずれかを使用して、メモリに格納されたケイパビリティに関して行われる読み取り・変更・書き込み操作のアトミック性を確実なものとするようにしてもよいことが理解されよう。
【００８７】
図７は、ソース有界ポインタ記憶素子がレジスタであり、ディスティネーション有界ポインタ記憶素子がメモリロケーションである例を示し、図８は、ソース有界ポインタ記憶素子がメモリロケーションであり、ディスティネーション有界ポインタ記憶素子がケイパビリティレジスタであるシナリオを示す。また、いずれの場合でも、ストア操作又はロード操作を受けるようなケイパビリティの変化がない場合は、直接的なコピーが行われる。
【００８８】
図９は、ソース有界ポインタ記憶素子及びディスティネーション有界ポインタ記憶素子の両方がケイパビリティレジスタである例を示す。具体的には、図９は、一実施例に従って、ムーブケイパビリティ命令がどのように処理されるかを示す。命令はムーブ命令と呼ばれ、ムーブ命令のデフォルト動作によってソースレジスタの内容がディスティネーションレジスタに移されるが、ソースレジスタの内容を取り除くような動的なステップは存在しない。従って、これは、所定の状況下で、命令が実行された後にコピーが１つだけ残ることを保証できるように上記の技術を使用できることを確実なものとする、コピー操作を実施する命令の他の例である。
【００８９】
ステップ５００で、現在の命令がムーブケイパビリティ命令か否かを判断し、そうである場合はプロセスがステップ５０５に進む。この例では、ムーブケイパビリティ命令は、それぞれがソース及びディスティネーションを示している変数ｓ及びｄであるものとする。ステップ５０５では、ケイパビリティレジスタＣ［ｓ］に格納されたケイパビリティが変数ｃｓに入力される。また、変数ｃｄがｃｓと等しくなるように設定される。
【００９０】
ステップ５１０では、ｃｓがコピー可能許可クリアを有するか否かを判断する。図７のステップ３２５及び図８のステップ４１５に関して上述したように、任意で、ｃｓがグローバル許可クリアを有するか否かを判断して、ケイパビリティがローカルケイパビリティであることを示すこともできる。ステップ５１０で指定された条件が満たされると、プロセスは、ｃｓ内のタグビットが偽としてマークされるステップ５１５に進み、その後ステップ５２０で、変数ｃｓがケイパビリティレジスタＣ［ｓ］に書き込まれる。これによって、ソースケイパビリティレジスタの内容をもうケイパビリティに関係ないものとしてマークすることで、ソースケイパビリティを無効化する。ステップ５２５で、変数ｃｄがケイパビリティレジスタＣ［ｄ］に書き込まれ、その後ステップ５３０でプロセスが終了する。ステップ５１０からｎｏパスを辿る場合、ステップ５１５及び５２０は迂回され、プロセスはステップ５２５に直接進む。
【００９１】
こうしたムーブ命令を処理する場合、ソースケイパビリティに関して行われる（ステップ５０５，５１５及び５２０によって実施される）読み取り・変更・書き込み操作は、現在のプログラムスレッドによって使用が制御されたケイパビリティレジスタに関して行われるため、アトミック的に安全である。従って、ステップ５１０が、ソースケイパビリティの無効化を、ソースケイパビリティがローカルケイパビリティとしてマークされている状況に制限する任意のステップを含んでいなくても、アトミック性の問題は生じない。
【００９２】
図９に示す大まかなプロセスは、コピー操作が複製の真の作成か否か、又は、コピー操作が、ディスティネーションケイパビリティレジスタに格納されたケイパビリティがソースケイパビリティレジスタに格納されたケイパビリティの変更版である何らかの変更を含むか否かといったコピー操作の形態を識別する、ソースケイパビリティレジスタ及びディスティネーションケイパビリティレジスタに対して動作する任意の他の種類のケイパビリティ命令にも適用可能である。ソースケイパビリティレジスタの内容から直接得られることから、ディスティネーションケイパビリティレジスタの内容はコピーを表すものとして見られ、このため、図９のプロセスはソースケイパビリティレジスタの選択的な無効化に使用できる。ステップ５０５については、命令が、ソースケイパビリティに対して或る変更を行う場合、変数ｃｄがｃｓと等しくなるように設定されることはないが、代わりに変数ｃｓに対して或る変更操作が行われて、変数ｃｄとして格納されることが理解されよう。
【００９３】
完全性のために、図７、図８及び図９を参照して説明されたプロセスは、例えば以下のような疑似コードで表すこともできる。
// Store capability instruction
StoreCapability(integer n, integer t)
Capability ct = C[t];
Capability cn = C[n];
if (ct.local && !cn.store_local)
fault
// store capability to memory
MemC(cn, ct);
// conditionally clear the register tag
if (ct.local && ct.no_copy)
ct.tag = FALSE;
C[t] = ct
// Load capability instruction
LoadCapability(integer n, integer t)
Capability ct;
Capability cn = C[n]
// load capability from memory
ct = MemC(cn);
// conditionally clear the memory tag
if (ct.local && ct.no_copy)
Capability ct_no_tag = ct;
ct_no_tag.tag = FALSE;
MemC(cn, ct_no_tag);  // performed atomically with respect to 
the first MemC operation
C[t] = ct
// Move a capability between registers
MoveCapability(integer d, integer s)
Capability cs = C[s];
Capability cd = cs;
// conditionally clear the source register tag
if (cs.local && cs.no_copy)
cs.tag = FALSE;
C[s] = cs;
C[d] = cd;
【００９４】
上記の疑似コードの例では、グローバル許可は、実際は、ケイパビリティがローカルケイパビリティであることを示すようにセットされ、ケイパビリティがグローバルケイパビリティであることを示すようにクリアされる「ローカル」許可であるものとする。また、この例では、コピー可能許可属性は、実際は、コピーが禁じられていることを識別するようにセットされ、コピーが許容されていることを示すようにクリアされる「非コピー」許可属性である。
【００９５】
上記の疑似コードの例が、１つの特定の例のみを提供しており、必要に応じて代替の疑似コードによって上述のプロセスを表すこともできることが理解されよう。例えば、「ストアローカル」許可が使用／サポートされない実施例では、それに伴って疑似コードも変更されてもよい。他の例としては、「非コピー」許可は「コピー可能」許可と置き換えられてもよく、それに伴って疑似コードも変更される。
【００９６】
一実施例では、上記の機能は、コピー操作を指定する基準ケイパビリティ命令に関して適用でき、こうしたケイパビリティ命令は、レジスタ４０に格納されているような汎用データよりも、ケイパビリティレジスタ６０に格納されているようなケイパビリティに対して動作するように構成される。しかしながら、代替の実施例では、こうしたケイパビリティ命令の「非コピー」版が、ケイパビリティ命令の非コピーバリアントが実行されると行われる処理である上記の処理によって導入できる。これによって多くの様々な命令が増加すると同時に、上記の機構の実行が必要となるのが、命令の非コピーバリアントの実行時のみになって、基準ケイパビリティ命令の実行時の処理を幾分簡略化できることから、幾つかの性能利点を生むことができる。
【００９７】
図１０は、ケイパビリティ命令の２つのバリアントをどのように使用できるかの総括を示す。ステップ５５０で、関連ケイパビリティがコピー不可能としてマークされているか否かを判断する。そうでない場合、ステップ５５５で、コピー操作を指定するケイパビリティ命令が通常のケイパビリティ命令か非コピーバリアントかに関わらず、コピー操作を通常に行うことができる。
【００９８】
しかしながら、関連ケイパビリティがコピー不可能としてマークされている場合（任意且つ追加で、ケイパビリティがローカルケイパビリティとしてマークされているか否かによって分類される）は、ステップ５５０からのｙｅｓパスを辿り、後続の処理では、確実にコピーが作成されないようにする必要がある。ステップ５６０で、ケイパビリティ命令の非コピーバリアントが実行されていると判断された場合、プロセスが、図６、図７及び図８の上記のプロセスが行われるステップ５６５に進むことで、ソースケイパビリティに対してタグがクリアされる。従って、これらのプロセスを行うことで、ソースケイパビリティが有効形態に保持されることがないまま、コピー操作が効率的に変更されて真のムーブが行われる。
【００９９】
ステップ５６０で実行されるケイパビリティ命令が非コピーバリアントでない場合、ステップ５７０へのｎｏパスを辿る。ステップ５５０から辿るｙｅｓパスによる「コピーしてはいけない」要件を確保すれば、ステップ５７０で行われる明確なステップは実施に応じて変化してもよい。例えば一実施例では、この場合には、コピー不可能としてマークされたケイパビリティに関するコピー操作を行うのに、基準ケイパビリティ命令を用いるのは誤りだと推測できるため、停止が生じることがある。代替の実施例では、プロセスはコピー操作の標準ステップによって進められるが、コピーしてはいけない要件を確保するように追加の方策をとってもよい。これによって、例えば、ディスティネーションケイパビリティ上のタグフィールドをクリアすることで実現でき、コピーを効率的に無効化して、状況を、実行されているコピー操作よりも前の状況に回復させる。こうして、ロード操作を処理する際の極めて明解な解決策を提供でき、ケイパビリティがローカルケイパビリティである状況に機能が限定されない実施例におけるメモリに関して求められる、アトミック性のステップの必要性がなくなる。具体的には、レジスタにロードされているコピーが無効化されているため、メモリ内に保持されたコピーと関連したステップが必要なくなる。
【０１００】
図１１は、一実施例に従って、分岐命令をどのように処理できるかを示すフロー図であり、分岐命令は、プログラムカウンタについて行われる更新によって、コピー操作を効率的に行う種類の命令でもある。ステップ６００で、分岐命令を受信したか否かを判断し、そうである場合はステップ６０５で、分岐命令がソースケイパビリティを指定しているか否かを判断する。分岐命令がソースケイパビリティを指定している（そしてソースケイパビリティのポインタがターゲットアドレスを得るのに用いられる）場合、ステップ６０５からｙｅｓパスを辿る。そうでない場合は、分岐命令は、分岐命令内で直接指定されたオフセットに関連してターゲットアドレスが計算される即時分岐であるため、ステップ６０５からｎｏパスを辿る。
【０１０１】
ｙｅｓパスを辿る場合は、ステップ６１０で、ソースケイパビリティ内に保持されたポインタを用いてターゲットアドレスが計算され、その後、ステップ６１５で、ソースケイパビリティがコピー不可能としてマークされているか否かを判断する。ここでも、上述したように、この判断も、ソースケイパビリティがローカルケイパビリティとしてマークされている状態に限定できる。例えば、（ローカルで且つ少なくとも幾つかの状況ではコピー不可能な）ローカルスレッドが用いるための幾つかの機能ポインタ／戻りアドレスを保有して、他のスレッドと共有する（グローバル且つコピー可能な）他のものを有することが望ましいだろう。
【０１０２】
ステップ６１５からｙｅｓパスを辿る場合は、ステップ６２０でタグがソースケイパビリティ上でクリアされ、そうでない場合はステップ６２０を迂回する。ステップ６２０でタグをソースケイパビリティ上でクリアすることで、ソースケイパビリティから計算されたターゲットアドレス情報を用いてプログラムカウンタケイパビリティレジスタが更新されると、ソースケイパビリティのコピーが確実に１つのみになる。
【０１０３】
ステップ６０５からｎｏパスを辿る場合は、ステップ６２５に示すように、現在のプログラムカウンタ及び分岐命令内で指定された即値を用いてターゲットアドレスが計算される。
【０１０４】
ステップ６３０で、分岐命令がリンク付き分岐命令であるか否かを判断する。そうでない場合は、ステップ６４０でターゲットアドレスをプログラムカウンタケイパビリティレジスタにただ格納させることができ、それ以上のステップは必要ない。しかしながら、分岐命令がリンク付き分岐命令の場合、現在のＰＣＣ内容が戻りアドレスを指定するのに用いられ、具体的には、ステップ６３５で、現在のＰＣＣ内容がケイパビリティリンクレジスタ（ＣＬＲ）に格納される。そして、ケイパビリティリンクレジスタの内容が、分岐先のプロセスの実行の後にやがて大元の実行フローに戻るのに使用される戻りアドレスを指定する。一実施例では、ステップ６３５で示すように、この時点ではコピー可能許可がＣＬＲ内でクリアされるため、戻りアドレス情報が確実にコピーできなくなる。
【０１０５】
ステップ６３５に続いて、プロセスは、ターゲットアドレスをＰＣＣに格納するステップ６４０に進む。
【０１０６】
上記の実施例から、全ての状況でも、ケイパビリティがローカルケイパビリティとしてマークされている状況に制限された一実施例でも、追加のコピー許可属性を用いて所定のケイパビリティをコピー不可能としてマークすることで、コピー操作の挙動を変更できることが理解されよう。具体的には、こうした場合には、コピー操作を真のムーブ操作へと効率的に変換することができ、コピー操作の実行の後に残るケイパビリティのコピーを確実に１つのみにできる。これによって、ＣＦＩが妨害されそうになることに対するロバスト性を大幅に向上させることできる。
【０１０７】
本明細書では、「〜するように構成され」という単語は、装置の要素が、定義された動作を実行可能な構成を有することを意味するように用いられる。この文脈では、「構成」は、ハードウェア又はソフトウェアの相互接続の構造又は様式を意味する。例えば、装置は、定義された動作を提供する専用ハードウェアを有してもよいし、プロセッサ又は他の処理装置が、機能を実行するようにプログラムされてもよい。「〜するように構成され」は、定義された動作を提供するために装置要素を任意の方法で変更しなければならないことを暗示するものではない。
【０１０８】
本発明の例示的な実施例が、添付の図面と関連して本明細書に詳細に説明されているが、本発明はこれらの正確な実施例に限定されるものではなく、添付の請求項で定義されるような本発明の範囲及び精神から逸脱することなく、当業者が実施例への様々な変更、追加及び修正を達成できるものと理解されよう。例えば、本発明の範囲から逸脱することなく、独立項の特徴によって従属項の特徴の様々な組み合わせが作られてもよい。
【図１】
2018538610.tif 000003
【図２】
2018538610.tif 000004
【図３】
2018538610.tif 000005
【図４】
2018538610.tif 000006
【図５】
2018538610.tif 000007
【図６】
2018538610.tif 000008
【図７】
2018538610.tif 000009
【図８】
2018538610.tif 000010
【図９】
2018538610.tif 000011
【図１０】
2018538610.tif 000012
【図１１】
2018538610.tif 000013
【国際調査報告】
2018538610.tif 000014
2018538610.tif 000015