(58)【調査した分野】(Int.Cl.,DB名)
前記処理回路が、必要なポインタのポインタリファレンスを指定する、前記シーケンス内の前記少なくとも1つの命令の実行に応答して、前記必要なポインタからアドレスを決定するように、そして、前記現在命令コンテキストが前記有界ポインタ状態を特定しているときは、前記決定したアドレスが前記有界ポインタ記憶要素のうちの1つの前記関連範囲情報により示される前記許容アドレス範囲の中に収まるかチェックするために、境界チェック動作を行うようにさらに設計される、請求項1に記載の装置。
前記現在命令コンテキストが前記デフォルト状態を特定しているときは、前記決定されたアドレスがデフォルトの許容アドレス範囲内にあるかチェックするデフォルトの境界チェック動作を行うように、前記処理回路が設計される、請求項2に記載の装置。
前記境界チェック動作を行うときに、前記処理回路が、すべてのデータ値が確実に前記許容アドレス範囲に入るように、前記決定したアドレスにあるアクセス対象のデータ値のサイズを考慮に入れる、請求項2から4のいずれかに記載の装置。
プログラムカウンタポインタであって、前記プログラムカウンタポインタから決定されるプログラムカウンタの許容範囲を示す関連範囲情報をもつプログラムカウンタポインタを記憶する有界プログラムカウンタ記憶要素をさらに含み、
前記処理回路がさらに、前記分岐命令の実行に応答して、前記指定された有界ポインタ記憶要素の前記ポインタおよび関連範囲情報を使用して、前記有界プログラムカウンタ記憶要素を更新する、
請求項7に記載の装置。
前記有界ポインタ記憶要素のセットが、戻り先アドレスを特定するために使用されるポインタをもつ有界リンク記憶要素を含み、前記有界リンク記憶要素が戻り先命令コンテキストをさらに特定し、
前記分岐命令が前記有界リンク記憶要素を指定し、前記処理回路によって実行されて、以前の分岐から戻り、前記有界リンク記憶要素内に指定された前記戻り先命令コンテキストを前記制御記憶要素に記憶させることによって前記現在命令コンテキストを更新する、
請求項9に記載の装置。
前記少なくとも1つのさらなる命令が更新命令を含み、前記更新命令が前記現在命令コンテキストを更新するために、前記更新命令によって指定される更新値を前記制御記憶要素に書き込む、請求項6に記載の装置。
必要なポインタのポインタリファレンスを指定する、前記シーケンス内の前記少なくとも1つの命令が、ロード命令とストア命令のうち少なくとも1つである、請求項1から13のいずれかに記載の装置。
前記処理回路が命令セットからの命令を実行するように構成され、前記命令セットが、前記現在命令コンテキストに実行挙動が依存しない第1の命令サブセットと、前記現在命令コンテキストに実行挙動が依存する第2の命令サブセットとを含み、前記第2の命令サブセットが、必要なポインタのポインタリファレンスを指定する、前記シーケンス内の前記少なくとも1つの命令を含む、請求項1から14のいずれかに記載の装置。
前記命令セットが、必要なポインタのポインタリファレンスを指定する少なくとも1つの追加の命令を含み、前記少なくとも1つの追加の命令を実行すると、前記現在命令コンテキストが前記有界ポインタ状態と前記デフォルト状態のどちらを特定するかに関わりなく、前記処理回路が前記ポインタリファレンスを使用して、前記有界ポインタ記憶要素のうち、そこに記憶されたポインタが前記必要なポインタを形成するものを1つ特定するように設計される、請求項15に記載の装置。
前記命令セットが、必要なポインタのポインタリファレンスを指定する少なくとも1つの逆状態挙動命令を含み、前記少なくとも1つの逆状態挙動命令を実行するとき、前記処理回路が、
前記現在命令コンテキストが有界ポインタ状態を特定しているときは、前記ポインタリファレンスを使用して、前記データレジスタのうち、そこに記憶されているデータ値が前記必要なポインタを形成するものを1つ特定し、
前記現在命令コンテキストがデフォルト状態を特定しているときは、前記ポインタリファレンスを使用して、前記有界ポインタ記憶要素のうち、そこに記憶されているポインタが前記必要なポインタを形成するものを1つ特定するように構成される、
請求項15または16に記載の装置。
対応する有界ポインタ記憶要素に記憶されている前記ポインタの前記関連範囲情報を記憶するための、さらに別の記憶要素を含む、請求項1から18のいずれかに記載の装置。
前記範囲情報が、許容されるアドレス範囲の下側境界と上側境界のうち1つ、および許容されるアドレス範囲のサイズを特定する、請求項1から20のいずれかに記載の装置。
前記処理回路が前記シーケンス内の前記少なくとも1つの命令の実行に応答して、前記ポインタリファレンスが前記第1のサブセットとは異なる第2の値のサブセット内にある場合には、前記現在命令コンテキストが前記デフォルト状態と前記有界ポインタ状態のどちらを特定するかに関わらず、前記ポインタリファレンスを使用して、前記データレジスタのうち、そこに記憶されたデータが前記必要なポインタを形成するものを1つ特定する、請求項1から22のいずれかに記載の装置。
それぞれがポインタを記憶する有界ポインタ記憶要素のセットであって、前記ポインタが前記ポインタを使用するときに許容される関連範囲情報をもつ、有界ポインタ記憶要素のセットと、
それぞれがデータ値を記憶するデータレジスタのセットと
をもつ装置内で、命令実行挙動を制御する方法であって、
制御記憶要素に現在命令コンテキストを記憶するステップと、
少なくとも第1の値のサブセット内にある、必要なポインタのポインタリファレンスを指定する、少なくとも1つの命令を実行するときに、
前記現在命令コンテキストがデフォルト状態を特定しているときは、前記ポインタリファレンスを使用して、前記データレジスタのうち、そこに記憶されているデータ値が前記必要なポインタを形成するものを1つ特定するステップと、
前記現在命令コンテキストが有界ポインタ状態を特定しているときは、前記ポインタリファレンスを使用して、前記有界ポインタ記憶要素のうち、そこに記憶されているポインタが必要なポインタを形成する有界ポインタ記憶要素を1つ特定するステップとを含む、
方法。
【発明を実施するための形態】
【0010】
添付図面を参照しながら実施形態について説明する前に、実施形態について下記の説明を提供する。
【0011】
いくつかの処理装置では、有界ポインタの使用がサポートされてもよい。例えば、アクセスすべきデータ値または実行すべき命令のアドレスを指すため、またはそのアドレスを決定するために、ポインタそのものが使用されてもよい。ただし、ポインタはさらに、そのポインタを使用するときに許容されるアドレスの範囲を示す関連範囲情報をもっていてもよい。このことは、例えば、そのポインタから決定されるアドレスが一定の境界内に確実に収まるようにして挙動の安全性または機能的な正確さを維持するために役立つ可能性がある。例えば、ケイパビリティベースのアーキテクチャへの関心が高まってきていおり、このアーキテクチャでは、所与の処理に対して一定のケイパビリティが定められ、定められたケイパビリティの外で動作を行おうとするとエラーがトリガされる。有界ポインタの範囲情報は、そのようなアーキテクチャのために定められたケイパビリティ情報の一部であってもよい。あるいは、有界ポインタを定めることが可能な、非ケイパビリティベースのアーキテクチャが存在してもよい。
【0012】
よって、ある装置が、ポインタを記憶する少なくとも1つの有界ポインタ記憶要素をもち、そのポインタが、そのポインタを使用するときに許容されるアドレスの範囲を示す関連範囲情報をもっていてもよい。それぞれの有界ポインタ記憶要素は、例えば、レジスタまたは、スタックメモリ上の場所であることもできる。
【0013】
一定の命令を使用して、そのような有界ポインタ記憶要素を参照してポインタを取得し、次にそのポインタを使用して、その命令の動作中に必要なメモリ内のアドレスを導出することができる。ポインタを直接使用してメモリアドレスが特定されてもよいし、または、例えばポインタ値にオフセットを加えることによってメモリアドレスが導出されてもよい。
【0014】
しかし、そのような有界ポインタを参照せずに、例えば汎用レジスタに記憶されているデータ値を参照するなどのデフォルトの手法でポインタを取得する命令を提供することもまた、望ましい。前述したケイパビリティベースのアーキテクチャの例について考えると、このことによって、ケイパビリティを意識しないコード(例えば、ポインタが汎用レジスタ内の値から導出されるコード)を実行するために使用されるように命令セットを設定する一方で、前述した有界ポインタ記憶要素の内容からポインタが導出される、ケイパビリティを意識するコードの実行もまたサポートすることが可能になるだろう。しかし、現代の処理システムには、命令セット空間に対する厳しい重圧があり、それにより、命令セット内に指定できる命令の数は非常に制限される。
【0015】
一実施形態では装置が提供され、その装置は、有界ポインタ記憶要素のセットと、データ値を記憶するデータレジスタのセットとをもち、それぞれの有界ポインタ記憶要素は、関連範囲情報をもつポインタを記憶するために使用され、その範囲情報はそのポインタを使用するときに許容されるアドレスの範囲を示す。さらに、現在命令コンテキストを記憶する制御記憶要素も備わる。処理回路を使用して命令のシーケンスが実行される。また、少なくとも第1の値のサブセットの中にある、必要なポインタのポインタリファレンスを指定する、そのシーケンスの中の少なくとも1つの命令の実行に応答して、処理回路が現在命令コンテキストに依存して命令の実行挙動を変更する。具体的には、現在命令コンテキストがデフォルト状態を特定しているときは、処理回路はその命令により指定されるポインタリファレンスを使用して、データレジスタのうち、そこに記憶されているデータ値が必要なポインタを形成するものを1つ特定する。しかし、現在命令コンテキストが有界ポインタ状態を特定しているときは、処理回路はそのポインタリファレンスを使用して、有界ポインタ記憶要素のうち、そこに記憶されているポインタが必要なポインタを形成するものを1つ特定する。よって、そのような手法によって、同じ命令を、現在命令コンテキストに依存して異なる挙動をとるように、具体的には、必要なポインタを取得するためのポインタリファレンスの使用法が現在命令コンテキストに依存するように、設計することができる。そのような手法によって、前述した命令セット空間に対する重圧を考慮しながら、ケイパビリティを意識しないコードとケイパビリティを意識するコードの両方に同じ命令セットが使用されるようにすることができる。
【0016】
一実施形態では、ポインタリファレンスの値に関わらず、上記の挙動を採用することができる。よって、現在命令コンテキストがデフォルト状態を特定しているときには必ず、その命令によって指定されるポインタリファレンスからデータレジスタが特定され、現在命令コンテキストが有界ポインタ状態を特定しているときには必ず、その命令によって指定されるポインタリファレンスから有界ポインタ記憶要素が特定される。
【0017】
ただし、代替実施形態では、上記の挙動を特定範囲のポインタリファレンス値に制限することができる。よって、例として、ポインタリファレンスが第1のサブセットとは異なる第2の値のサブセットの中にある場合には、処理回路は、現在命令コンテキスト識別子がデフォルト状態と有界ポインタ状態のどちらを特定するかに関わらず、ポインタリファレンスからデータレジスタを特定するように設計されてもよい。このことは、例えば、考え得るポインタリファレンスの値の数が、特定の実装によって提供される有界ポインタ記憶要素の数を超える場合に有益であることもある。純粋に例として、ポインタリファレンスの指定に5ビットフィールドが使用され、32の異なる値(例えば、0から31の値)を指定できる状況を考えるとき、データレジスタは32個存在するが、有界ポインタ記憶要素が32より少ないということもある。例えば、有界ポインタ記憶要素が16個である場合、ポインタリファレンスの値が0から15の間であれば、現在命令コンテキストに依存してデータレジスタと有界ポインタ記憶要素の間で選択を行うために上記の挙動が行われるが、ポインタリファレンスの値が16から31の間であれば、現在命令コンテキストに関わらず、その値は必ずデータレジスタにマッピングされるように装置を設計することもできる。
【0018】
さらに別の代替実施形態では、現在命令コンテキストの値を、特定範囲のポインタリファレンス値に対して指定することもできる。よって、ポインタリファレンスが第1の値のサブセットの中にあるときには前述した現在命令コンテキストを使用する一方で、さらに1つまたは複数の、別の現在命令コンテキストを複数指定し、それぞれを、さらに別の範囲のポインタリファレンス値に関連付けることもできる。これにより、特定のポインタリファレンス値をデータレジスタと有界ポインタ記憶要素のどちらにマッピングするかを、その特定のポインタリファレンス値に関連する現在命令コンテキストに依存して制御し、上記の挙動を、よりきめ細かい様式で、特定のポインタリファレンス値に適用することができるだろう。
【0019】
一実施形態では、上記の命令のうち、必要なポインタのためのポインタリファレンスを指定する命令を実行するとき、処理回路が、必要なポインタからアドレスを決定するように、そして、現在命令コンテキストが有界ポインタ状態を特定していれば、決定したアドレスが当該の有界ポインタ記憶要素の関連範囲情報により示される許容アドレス範囲の中に収まるかチェックするために、境界チェック動作を行うようにさらに設計される。よって、これにより、現在命令コンテキストが境界ポインタ状態を特定している状況で、そのような命令を実行するときに、挙動の安全性または機能的正確さを維持することが可能になる。
【0020】
一実施形態では、装置は、現在命令コンテキストがデフォルト状態を特定しているときに境界チェック動作が行われないように動作するように設計されてもよく、したがって、装置内に何らかの既存の安全策が備わることを条件として、処理回路は、命令が実行されたときに、データレジスタから取得したポインタから導出したアドレスにアクセスすることが許可される。ただし、代替の実施形態では、現在命令コンテキストがデフォルト状態を特定しているとき、処理回路はデフォルトの境界チェック動作を行って、決定されたアドレスがデフォルトの許容アドレス範囲内にあるかチェックするように設計されてもよい。
【0021】
そのようなデフォルト範囲はいくつかの様式で指定し得るが、一実施形態では、装置は、デフォルトの許容範囲を示す範囲情報を記憶するデフォルト範囲記憶要素をさらに備える。このことにより、ケイパビリティを意識するシステムの中で、例えば、望まれる場合に、例えば既存のソフトウェアライブラリからとられたケイパビリティを意識しないコードへシステムが切り換わり、そのケイパビリティを意識しない既存コードをデフォルト状態で実行させながら、ケイパビリティを意識するシステムによって設定されてもよいデフォルトアドレス範囲へのアクセスを制限し、それによって、ケイパビリティを意識するシステムが、ケイパビリティを意識しないコードからアクセスできるアドレス範囲を制御することができるだろう。
【0022】
一実施形態では、境界チェック動作を行うとき(有界ポインタ状態にあるとき、または、デフォルト状態でデフォルト境界チェック動作を行うとき)、処理回路は、すべてのデータ値が確実に許容アドレス範囲に入るように、決定したアドレスにあるアクセスされるデータ値のサイズを考慮に入れてもよい。これにより、アクセスされるデータ値のどの部分も許容範囲の外にないことが保証される。
【0023】
どの時点においても、通常、装置は、有界ポインタを意識するコードか有界ポインタを意識しないコードのどちらかを実行しており、有界ポインタを意識するコードではポインタが必要になると有界ポインタ記憶要素のセットを利用し、有界ポインタを意識しないコードでは必要なポインタを決定するときに標準データレジスタを使用するが、この2つの異なるタイプのコードの間で適度に細かく切り替わるための機構を提供することは有益であろう。一実施形態では、このことは、制御記憶要素に記憶されている現在命令コンテキストを更新する、少なくとも1つのさらに別の命令に応答するように処理回路を設計し、よって、その命令の実行により、現在命令コンテキストを有界ポインタ状態とデフォルト状態の間で、どちらの方向にでも切り換えられるようにすることにより実現する。
【0024】
そのような命令は、いくつかの様式により、現在命令コンテキストを更新するように定めることができる。一実施形態では、有界ポインタ記憶要素のうち少なくとも1つが、命令コンテキスト値を指定する飛び先命令コンテキストのフィールドを含むように設計される。そうすると、現在命令コンテキストを更新するために使用される命令を、そのような有界ポインタ記憶要素の1つを参照して飛び先命令コンテキストのフィールドから命令コンテキスト値を取得し、取得した値を使用して、制御記憶要素に記憶されている現在命令コンテキストを更新するように設計することができる。
【0025】
ある特定の例では、この目的で処理回路によって実行される命令は、そのような飛び先命令コンテキストのフィールドを含む有界ポインタ記憶要素のうち1つを指定する分岐命令である。そうすると、処理回路は、その分岐命令の実行に応答して、指定された有界ポインタ記憶要素から取得した命令コンテキスト値を制御記憶要素に記憶させることによって、現在命令コンテキストを更新する。
【0026】
これにより、有界ポインタを意識するコードと有界ポインタを意識しないコードの間で移行するためには通常、どんな場合でも分岐命令が実行されることが必要になり、この実施形態では、実際には、分岐命令を実行するために行われる一連のステップの中に現在命令コンテキストの更新が組み込まれるので、特に効率的な実装が得られる。
【0027】
命令は通常、プログラムカウンタ値/ポインタを使用してメモリからフェッチされ、分岐動作の間に、そのプログラムカウンタが、分岐先のコード内の最初の命令のアドレスを指すように更新される。一実施形態では、装置はプログラムカウンタポインタを記憶する有界プログラムカウンタ記憶要素をさらに含み、このプログラムカウンタポインタは、そのプログラムカウンタポインタから決定されるプログラムカウンタの許容範囲を示す関連範囲情報をもつ。よって、これにより命令が確実に、有界プログラムカウンタ記憶要素の内容に関係する、許容されるアドレスからフェッチされるように境界チェックを行うことが可能になる。
【0028】
そのような実施形態の1つでは、処理回路はさらに、分岐命令の実行に応答して、その分岐命令によって指定される有界ポインタ記憶要素から取得したポインタおよび関連範囲情報を使用して、有界プログラムカウンタ記憶要素を更新する。これにより、分岐命令の実行を介した分岐先の目標コードに適するようにプログラムカウンタ範囲情報を更新するための効率的な機構が得られる。
【0029】
一実施形態では、有界ポインタ記憶要素を使用する上記のタイプの分岐命令は、デフォルト状態と有界ポインタ状態の間を両方向に切り替わることができるように、デフォルト状態と有界ポインタ状態の両方で処理回路によって実行されてもよい。よって、そのような分岐命令の挙動は現在命令コンテキストには依存せず、したがって、具体的には、現在命令コンテキストがデフォルト状態か有界ポインタ状態かに関わらず、指定された有界ポインタ記憶要素を参照して、同様に動作する。
【0030】
一実施形態では、有界ポインタ記憶要素のセットには、戻り先アドレスを特定するために使用されるポインタをもつ有界リンク記憶要素が含まれ、そのような有界リンク記憶要素は戻り先命令コンテキストをさらに特定する。その結果、ある命令が実行されて現在のコードから何らかの目標コードへ分岐する場合、実行が目標コードに切り替わるときに、有界リンク記憶要素を現在のコードの戻り先アドレスに更新して、目標コードの実行が終わったときに有界リンク記憶要素が戻り先に関する情報を提供するようにすることができる。
【0031】
その次に、有界ポインタ記憶要素を参照する前述したタイプの分岐命令を使用して、その分岐命令に上記の有界リンク記憶要素を指定させることにより、元のコードへの戻り動作を行うことができる。具体的には、分岐命令が実行されると、これにより、処理回路は、有界リンク記憶要素内の戻り先アドレスにより指定される命令アドレスへ戻り、そして、有界リンク記憶要素内に指定された戻り先命令コンテキストを制御記憶要素に記憶させることによって現在命令コンテキストを更新する。このことにより、元のコードの実行を、適切なアドレスから、そのコードに適した正しい命令コンテキストで再開することが可能になる。
【0032】
上記の例では、分岐命令を必要な機能により補って現在命令コンテキストを更新することができるが、別の実施形態では、別の更新命令が備わってもよく、それを実行すると、その更新命令によって指定された更新値が制御記憶要素に書き込まれて、現在命令コンテキストが更新されてもよい。
【0033】
そのような手法では、飛び先命令コンテキスト情報を有界ポインタ記憶要素に含める必要がなくなるが、分岐命令そのものは現在命令コンテキストを更新しないので、追加の命令を実行することが必要になる。
【0034】
更新命令は該当する更新値を指定するように、さまざまな様式で設計することができる。一実施形態では、更新命令がデータレジスタのうち1つを特定して、そこに記憶されているデータ値を使用して現在命令コンテキストが更新されてもよい。あるいは、更新命令がイミディエート値を指定して、どのデータレジスタを参照することもなく、直接その値を使用して現在命令コンテキストが更新されてもよい。
【0035】
前述した、必要なポインタのポインタリファレンスを指定し、かつ、その挙動が現在命令コンテキストに依存して変化する命令は、さまざまな形をとることができるが、一実施形態では、そのような命令は、命令セット内に備わるロード命令とストア命令のうち少なくともいくつかを含む。加えて、所望により、ポインタリファレンスを指定する他の命令もまた、その挙動が現在命令コンテキストに依存して変更されるようにすることが可能である。例えば、所望により、命令セットによって指定される分岐命令のうち1つまたは複数を、その挙動が現在命令コンテキストに依存して変更されるように設計してもよい。
【0036】
そのような命令を含む命令セットは、さまざまな形をとることができる。一実施形態では、命令セットは、現在命令コンテキストに実行挙動が依存しない第1の命令サブセットと、現在命令コンテキストに実行挙動が依存する第2の命令サブセットを含む。第2のサブセットは通常、例えば前述したロード命令とストア命令などの、ポインタリファレンスを指定する命令を少なくともいくつか含む。
【0037】
さらに、命令の第2のサブセットの実行挙動が現在命令コンテキストに依存する装置に所望の機能を追加するために、さらに別の1つまたは複数の命令を命令セットに含ませることもできる。
【0038】
例えば、一実施形態では、命令セットは、必要なポインタのポインタリファレンスを指定する少なくとも1つの追加の命令を含んでもよく、前記少なくとも1つの追加の命令を実行すると、処理回路は、現在命令コンテキストが有界ポインタ状態とデフォルト状態のどちらを特定するかに関わりなく、そのポインタリファレンスを使用して、有界ポインタ記憶要素のうち、そこに記憶されたポインタが必要なポインタを形成するものを1つ特定するように設計される。そのような命令の一例は、前述した、有界ポインタ記憶要素の1つを参照し、かつ現在命令コンテキストに関わりなく実行可能な分岐命令である。
【0039】
追加することもできる追加の命令の別の一例は、必要なポインタのポインタリファレンスを指定する逆状態挙動命令であり、少なくとも1つのその逆状態挙動命令を実行すると、処理回路は、ポインタリファレンスを使用して、現在命令コンテキストが有界ポインタ状態を特定しているときには、データレジスタのうち、そこに記憶されているデータ値が必要なポインタを形成するものを1つ特定し、現在命令コンテキストがデフォルト状態を特定しているときには、有界ポインタ記憶要素のうち、そこに記憶されているポインタが必要なポインタを形成するものを1つ特定するように構成される。そのような逆状態挙動命令を備えることにより、有界ポインタを意識するコードと有界ポインタを意識しないコードの間の効率的な連係動作が可能になる。
【0040】
有界ポインタ記憶要素はさまざまな形をとることができるが、一実施形態では、有界ポインタ記憶レジスタのセットを含む。さらに、有界ポインタ記憶要素はポインタに加えて関連範囲情報を直接記憶するように設計されてもよいし、あるいは、対応する有界ポインタ記憶要素に記憶されているポインタの関連範囲情報を記憶するために、さらに別の記憶要素が備わってもよい。
【0041】
範囲情報はいくつかの様式で指定することができるが、一実施形態では、範囲情報は許容されるアドレス範囲の上側境界と下側境界を特定し、また、代替実施形態では、範囲情報は許容されるアドレス範囲を特定するために使用されるサイズ情報と共に、上側境界と下側境界のうち1つを特定する。
【0042】
ここで、特定の実施形態について図面を参照しながら説明する。
【0043】
図1は、命令を処理するための処理パイプライン4を備えるデータプロセッサ装置2の例を概略的に示す。この例では、処理パイプライン4は、いくつかのパイプライン段を含み、それらにはフェッチ段6、デコード段8、発行段10、実行段12、およびライトバック段14が含まれるが、他のタイプまたは組み合わせの段が備わってもよいことが理解される。例えば、いくつかの実施形態では、レジスタリネームを行うためにリネーム段を含むこともできる。処理される命令は段から段へ移動し、ある命令がパイプライン4の1つの段でペンディングしている間に、異なる段で別の命令がペンディングしていてもよい。
【0044】
フェッチ段6は、レベル1(L1)命令キャッシュ20から命令をフェッチする。フェッチ段6は通常、連続した命令アドレスから連続的に命令をフェッチする。ただし、フェッチ段はさらに、分岐命令の結果を予測するための分岐予測器22を有してもよく、フェッチ段6は、分岐が行われると予測されると、(連続していない)分岐目標アドレスから命令をフェッチし、分岐が行われないと予測されると、連続した次のアドレスから命令をフェッチすることができる。分岐予測器22は、一定の分岐が行われるか否か予測するための情報を記憶するために1つまたは複数の分岐履歴テーブルを含んでもよい。例えば、分岐履歴テーブルは、それ以前に実行された分岐の実際の結果を追跡するか、分岐に対して行われる予測の確実性を表すカウンタを含んでもよい。分岐予測器22は、さらに、以前の分岐命令の目標アドレスをキャッシュして、その後、同じ分岐命令に遭遇したときに目標アドレスを予測できるようにするために、分岐目標アドレスキャッシュ(BTAC)24を含んでもよい。
【0045】
フェッチされた命令はデコード段8へ渡され、この段で命令がデコードされて、デコード済み命令が生成される。デコード済み命令は、適切な処理動作を行うように実行段12を制御するための制御情報を含んでもよい。キャッシュ20からフェッチされる命令がより複雑な場合には、デコード段8が、それらの命令を、マイクロオペレーション(μopsまたはuops)と呼ばれる複数のデコード済み命令にマッピングすることがある。よって、L1命令キャッシュ20からフェッチされる命令と、パイプラインのその後の段に現れる命令の間の関係は、1対1ではないことがある。一般に、本出願において「命令」への言及は、マイクロオペレーションを含むと解釈されるべきである。
【0046】
デコード済みの命令は発行段10に渡され、ここでは、その命令の実行に必要なオペランドが利用可能であるか判断され、オペランドが利用可能であれば、その命令が、実行されるように発行される。いくつかの実施形態では、L1命令キャッシュ20からフェッチされたプログラム順序に沿った順序で実行されるように命令を発行するために、インオーダー処理がサポートされてもよい。他の実施形態では、プログラム順序とは異なる順序で実行段12に命令を発行できるように、アウトオフオーダー実行がサポートされてもよい。アウトオブオーダー処理では、前の命令がオペランドを待って停止している間に、プログラム順序では後ろにある、オペランドが利用可能になっている命令を先に実行することができるので、パフォーマンスを向上させるために有用である可能性がある。
【0047】
発行段10は実行段12に命令を発行し、この段で命令が実行されて、さまざまなデータ処理動作を行う。例えば、実行段はいくつかの実行ユニット30、32、34を含んでもよく、これらは、整数値に算術演算または論理演算を行うための算術/論理ユニット(ALU)30、浮動小数点形式で表現された値に演算を行うための浮動小数点(FP)ユニット32、およびレベル1(L1)データキャッシュ36からレジスタ40へデータ値をロードするためのロード命令またはレジスタ40からL1データキャッシュ36へデータ値をストアするためのストア命令を行うためのロード/ストアユニット34を含む。これらのユニットが、提供されてもよいタイプの実行ユニットのいくつかの例に過ぎないこと、また、他の種類もまた提供されてもよいことが理解される。処理動作を行うために、実行ユニット12はレジスタのセット40からデータ値を読み込んでもよい。実行した命令の結果が次に、ライトバック段14によってレジスタ40にライトバックされてもよい。
【0048】
L1命令キャッシュ20とL1データキャッシュ36は、複数レベルのキャッシュを含むキャッシュ階層の一部であってもよい。例えば、さらにレベル2(L2)キャッシュ44が備わってもよいし、任意選択で、さらなるレベルのキャッシュを備えることもできる。この例では、L2キャッシュ44はL1命令キャッシュ20とL1データキャッシュ36の間で共有されるが、他の例では、別のL2命令キャッシュとデータキャッシュがあってもよい。フェッチすべき命令がL1命令キャッシュ20にない場合にはL2キャッシュ44からフェッチすることができ、同様に、その命令がL2キャッシュ44にない場合は、メインメモリ50からフェッチすることができる。同様に、ロード命令に応答して、データがL1データキャッシュ36にない場合にはL2キャッシュ44からフェッチすることができ、必要ならメモリ50からフェッチすることができる。キャッシュ階層を管理するために、知られているどのような手法を使用してもよい。
【0049】
パイプライン4によって使用されるアドレスはプログラム命令を参照し、そのデータ値は仮想アドレスであってもよいが、少なくともメインメモリ50は物理アドレス指定され、さらに任意選択として、キャッシュ階層の少なくともいくつかのレベルが物理アドレス指定されてもよい。したがって、パイプライン4が使用する仮想アドレスを、キャッシュまたはメモリをアクセスするために使用される物理アドレスに変換するために、変換ルックアサイドバッファ52(TLB)が備わってもよい。例えば、TLB52が複数のエントリを含んでもよく、そのそれぞれが、仮想アドレス空間の対応するページの仮想ページアドレスおよび、その仮想ページアドレスをマッピングするべき物理ページアドレスを指定してもよい。例えば、仮想アドレスを物理アドレスにマッピングするときに、仮想ページアドレスと物理ページアドレスが、対応する仮想アドレスと物理アドレスの大部分には対応しており、残りの少しの部分が変更されないままであってもよい。アドレス変換情報にならび、各TLBエントリには、さらに、一定のアドレスページがパイプライン4の一定のモードでアクセス可能であるかを示す情報などの、アクセス許可を指定するいくつかの情報が含まれでもよい。いくつかの実施形態では、TLBエントリはさらに、対応するアドレスページのその他の属性を定めることもでき、それらは、読み出しまたは書き込み動作に応答してキャッシュ階層のどのレベルが更新されるか(例えば、キャッシュがライトバックモードとライトスルーモードのどちらで動作すべきか)を定めるキャッシュポリシー情報、または、対応するページ内のアドレスへのデータアクセスの順序を、メモリシステムによって、パイプライン4がデータアクセスを発行した順序に比較して並べ替えることができるかを定める情報などである。
【0050】
図1には単一レベルのTLB52が示されているが、TLBに階層を備えて、最近アクセスされたいくつかのページ内のアドレスを変換するためのTLBエントリをレベル1(L1)TLB52が含み、さらに多くのページに対するエントリをレベル2(L2)TLBが記憶するようにしてもよい。必要なエントリがL1のTLBにない場合には、L2のTLBから、または、階層内のさらに別のTLBからフェッチすることができる。アクセスすべきページに必要なエントリが、どのTLBにもない場合には、ページテーブルウォークを行ってメモリ50内のページテーブルにアクセスすることができる。本技術には、知られているどのようなTLB管理手法を使用することもできる。
【0051】
さらに、いくつかのシステムでは、複数レベルのアドレス変換をサポートしてもよく、例えば、第1のTLB(またはTLBの階層)を使用して仮想アドレスを中間アドレスに変換し、次に、1つまたは複数のさらに別のTLBを使用する第2のレベルのアドレス変換により、中間アドレスを、キャッシュまたはメモリへのアクセスに使用される物理アドレスに変換してもよい。これは仮想化をサポートするために役立つ可能性があり、仮想化では、例えば、第1のレベルのアドレス変換がオペレーティングシステムによって管理され、第2のレベルのアドレス変換がハイパーバイザによって管理されてもよい。
【0052】
図1に示されるように、装置2には、有界ポインタレジスタのセット60があってもよい。
図1に示される有界ポインタレジスタのセットは汎用データレジスタのセット40と物理的に分かれて示されているが、一実施形態では、同じ物理ストレージを使用して汎用データレジスタと有界ポインタレジスタが提供されてもよい。
【0053】
各有界ポインタレジスタ60は、アクセスすべきデータ値のアドレスを決定するために使用されてもよいポインタ値62と、対応するポインタ62を使用するときに許可されるアドレス範囲を指定する範囲情報64とを含む。任意選択として、有界レジスタ60はさらに他の制約情報66を含んでもよく、この情報は、そのポインタを使用する際の1つまたは複数の制約を定めてもよい。例えば、制約66を使用して、ポインタ62を使用してもよい命令のタイプまたは、そのポインタを使用できるパイプライン4のモードを制限することもできる。したがって、範囲情報64と制約情報66がケイパビリティを定め、そのケイパビリティの中でポインタ62の使用が許可されると考えることもできる。定められたケイパビリティの外でポインタ62の使用が試みられたとき、エラーをトリガすることができる。範囲情報64は、例えば、ポインタを一定の知られている境界内に確実に維持し、機密情報またはセキュリティ情報を収容していることのある、メモリアドレス空間の他の領域に出て行かないようにするために役立つ可能性がある。汎用データレジスタと有界ポインタレジスタの両方に同じ物理ストレージを使用する一実施形態では、ある実施形態において、ポインタ値62が、例えば、対応する汎用レジスタに使用されるのと同じストレージ位置に記憶されてもよい。
【0054】
図2は、データまたは命令への無許可のアクセスを、許容範囲を使用して防ぐタイプの命令の例を示す。
図2の上部に示されるように、特定の有界ポインタレジスタPR1は所与のポインタ値62と範囲情報64を含み、この例では、範囲情報は許容範囲の下側境界を定める下側境界アドレス68と許容範囲の上側境界を定める上側境界アドレス69を使用して指定される。例えば、境界68、69は、アドレス80000から81000の範囲を定めるように設定される。一定の命令が有界ポインタレジスタPR1を参照したときに、ポインタ62によって決定されるアドレスがこの範囲の外にあれば、エラーがトリガされてもよい。
【0055】
例えば、
図2のパートAに示されるように、いくつかのシステムでは、ポインタレジスタ60の中のポインタ62の値を、範囲情報64によって指定される範囲外の値に設定しようとすると、エラーがトリガされてもよい(ここでは、ポインタが直接アドレスを指定すると仮定する)。これにより、ポインタ62が指定された範囲外の値をとることが回避され、このポインタを使用するどのようなアクセスも、確実に許容範囲内に収まるようになる。あるいは、
図2のパートBに示されるように、ある命令が、ポインタ62のアドレスによって特定される位置へのアクセスを試みたときに、そのアドレスが指定された範囲外にあれば、エラーがトリガされてもよい。したがって、ポインタ62を指定された範囲外にセットすることは許可されるが、そのポインタアドレス(またはそのポインタから導出されたアドレス)にデータアクセスが試みられたときに、そのアドレスが許容範囲外にあれば、エラーがトリガされてもよい。他のシステムでは、
図2のパートAとパートBの両方に示されるタイプの命令に応答してエラーをトリガしてもよい。
【0056】
範囲情報64は、さまざまな様式で設定されることもできる。例えば、所与のポインタに許容される範囲を、セキュアなコード、またはオペレーティングシステムもしくはハイパーバイザが指定してもよい。例えば、命令セットのアーキテクチャが、所与のポインタ62の範囲情報64を設定または変更するためのいくつかの命令を含み、それらの命令の実行が特定のソフトウェアまたは、プロセッサ4の一定のモードもしくは例外状態に制限されてもよい。範囲情報64を設定または変更するために、知られているどのような技法を使用することもできる。
【0057】
あるポインタを参照する一定の命令を実行するときに実行段12で使用されてもよい有界ポインタ記憶要素のセット60に加えて、レベル1命令キャッシュ20から命令がフェッチされるときにフェッチ段6で同様の機能を提供するために、プログラムカウンタケイパビリティ(PCC)レジスタ80がさらに使用されてもよい。具体的には、PCC80には、フィールド82にプログラムカウンタポインタが記憶されてもよく、さらに、有界ポインタ記憶要素のセット60内の各ポインタに与えられる範囲および制約情報と同様に、範囲情報84および、制約情報86があればそれが、与えられる。
【0058】
一実施形態では、装置2で使用される命令セットを使用して、有界ポインタを意識する(本明細書では、ケイパビリティを意識する、とも称する)アプリケーションプログラム、つまり、ポインタを使用してメモリアドレスを指定するときに有界ポインタ記憶要素60を使用するアプリケーションプログラムが記述され、さらに、有界ポインタを意識しない(本明細書では、ケイパビリティを意識しない、とも称する)アプリケーションプログラム、つまり、汎用レジスタ40内のデータ値を使用してポインタ値を指定することのあるアプリケーションプラグラムもまた記述される。一実施形態では、装置の動作を制御するために使用されるさまざまな制御レジスタ70内に、現在命令コンテキストの制御レジスタ72が備わり、その現在命令コンテキストレジスタにより示される現在の状態に依存して、装置により実行される一定の命令の挙動が変更される。
【0059】
具体的には、
図3に概略的に示されるように、命令セットには、現在命令コンテキストに挙動が依存しない、命令の第1のサブセット100が含まれてもよい。その例には、ALU内で実行される一定の算術論理命令、さらに言えば、FPU32内で実行される浮動小数点命令などがあろう。しかし、それに加えて、命令の第2の命令サブセット105があり、その挙動は現在命令コンテキストに依存して変更される。第2のサブセットには通常、例えば命令セットにより指定されるロード命令および/またはストア命令の少なくとも一部分などの、汎用命令のうち少なくともいくつかが入る。
図3に示されるように、そのようなロード命令またはストア命令は通常、ベースレジスタRbと転送レジスタRtを指定し、ベースレジスタRbの内容を使用してポインタが指定され、転送レジスタRtは、ロード動作の宛先レジスタ(すなわち、ロードされるデータ値が記憶されるレジスタ)またはストア動作のソースレジスタ(すなわち、メモリにストアされるソースデータを記憶するレジスタ)を形成する。一実施形態によれば、転送レジスタは常にセット40内の汎用レジスタの1つにマッピングされてもよいが、指定されたベースレジスタが何にマッピングされるかは、現在命令コンテキストに依存して変動する。具体的には、現在命令コンテキストがデフォルト状態を示しているときは、ベースレジスタは汎用レジスタ40のうち1つにマッピングされる。しかし、現在命令コンテキストがケイパビリティ状態を示しているときには、ベースレジスタはケイパビリティレジスタ60のうち1つにマッピングされる。よって、ロード命令またはストア命令によって使用されるポインタ情報の情報源は、現在命令コンテキストレジスタ72内に記憶されている現在命令コンテキストに依存する。
【0060】
一定のロード命令またはストア命令に加えて、ポインタを参照する1つまたは複数のその他の命令が第2のサブセット105に含まれてもよい。例えば、所望により、命令セットによって指定される1つまたは複数の分岐命令が、現在命令コンテキストに依存して挙動するように、第2のサブセット105にさらに含まれてもよい。具体的には、これにより、その分岐命令に必要なベースレジスタが、ケイパビリティレジスタ60のうち1つと汎用レジスタ40のうち1つのどちらから取得されるかが現在命令コンテキストに依存して決まるであろう。そのような手法を使用して、データリンクレジスタとケイパビリティリンクレジスタのどちらを使用して戻り先アドレス情報(ケイパビリティリンクレジスタを使用する場合は、戻り先の命令コンテキストも併せて)を取得するかを決定することもできる。
【0061】
後に詳細に考察するように、命令セットには、さらに、命令の第2のサブセット105の挙動が現在命令コンテキストに依存するシステムを全体的にサポートするための機能を追加する、いくつかの追加の命令110が含まれてもよい。例えば、現在命令コンテキストをケイパビリティ状態へ移行させるために、デフォルト状態でケイパビリティレジスタを使用する1つまたは複数の命令が指定されてもよい。また、状態に関わりなく常にケイパビリティレジスタを使用する1つまたは複数の別の命令があってもよいし、さらに言えば、現在命令コンテキストが現在命令コンテキストレジスタ72によって実際に示されている状態とは逆の状態にあるかのように振る舞う1つまたは複数の命令があってもよい。
【0062】
前述したように、現在命令コンテキストがデフォルト状態を示しているときには、第2のサブセット105内のどの命令についても、ポインタを指定するために使用されるベースレジスタは汎用レジスタ40のうち1つにマッピングされ、その汎用レジスタ内のデータ値がポインタとして使用される。これにより、原則的には、そのような命令を実行しているコードは、装置内に他のセキュリティ手段が配備されている場合はそれに従いながら、メモリ内の任意のアドレスにアクセスすることができる。
【0063】
しかし、一実施形態では、デフォルト状態で行われるアクセスをさらに制限するためにデフォルトデータケイパビリティ(DDC)レジスタ90が備わってもよく、このレジスタは、どのケイパビリティレジスタにも含まれる範囲および制限の情報と同様に、範囲情報92および、制約データ94がある場合はその制約データの両方を指定する。第2のサブセット105内のある命令がデフォルト状態で実行され、よってポインタを汎用レジスタ40のうち1つから取得すると、そのポインタから導出されたアドレスに基づいて、DDCレジスタ90に保持された範囲および制限の情報に関して境界チェック動作が行われる。そのような手法により、ケイパビリティを意識するコードが、既存のソフトウェアライブラリの中のケイパビリティを意識しないコードを利用しようとする場合に、DDCレジスタ90をセットして、そのケイパビリティを意識しないコードを実行しているときの、汎用レジスタ40からとられたポインタの使用について制限を設定することが可能である。具体的には、そのようなケイパビリティを意識しないコードを実行しているときにアクセス可能なアドレス範囲を、範囲情報を使用して制限することができる。
【0064】
図4Aおよび4Bは、命令セットの第2のサブセット105を形成する命令のうちの1つであるロード命令の挙動が、現在命令コンテキストに依存して変更される様子を示す。具体的には、
図4Aは、現在命令コンテキストがデフォルト状態を示している状況を示す。したがって、転送レジスタ指定子だけでなく、ベースレジスタ指定子もまた、汎用レジスタ40にマッピングされる。
図4Aに示されるように、汎用レジスタ(本明細書ではXレジスタとも称する)のうち1つにアクセスすることにより初期アドレスが取得され、その汎用レジスタの選択は、ロード命令で指定されるベースレジスタに依存する。この例では、次に初期アドレスにオフセットが加えられて、実際にロードアドレスとして使用される更新済みアドレスを特定する。その後、DDCレジスタ90の内容を使用して境界チェック動作が行われる。
図4Aに、その動作の説明が下に向かって示されている。一実施形態では、境界チェック動作は計算されたアドレス(オフセットを含む)に直接行われるが、別の代替実施形態では、アドレスは、境界チェック動作を行う前に、DDCレジスタ90内の範囲情報の中に含まれるアドレスのうち1つであるDDCベースアドレスを加えることによって修正されてもよい。
【0065】
境界チェック動作はそのアドレスおよび、ロード命令によってアクセスされるデータのサイズを考慮して、そのアドレスがDDCベースアドレスより小さいか、または、サイズ情報を加えたアドレスが、DDCレジスタ90の中の他方の範囲境界を特定するDDC限界アドレスを超えるか、判断する。この条件のどちらかが存在する場合は、ロードが中止される。それ以外の場合は、指定されたアドレスへのメモリアクセスを行うことによりデータが取得され、ロード命令の中の転送レジスタ指定子により決定される汎用レジスタ40内の宛先レジスタX[Rt]の中に、戻されたデータが記憶される。したがって、
図4Aの説明から、デフォルト状態では、ロード/ストアユニット34内でロード命令を処理するときにケイパビリティレジスタ60が使用されないことが明らかである。
【0066】
しかし、
図4Bに示されるように、現在命令コンテキストがケイパビリティ状態であれば、それらのケイパビリティレジスタが使用される。具体的には、転送レジスタ指定子は依然として汎用レジスタの1つにマッピングされるが、ベースレジスタ指定子はポインタにアクセスするために使用されるので、ベースレジスタ指定子はケイパビリティレジスタのうち1つにマッピングされる。よって、ケイパビリティレジスタ(本明細書ではCレジスタと称する)のうち、ベースレジスタ指定子Rbに基づいて決定される1つのケイパビリティレジスタからケイパビリティポインタが取得される。次に、ケイパビリティポインタにオフセットを加えることによってアドレスポインタが決定され、その後、特定されたケイパビリティレジスタ内の情報を使用して境界チェックが行われる。具体的には、
図4Bの下部に示されるように、そのアドレスポインタがケイパビリティベース値より小さいか、または、データサイズ情報と組み合わせたアドレスポインタがケイパビリティ限界情報を超えるか、判断される。そのどちらかであれば、ロードが中止される。それ以外の場合は、そのアドレスポインタによって与えられるメモリアドレスからデータが取得され、宛先レジスタX[Rt]の中に記憶される。
【0067】
一実施形態ではストア命令も同様に取り扱われ、その場合、転送レジスタは、メモリの、決定されたメモリアドレスにストアする必要のあるデータを特定するために使用される。
【0068】
上記の手法により、必要な命令の数を増やすことなく、したがって命令符号化空間に大きな制約を課すことなく、ケイパビリティを意識するコードとケイパビリティを意識しないコードの両方を単一の命令セットの中でサポートするための非常に効率的な機構が得られる。このことは、ロード命令とストア命令に関して非常に有益である。その理由は、現実には、命令空間内にはすでに複数の異なるタイプのロード命令とストア命令が符号化されており、それらのロード命令とストア命令のすべてについてケイパビリティを意識するバージョンをさらに作り出すためには空間が不足すると思われるからである。その代わりに、本明細書に記載される実施形態によれば、そのような追加のロード命令とストア命令は必要なく、既存のロード命令とストア命令の挙動を現在命令コンテキストに依存して変更して、ケイパビリティを意識するバージョンとケイパビリティを意識しないバージョンの両方のロード命令とストア命令を実装することができる。
【0069】
例えば、装置がケイパビリティを意識する既存のコードとケイパビリティを意識しないコードの間でどちらの方向にも切り替わることができるように、現在命令コンテキストレジスタ72の中の現在命令コンテキストを効率的に更新するための機構を備えることが望ましい。一実施形態では、そのような切り換えをサポートするために、ケイパビリティレジスタ60のうち1つまたは複数(一実施形態ではすべて)に、飛び先の命令コンテキストを提供する追加のフィールド68が備わる。加えて、ケイパビリティレジスタ60の1つを参照する一定の分岐命令が定められ、その命令はケイパビリティ状態とデフォルト状態の両方で実行して、そのようなケイパビリティレジスタにアクセスすることができる。要求された分岐命令を行うとき、アクセスしたケイパビリティレジスタ60の内容を使用してPCCレジスタ80が更新されて、目標コード内の実行すべき最初の命令に該当するプログラムカウンタポインタが、関連範囲と制約の情報と共に特定される。加えて、該当するケイパビリティレジスタのフィールド68を使用して現在命令コンテキストレジスタ72の内容が更新され、よって、その内容は目標/飛び先のコードの正しい現在命令コンテキストを特定する。その処理を
図5に概略的に示す。
【0070】
特に、本明細書で使用するとき、ケイパビリティ分岐命令という用語は、ケイパビリティレジスタを参照する分岐命令を指す。そのようなケイパビリティ分岐命令は、その挙動が現在命令コンテキストに依存しないので、命令セットの第2のサブセット105内にあるのではなく、そのようなケイパビリティ分岐命令は、命令セットに新しく追加されたケイパビリティ命令110の1つと考えることができる。
【0071】
ステップ200で、ケイパビリティ分岐命令を実行する必要があるかが検知され、その必要があれば処理はステップ205に進み、現在のケイパビリティ分岐命令がリンク付き分岐命令であるか判断される。リンク付き分岐命令であれば、ステップ210で、PCCレジスタ80の現在の内容と共に現在命令コンテキストが、ケイパビリティレジスタのセット60内のレジスタの1つであるケイパビリティリンクレジスタ内に記憶される。よって、ケイパビリティリンクレジスタは、所定の過程の中でリンク付き分岐命令からの戻り動作が行われたときにPCCレジスタをどのように更新すべきかを特定し、さらに、そのリンク付き分岐命令の前に行われていた元のコードへのそのような戻り動作に続いて現在命令コンテキストレジスタ72に記憶させるべき適切な現在命令コンテキストもまた、特定する。
【0072】
ステップ205で、その分岐命令がリンク付き分岐命令ではないと判断された場合、すなわち、単に通常の分岐であると判断された場合は、ステップ210は必要なく、処理は直接ステップ215に進む。ケイパビリティリターン命令を備えることもでき、この命令は実質的にはケイパビリティ分岐命令であり、参照されるケイパビリティレジスタがケイパビリティリンクレジスタであることに留意されたい。よって、ケイパビリティリターン命令は、205からNo分岐に沿って直接ステップ215へ進むであろう。
【0073】
ステップ215で、PCCレジスタ80の現在の内容が、分岐命令によって特定されるケイパビリティレジスタの内容に書き換えられる。したがって、これにより、PCCレジスタ80に記憶された新しいポインタを介して、目標コード内の実行すべき命令の最初のアドレスが、目標コードの命令をフェッチするときに使用される適切な範囲と制約の情報と共に特定される。
【0074】
ステップ220で、ケイパビリティレジスタ内の飛び先命令コンテキストがセットされているか判断される。この例では、「セットされている」状態とはケイパビリティ状態を示し、「セットされていない」とはデフォルト状態を示す。したがって、飛び先命令コンテキストがセットされていれば、ステップ225で、現在命令コンテキストレジスタ72の内容が、ケイパビリティ状態を特定するように更新される。逆に、飛び先命令コンテキストがセットされていないときは、ステップ230で、現在命令コンテキストレジスタ72が、デフォルト状態を示すように更新される。ある場合にはステップ225または230の実行により現在命令コンテキストの状態が実際に切り替わるが、他の場合には、更新操作の結果、現在命令コンテキストが変化しないこともある(例えば、飛び先命令コンテキストがケイパビリティ状態を示しているが現在命令コンテキストがすでにケイパビリティ状態であるため、または、飛び先命令コンテキストがデフォルト状態を示しており、現在命令コンテキストがすでにデフォルト状態にあるため)ことに留意されたい。
【0075】
図6Aは、
図5の処理を実装するコードシーケンスの例を示す。具体的には、
図6Aに示されるように、このコードは当初はケイパビリティ状態で実行しており、アドレス8000でケイパビリティレジスタC1を指定するリンク付き分岐が実行されると仮定される。この例では、C1内のポインタはアドレス0x10000、すなわち目標コードの最初のアドレスを特定すると仮定される。さらに、ケイパビリティレジスタC1内に指定された飛び先命令コンテキストが論理1値にあると仮定され、論理1値は前述した「セットされていない」状態に対応すると仮定されるので、デフォルト状態を特定する。したがって、このリンク付き分岐命令を実行するとき、ケイパビリティリンクレジスタ(この例ではレジスタC30)は、そのリンク付き分岐命令の次のアドレス、すなわち0x8004に更新され、さらに、その飛び先命令コンテキストは論理0値にセットされて、ケイパビリティ状態を示している。次に、PCCレジスタ80が、ケイパビリティレジスタC1の内容で更新されて、範囲と制約の情報と共にアドレス0x10000を特定する。加えて、現在命令コンテキストレジスタ72が、ケイパビリティレジスタC1内に記憶された値1で更新され、それにより状態がデフォルト状態に移行する。
【0076】
図6BはケイパビリティレジスタC1の内容を示し、その内容は、ポインタ272、範囲情報274、制約情報276、および飛び先命令コンテキストフィールド278を含む。上記のとおり、この例では、飛び先命令コンテキストフィールド内の論理1値はデフォルト状態を示し、論理0値はケイパビリティ状態を示す。
【0077】
図6Aに戻ると、リンク付き分岐命令の実行に続いて、アドレス10000から始めて、デフォルト状態で命令が実行される。どこかの点で、RETC命令、すなわちケイパビリティリターン命令に遭遇し、この命令は、前述したとおり、ケイパビリティレジスタとしてケイパビリティリンクレジスタC30を指定する分岐命令と考えられる。
図5の考察から明らかなように、RETC命令を実行するときは、ステップ205からNo分岐に進み、ステップ215でPCCレジスタ80がケイパビリティリンクレジスタの内容で更新され、次のアドレス8004を特定する。さらに、この処理の間に現在命令コンテキストレジスタ72が論理0に更新されてケイパビリティ状態を特定するので、アドレス8004から開始する命令が実行された後に、ケイパビリティ状態への移行が引き起こされる。
【0078】
上記の例では、現在命令コンテキストは、制御レジスタ80の1つを形成する現在命令コンテキストレジスタ72の中に記憶されると仮定されるが、別の実施形態では、現在命令コンテキストが実際にはPCC80の権限ビットとして記憶されることも可能であろう。そうすると、それらのPCCレジスタ70の内容を使用してフェッチユニット6によってフェッチされる、命令セットの第2のサブセット105内のどのような命令の挙動にも、この権限ビット値を使用して影響が与えられることになる。リンク付き分岐命令を実行するときに、PCCの現在の内容がケイパビリティリンクレジスタC30に記憶され、その結果、ケイパビリティリンクレジスタC30もまた、後に所定の過程の中で元のコードへ戻るときに使用するために現在命令コンテキストを取得することになる。
【0079】
図5を参照しながら考察した例では、分岐動作の間に現在命令コンテキストレジスタ72を更新するために、ケイパビリティ分岐命令が使用されると仮定する。ただし、代替実施例では、別の命令を使用して現在命令コンテキストを更新することができる。そのような実施形態の1つにより行われる処理を、
図7に示す。
図7で、「呼び出し元コード」という用語は、分岐の前にもともと実行していたコードを指し、「呼び出し先コード」という用語は、分岐に続いて実行され、その後、そこから戻る、目標コードを指す。さらに、移行シーケンスはケイパビリティ状態からデフォルト状態への分岐で、その後、デフォルト状態からケイパビリティ状態へ戻ると仮定される。
【0080】
したがって、呼び出し元コードは当初はケイパビリティ状態で実行しており、ステップ300で、デフォルト状態への切り換えが要求されていると判断する。具体的には、既存のソフトウェアライブラリ内の何らかの既存の機能を使用するために、何らかのケイパビリティを意識しないコードへの分岐が所望されてもよい。ステップ305で、現在命令コンテキストを明示的にデフォルト状態に切り換えるために1つまたは複数の命令が実行される。後に
図8の例を参照しながら考察するように、この切り換えには、一実施形態では、汎用レジスタ40に関するムーブ命令に続いて、汎用レジスタのうち1つからシステム制御レジスタ70のうちの1つ、具体的には、この例では、現在命令コンテキスト(CIC)レジスタ72に内容を移動するタイプの別のムーブ命令の実行が伴ってもよい。あるいは、単純に、その命令によって指定されるイミディエート値をCICレジスタ72にロードする命令を実行できてもよい。
【0081】
要求された命令をステップ305で実行した後に、呼び出し先コードへ分岐するためにステップ310で分岐命令が実行される。次にステップ315で、呼び出し先コードがデフォルトモードで実行され、その後、どこかの点で、呼び出し先コードによりリターン命令が実行され、ステップ320で呼び出し元コードへ戻る。
【0082】
この時点で、制御はすでに呼び出し元コードに戻っているが、現在命令コンテキストはデフォルト状態のままである。したがって、ステップ325で、呼び出し元コードは、現在命令コンテキストを明示的にケイパビリティ状態に変えるために1つまたは複数の命令を実行し、その後、ステップ330で、呼び出し元コードはケイパビリティ状態で実行を継続する。
【0083】
図7の処理について、
図8を参照しながら、一例として概略的に説明する。コードは当初、ケイパビリティ状態で実行しており、アドレス8000でロード命令が実行されて、ケイパビリティレジスタC0内のポインタにより特定されるメモリアドレスで見つかったデータが、汎用レジスタX1にロードされると仮定する。後に明らかになるように、汎用レジスタX1にロードされるこのデータは、実際には、続く分岐動作を介した移行先の目標コード内で実行される、最初の命令のアドレスとして使用される。したがって、ケイパビリティ状態でロード命令を実行することは、汎用レジスタのうち1つの中に、呼び出し先コードの最初の命令の目標アドレスをセットする役割を果たす。
【0084】
次に、アドレスがインクリメントされてアドレス8004となり、ここでムーブ命令が実行されて、汎用レジスタX2の中に値1が記憶される。その次の命令はMSR命令で、この命令は汎用レジスタX2の内容を現在命令コンテキストレジスタ72へ移動させる。したがって、CICレジスタ72に論理1値が書き込まれることになり、矢印350で示されるように、これによってデフォルト状態への移行が引き起こされる。
【0085】
この時点で、まだ呼び出し元コードは実行しているが、デフォルト状態になっている。よって、呼び出し元コードで実行される次の命令はアドレス800Cにあり、汎用レジスタX1の内容をポインタとして使用するリンク付き分岐命令である。前述したように、この時点で、レジスタX1の内容は呼び出し先コードの最初のアドレスを特定しており、この例ではアドレス10000と仮定される。よって、このリンク付き分岐命令を実行すると、セット40内の汎用リンクレジスタが戻りアドレスに更新され、この例ではアドレス8010である(すなわち、呼び出し元コードのBLR命令の次の命令を特定する)。その後、プログラムカウンタがアドレス10000に更新される。よって、その後、命令はアドレス10000で実行を開始して、要求された呼び出し先コードを実行する。呼び出し先コードの実行におけるどこかの点で、リターン命令が実行されて、呼び出し元コードへ戻る。この時点で、PC値がアドレス8010に更新されて、呼び出し元コードの次の命令を特定する。
【0086】
この時点で実行は呼び出し元コードに戻っているが、現在命令コンテキストはデフォルト状態のままであることに留意されたい。よって、戻った後に、呼び出し元コードによって実行される最初の命令を使用して、ケイパビリティ状態へ戻る移行が引き起こされる。具体的には、ムーブ命令が実行されて汎用レジスタX2に論理0値が記憶された後に、その論理0値がMSR命令を使用してCICレジスタ72に記憶され、それによって、
図8の矢印360で示されるように、ケイパビリティ状態へ戻る移行が引き起こされる。
【0087】
図7および8を参照しながら考察した手法を採用するときは、ケイパビリティレジスタ60を飛び先命令コンテキストフィールド68で拡張する必要はない。ただし、レジスタ72内の現在命令コンテキストを更新するために特定の追加の命令を実行する必要がある。
図5の手法がとられるか
図7の手法がとられるかには関わらず、現在命令コンテキストレジスタ72に現在命令コンテキストを含ませることにより、例外が発生した場合に、例外から戻ったときに復旧できるように、有効な現在命令コンテキストを確実に、該当する例外レジスタに自然に保存することができる。
【0088】
図3の考察で述べたように、現在命令コンテキストに挙動が依存する、命令セットの第2のサブセット105が存在していることを考慮しながら、一定数の新しいケイパビリティ命令110を命令セットに追加して、機能を拡張することができる。そのような新しいケイパビリティ命令の一例に、
図5を参照しながら考察した、前述のケイパビリティ分岐命令がある。また、ポインタを参照するが、現在命令コンテキストがデフォルト状態かケイパビリティ状態かに関わらず挙動が同じである、1つまたは複数の他の命令を備えることも可能であろう。その一例として、
図9でLDR
ALT命令について説明する。この命令は、第2のサブセット105に含まれない代替のロード命令である。
図9と
図4Bの比較から明らかになるように、LDR
ALT命令は、現在命令コンテキストがケイパビリティ状態であるなら、
図4Bのロード命令と全く同様に動作するだろう。しかし、
図4Bで説明したLDR命令と異なり、LDR
ALT命令は、現在命令コンテキストがデフォルト状態であるときも、全く同様に動作する。そのような代替ロード命令(さらに言えば、代替ストア命令も)は例えば、デフォルト状態の間、ケイパビリティを意識する薄いラッパーの中に既存のデフォルトコードをラップしたい場合など、さまざまな状況で有用であり得る。これにより、既存のデフォルトコードおよび関連するラッパーをデフォルト状態で実行しながら、ケイパビリティレジスタ内のケイパビリティを何らかの形で使用することが可能になるだろう。
【0089】
図10Aおよび10Bは、命令セットに追加されてもよい別のタイプの追加の命令110を示し、これらの命令は、現在命令コンテキストが、現在命令コンテキストレジスタ72内に実際に示された状態と逆の状態にあるかのように動作するので、逆状態挙動命令と呼ばれる。よって、
図10Aと
図4Aの比較および、
図10Bと
図4Bの比較から明らかになるように、指定されたLDR
OSB(ここでOSBは、逆状態の挙動を意味する)命令は、現在命令コンテキストがケイパビリティ状態にあるときに、現在命令コンテキストがデフォルト状態にあるとすれば命令の第2のサブセット105内のロード命令が行うであろう動作と同様に動作するように設計される。同様に、
図10Bに示されるように、LDR
OSB命令は、現在命令コンテキストがデフォルト状態にあるときに、現在命令コンテキストがケイパビリティ状態にあるとすれば第2のサブセット105内のロード命令が行うであろう動作と全く同様に動作するように設計される。そのような逆状態挙動命令を使用すると、ケイパビリティを意識するコードとケイパビリティを意識しないコードの間で効率的な相互作用が可能になるので、有用な機能拡張が得られる。例えば、ケイパビリティを意識するコードで、ポインタを、ケイパビリティレジスタの1つの中の実際のケイパビリティに変換することなく「そのまま」使用したい状況では、ケイパビリティを意識しないコードがケイパビリティを意識するコードにポインタリファレンスを返すことが望ましいことがある。そうではなく、全体的なDDC制約を使用してポインタの使用法を管理しながら、そのポインタをケイパビリティ状態で処理することも可能である。
【0090】
前述した実施形態から、これらの実施形態により、命令セット内の必要な命令の数を増やすことなく、したがって命令セットに加えることのできる追加の命令の数が命令符号化空間によって厳しく制限されている状況に著しい利益をもたらしながら、ケイパビリティを意識するコードとケイパビリティを意識しないコードの両方を記述するために単一の命令セットを使用できるようにするための効率的な機構が得られることが理解される。ケイパビリティベースのアーキテクチャが数多く出現してきており、前述した技法により、それらのケイパビリティベースのアーキテクチャを、例えばケイパビリティを意識していなかったデフォルト命令セットなどの既存のデフォルト命令の中に組み込むことができるだろう。そのようなケイパビリティを意識するアーキテクチャの特定の一例にCHERIアーキテクチャがあり、その詳細が、ケンブリッジ大学コンピュータ研究所のR.Watsonらによる、『Capability Hardware Enhanced RISC Instructions:CHERI Instruction−set architecture』と題するテクニカルレポート番号850、UCAM−CL−TR−850、ISSN 1476−2986に記載されている。
【0091】
本明細書に記載される実施形態の技法により、ソフトウェアが、そのようなケイパビリティを意識するアーキテクチャによりサポートされるとおりのきめ細かなメモリ保護を効率的に実装しながら、ケイパビリティを意識しないコードを記述するためにも同じ命令セットを使用できるようにすることが可能になる。一実施形態では、そのようなケイパビリティを意識しないコードを、例えば前述したDDCレジスタの内容を使用して、ケイパビリティの暗黙のデフォルトセットを使用してメモリアクセスを制御するように設計することができる。上記の技法により、ケイパビリティを意識するコードとケイパビリティを意識しないコードの間で効率的できめ細かな相互作用が可能になり、既存のアプリケーションを、ケイパビリティを意識するライブラリと再結合させることができ、また、新しいアプリケーションを従来のケイパビリティを意識しないライブラリに結合させることができる前述の手法は、ケイパビリティを意識しないコードのための既存の未修正のロード/ストア命令をサポートしながら、ケイパビリティを意識するコードのためのロード/ストア命令の同程度に豊富なセットをサポートするが、命令符号化空間に大きな制約をさらに課すことはない。
【0092】
本出願において、「〜ように構成される」という表記は、装置の要素が、定められた動作を行うことが可能な構成を有することを意味するために使用される。この文脈において、「構成」は、ハードウェアまたはソフトウェアの相互接続の配置または様式を意味する。例えば、装置が定められた動作を提供する専用のハードウェアを有してもよいし、または、プロセッサもしくは他の処理デバイスがその機能を行うようにプログラムされてもよい。「〜ように構成される」とは、定められた動作を提供するために、その装置の要素を変更する必要が一切ないことを暗に示す。
【0093】
本明細書では本発明の説明的な実施形態について、添付の図面を参照しながら詳しく説明してきたが、本発明がそれらの厳密な実施形態に制限されず、当業者によって、添付の特許請求の範囲によって定められる本発明の範囲および趣旨を逸脱することなく、さまざまな変更、追加、修正がそこに加えられてもよいことが理解される。例えば、本発明の範囲を逸脱することなく、従属請求項の特徴のさまざまな組み合わせが独立請求項の特徴と共に作成されることもできる。