以下の説明では、説明の目的で、以下に説明する本発明の実施形態の完全な理解を提供するために、多くの特定の詳細が示されている。しかしながら、本発明の実施形態がこれらの特定の詳細のいくつかなしで実施され得ることは当業者には明らかであろう。他の例では、本発明の実施形態の基礎となる原理を曖昧にすることを回避するために、周知の構造およびデバイスがブロック図の形で示されている。
例示的なプロセッサアーキテクチャ、命令フォーマット、およびデータ形式 命令セットには、1つまたは複数の命令フォーマットが含まれている。特定の命令フォーマットは、さまざまなフィールド(ビット数、ビットの位置)を定義して、特に、実行する操作(オペコード)とその操作を実行するオペランドを指定する。一部の命令フォーマットは、命令テンプレート(またはサブフォーマット)の定義によってさらに細かく分類される。たとえば、特定の命令フォーマットの命令テンプレートは、命令フォーマットのフィールドの異なるサブセットを有するように定義でき(含まれるフィールドは通常同じ順序であるが、含まれるフィールドが少ないため、少なくとも一部のビット位置は異なる)、および/または、解釈が異なる特定のフィールドを有するように定義され得る。したがって、ISAの各命令は、指定された命令形式を使用して(定義されている場合は、その命令形式の命令テンプレートの指定された1つで)表現され、演算とオペランドとを指定するためのフィールドが含まれる。たとえば、例示的なADD命令は、特定のオペコードと、オペランド(ソース1/宛先およびソース2)を選択するためのそのオペコードおよびオペランドフィールドを指定するためのオペコードフィールドを含む命令フォーマットを有し、命令ストリームでこのADD命令が発生すると、特定のオペランドを選択するオペランドフィールドに特定のコンテンツが含まれる。
本明細書に記載の命令の実施形態は、異なるフォーマットで実施することができる。さらに、例示的なシステム、アーキテクチャ、およびパイプラインについて以下に詳述する。命令の実施形態は、そのようなシステム、アーキテクチャ、およびパイプライン上で実行することができるが、詳述されたものに限定されない。
汎用ベクトル向け命令フォーマット
ベクトル向け命令形式は、ベクトル命令に適した命令形式である(たとえば、ベクトル演算に固有の特定のフィールドがある)。ベクトル演算とスカラ演算との両方がベクトル向け命令フォーマットを介してサポートされる実施形態が説明されているが、代替の実施形態は、ベクトル向け命令フォーマットを介してベクトル演算のみ使用する。
図1A〜図1Bは、本発明の実施形態による、汎用ベクトル向け命令フォーマットおよびその命令テンプレートを示すブロック図である。図1Aは、本発明の実施形態による、汎用ベクトル向け命令フォーマットおよびそのクラスAの命令テンプレートを示すブロック図である。一方、図1Bは、本発明の実施形態による、汎用ベクトル向け命令フォーマットおよびそのクラスBの命令テンプレートを示すブロック図である。具体的には、クラスAおよびクラスBの命令テンプレートが定義されている汎用ベクトル向け命令フォーマット100であり、どちらもメモリアクセス105の命令テンプレートおよびメモリアクセス120の命令テンプレートを含まない。ベクトル向け命令フォーマットの文脈における一般的なという用語は、特定の命令セットに関連付けられていない命令フォーマットを指す。
ベクトル向け命令フォーマットが以下をサポートする本発明の実施形態が説明される一方で、32ビット(4バイト)または64ビット(8バイト)のデータ要素幅(またはサイズ)を有する64バイトのベクトルオペランド長(またはサイズ)(したがって、64バイトのベクトルは16個のダブルワードサイズの要素、または8個のクアッドワードサイズの要素で構成される)、16ビット(2バイト)または8ビット(1バイト)のデータ要素幅(またはサイズ)を持つ64バイトのベクトルオペランドの長さ(またはサイズ)、32ビット(4バイト)、64ビット(8バイト)、16ビット(2バイト)、または8ビット(1バイト)のデータ要素幅(またはサイズ)を持つ32バイトのベクトルオペランドの長さ(またはサイズ)、32ビット(4バイト)、64ビット(8バイト)、16ビット(2バイト)、または8ビット(1バイト)のデータ要素幅(またはサイズ)を持つ16バイトのベクトルオペランドの長さ(またはサイズ)、代替の実施形態は、より多くの、より少ない、または異なるデータ要素幅(たとえば、128ビット(16バイト)のデータ要素幅)で、より多くの、より少ない、および/または異なるベクトルオペランドサイズ(たとえば、256バイトのベクトルオペランド)をサポートし得る。
図1AのクラスAの命令テンプレートには、次のものが含まれており、1)メモリアクセス105なしの命令テンプレート内に、メモリアクセスなしのフルラウンド制御型演算110の命令テンプレート、およびメモリアクセスなしのデータ変換型演算115の命令テンプレートが示され、2)メモリアクセスあり120の命令テンプレート内には、一時的なメモリアクセスあり125の命令テンプレート、および非一時的なメモリアクセスあり130の命令テンプレートが示されている。図1BのクラスBの命令テンプレートには、次のものが含まれており、1)メモリアクセスなし105の命令テンプレート内に、メモリアクセスなし、書き込みマスク制御、部分ラウンド制御型演算112の命令テンプレート、およびメモリアクセスなし、書き込みマスク制御、VSIZE型演算117の命令テンプレートが示され、2)メモリアクセス120ありの命令テンプレート内に、メモリアクセス、書き込みマスク制御127の命令テンプレートが示されている。
汎用ベクトル向け命令フォーマット100は、図1A〜図1Bに示される順序で以下にリストされた以下のフィールドを含む。
フォーマットフィールド140、すなわちこのフィールドの特定の値(命令フォーマット識別子値)は、ベクトル向け命令フォーマットを一意に識別し、したがって、命令ストリームにおけるベクトル向け命令フォーマットの命令の出現を識別する。そのため、このフィールドは、汎用ベクトル向け命令形式しかない命令セットには必要ないという意味でオプションである。
基本演算フィールド142は、そのコンテンツがさまざまな基本演算を区別する。
レジスタインデックスフィールド144は、そのコンテンツが、直接またはアドレス生成を通じて、レジスタ内またはメモリ内のソースオペランドと宛先オペランドの位置を指定する。これらには、PxQ(たとえば、32x512、16x128、32x1024、64x1024)レジスタファイルからN個のレジスタを選択するのに十分なビット数が含まれている。一実施形態では、Nは最大3つのソースおよび1つの宛先レジスタであり得るが、代替の実施形態は、多かれ少なかれソースおよび宛先レジスタをサポートし得る(たとえば、これらのソースの1つが宛先としても機能する最大2つのソースをサポートし得、これらのソースの1つが宛先としても機能する最大3つのソースをサポートし得、最大2つのソースと1つの宛先をサポートできる)。
修飾子フィールド146は、そのコンテンツが、メモリアクセスを指定する一般的なベクトル命令形式の命令の出現を、指定しないものと区別する。つまり、メモリアクセスなし105の命令テンプレートとメモリアクセスあり120の命令テンプレートの間である。メモリアクセスありの演算はメモリ階層の読み取りおよび/または書き込み(場合によってはレジスタの値を使用してソースおよび/または宛先アドレスを指定)をするが、メモリアクセスなしの演算は行わない(たとえば、ソースと宛先はレジスタである)。一実施形態では、このフィールドはまた、メモリアドレス計算を実行するための3つの異なる方法から選択するが、代替の実施形態は、メモリアドレス計算を実行するためのより多くの、より少ない、または異なる方法をサポートし得る。
拡張演算フィールド150は、そのコンテンツが、基本操作に加えて実行されるべきさまざまな異なる操作のうちのいずれか1つを区別する。このフィールドは文脈固有である。本発明の一実施形態では、このフィールドは、クラスフィールド168、アルファフィールド152、およびベータフィールド154に分割される。拡張演算フィールド150は、操作の共通のグループが、2、3、または4つの命令ではなく、単一の命令で実行されることを可能にする。
スケールフィールド160は、そのコンテンツにより、メモリアドレス生成用のインデックスフィールドのコンテンツのスケーリングが可能になる(たとえば、2scale*index+baseを使用するアドレス生成用)。
変位フィールド162Aは、そのコンテンツが、メモリアドレス生成の一部として使用される(たとえば、2scale*index+base+displacementを使用するアドレス生成の場合)。
変位係数フィールド162B(変位係数フィールド162Bの真上に変位フィールド162Aを並置することは、どちらか一方が使用されることを示すことに留意されたい)は、そのコンテンツが、アドレス生成の一部として使用される。これは、メモリアクセスのサイズ(N)によってスケーリングされる変位係数を指定する。ここで、Nはメモリアクセスのバイト数である(たとえば、2scale*index+base+scaled displacementを使用するアドレス生成の場合)。冗長な下位ビットは無視されるため、有効なアドレスの計算に使用される最終的な変位を生成するために、変位係数フィールドのコンテンツにメモリオペランドの合計サイズ(N)が乗算される。Nの値は、完全なオペコードフィールド174(本明細書で後述)およびデータ操作フィールド154Cに基づいて、実行時にプロセッサハードウェアによって決定される。変位フィールド162Aおよび変位係数フィールド162Bは、それらがメモリアクセスなし105の命令テンプレートに使用されないという意味でオプションであり、および/または異なる実施形態は、2つのうちの1つのみを実装するか、またはまったく実装しない。
データ要素幅フィールド164−そのコンテンツは、いくつかのデータ要素幅のうちのいずれか1つが使用されるべきかを区別する(いくつかの実施形態では、すべての命令について;他の実施形態では、いくつかの命令についてのみ)。このフィールドは、1つのデータ要素幅のみがサポートされている場合やデータ要素幅がオペコードの一部の側面を使用してサポートされている場合は不要であるという意味でオプションである。
書き込みマスクフィールド170は、そのコンテンツが、データ要素ごとの位置に基づいて、宛先ベクトルオペランド内のそのデータ要素の位置が基本演算と拡張演算の結果を反映するかどうかを制御する。クラスAの命令テンプレートはマージ書き込みマスキングをサポートし、クラスBの命令テンプレートはマージ書き込みマスキングとゼロ調整書き込みマスキングの両方をサポートする。マージする場合、ベクターマスクを使用すると、宛先の要素のセットを、演算(基本演算と拡張演算で指定)の実行中に更新から保護できる。他の一実施形態では、対応するマスクビットが0を有する宛先の各要素の古い値を保持する。対照的に、ベクトルマスクをゼロ化すると、演算(基本演算と拡張演算で指定)の実行中に宛先の要素のセットをゼロ化できる。一実施形態では、対応するマスクビットが0の値を有する場合、宛先の要素は0に設定される。この機能のサブセットは、実行される操作のベクトル長(つまり、最初から最後まで変更される要素のスパン)を制御する機能である。ただし、変更される要素が連続している必要はない。したがって、書き込みマスクフィールド170は、ロード、ストア、算術、論理などを含む部分的なベクトル演算を可能にする。書き込みマスクフィールドの170コンテンツが、使用される書き込みマスクを含むいくつかの書き込みマスクレジスタのうちの1つを選択する(したがって、書き込みマスクフィールドの170コンテンツは、実行されるマスキングを間接的に識別する)本発明の実施形態が説明されるが、代わりにまたは追加の代替の実施形態は、書き込みマスクフィールドの170コンテンツが、実行されるマスキングを直接指定することを可能にする。
イミディエートフィールド172は、そのコンテンツにより、イミディエートを指定できる。このフィールドは、イミディエートをサポートしない一般的なベクトルフレンドリー形式の実装には存在せず、イミディエートを使用しない命令には存在しないという意味でオプションである。
クラスフィールド168は、そのコンテンツが、異なるクラスの命令を区別する。図1A〜図1Bを参照すると、このフィールドのコンテンツは、クラスAとクラスBの命令から選択する。図1A〜図1Bでは、角の丸い四角を使用して、特定の値がフィールドに存在することを示している(たとえば、図1A〜図1Bのクラスフィールド168のクラスA 168AおよびクラスB 168B)。
クラスAの命令テンプレート
クラスAの非メモリアクセス105命令テンプレートの場合、アルファフィールド152は、RSフィールド152Aとして解釈され、そのコンテンツは、異なる拡張演算型のどれが実行されるべきかを区別し(たとえば、ラウンド152A.1)、データ変換152A.2は、メモリなしアクセス、ラウンド型演算110およびメモリなしアクセス、データ変換型演算115命令テンプレートに対してそれぞれ指定され、一方、ベータフィールド154は、指定された型の演算のどれが実行される。メモリアクセスなし105の命令テンプレートでは、スケールフィールド160、変位フィールド162A、および変位スケールフィールド162Bは存在しない。
メモリアクセスなしの命令テンプレート−フルラウンド制御型演算
メモリアクセスなしのフルラウンド制御型演算110の命令テンプレートでは、ベータフィールド154は、そのコンテンツが静的な丸めを提供するラウンド制御フィールド154Aとして解釈される。本発明の説明された実施形態では、ラウンド制御フィールド154Aは、すべての浮動小数点例外の抑制(SAE)フィールド156およびラウンド演算制御フィールド158を含むが、代替の実施形態は、これらの概念の両方を同じフィールドに符号化するか、1つだけ、またはこれらの他の概念/フィールド(たとえば、ラウンド演算制御フィールド158のみを有することができる)を有することができる。
SAEフィールド156は、そのコンテンツが、例外イベントレポートを無効にするかどうかを区別する。SAEフィールドの156のコンテンツが抑制が有効になっていることを示している場合、特定の命令はいかなる種類の浮動小数点例外フラグも報告せず、浮動小数点例外ハンドラを発生させない。
ラウンド演算制御フィールド158は、そのコンテンツが、丸め演算のグループのいずれか1つを実行するかを区別する(たとえば、切り上げ、切り下げ、ゼロへの丸め、および最も近い丸め)。したがって、ラウンド演算制御フィールド158は、命令ごとに丸めモードの変更を可能にする。プロセッサが丸めモードを指定するための制御レジスタを含む本発明の一実施形態では、ラウンド演算制御フィールドの150のコンテンツは、そのレジスタ値を上書きする。
メモリアクセスなしの命令テンプレート−データ変換型演算
メモリアクセスなしのデータ変換型演算115の命令テンプレートでは、ベータフィールド154は、データ変換フィールド154Bとして解釈され、そのコンテンツは、多数のデータ変換のうちのいずれか1つが実行されるべきかを区別する(たとえば、データ変換なし、スウィズル、放送)。
クラスAのメモリアクセスあり120の命令テンプレートの場合、アルファフィールド152は、エビクションヒントフィールド152Bとして解釈され、そのコンテンツは、エビクションヒントのいずれか1つが使用されるかを区別し(図1Aでは、時間152B.1および非時間的152B.2は、メモリアクセス、時間的125命令テンプレートおよびメモリアクセス、非時間的130命令テンプレートに対してそれぞれ指定される)、一方、ベータフィールド154は、データ操作フィールド154Cとして解釈され、そのコンテンツは、いずれか1つを区別するか。多数のデータ操作演算(プリミティブとも呼ばれる)が実行される(たとえば、操作なし、ブロードキャスト、ソースのアップコンバージョン、宛先のダウンコンバージョンなど)。メモリアクセス120ありの命令テンプレートは、スケールフィールド160、および任意選択で変位フィールド162Aまたは変位スケールフィールド162Bを含む。
ベクトルメモリ命令は、変換をサポートして、メモリからのベクトルロードとメモリへのベクトルストアを実行する。通常のベクトル命令と同様に、ベクトルメモリ命令はデータ要素ごとにメモリとの間でデータを転送する。実際に転送される要素は、書き込みマスクとして選択されたベクトルマスクのコンテンツによって決まる。
メモリアクセスありの命令テンプレート−一時的
一時データは、キャッシュの恩恵を受けるのに十分な時間で再利用される可能性が高いデータである。ただし、これはヒントであり、ヒントを完全に無視するなど、さまざまなプロセッサがさまざまな方法で実装する場合がある。
メモリアクセスありの命令テンプレート−非一時的
非一時データは、第1レベルのキャッシュでキャッシュすることでメリットが得られるほどすぐに再利用される可能性が低いデータであり、エビクションを優先する必要がある。ただし、これはヒントであり、ヒントを完全に無視するなど、さまざまなプロセッサがさまざまな方法で実装する場合がある。
クラスBの命令テンプレート
クラスBの命令テンプレートの場合、アルファフィールド152は、書き込みマスク制御(Z)フィールド152Cとして解釈され、そのコンテンツは、書き込みマスクフィールド170によって制御される書き込みマスキングがマージであるべきかゼロ化であるべきかを区別する。
クラスBのメモリアクセスなし105の命令テンプレートの場合、ベータフィールド154の一部は、RLフィールド157Aとして解釈され、そのコンテンツは、異なる拡張演算型のどれが実行されるべきかを区別し(たとえば、ラウンド157A.1およびベクトル長(VSIZE)157A.2は、メモリなしアクセス、書き込みマスク制御、部分ラウンド制御型演算112の命令テンプレート、およびメモリなしアクセス、書き込みマスク制御、VSIZE型演算117の命令テンプレートに対してそれぞれ指定される)、一方、ベータフィールド154の残りの部分は、指定された型の演算のどれが実行されるべきかを区別する。メモリアクセスなし105の命令テンプレートでは、スケールフィールド160、変位フィールド162A、および変位スケールフィールド162Bは存在しない。
メモリアクセスなし、書き込みマスク制御、部分ラウンド制御型演算110の命令テンプレートでは、ベータフィールド154の残りはラウンド演算制御フィールド159Aとして解釈され、例外イベント報告は無効にされる(所与の命令はいかなる種類の浮動小数点例外フラグも報告せず、浮動小数点例外ハンドラを発生させない)。
ラウンド演算制御フィールド159A−ラウンド演算制御フィールド158と同様に、そのコンテンツは、丸め演算のグループのいずれか1つを実行するかを区別する(たとえば、切り上げ、切り下げ、ゼロに丸める、最も近い丸め)。したがって、ラウンド演算制御フィールド159Aは、命令ごとに丸めモードの変更を可能にする。プロセッサが丸めモードを指定するための制御レジスタを含む本発明の一実施形態では、ラウンド演算制御フィールドの150のコンテンツは、そのレジスタ値を上書きする。
メモリアクセスなし、書き込みマスク制御、VSIZE型演算117の命令テンプレートでは、ベータフィールド154の残りはベクトル長フィールド159Bとして解釈され、そのコンテンツは、いくつかのデータベクトル長のうちのいずれか1つが実行されるかを区別する(たとえば、128、256、または512バイト)。
クラスBのメモリアクセスあり120の命令テンプレートの場合、ベータフィールド154の一部は、ブロードキャストフィールド157Bとして解釈され、そのコンテンツは、ブロードキャスト型のデータ操作演算が実行されるかどうかを区別し、残りの部分は、ベータフィールド154は、ベクトル長フィールド159Bと解釈される。メモリアクセス120ありの命令テンプレートは、スケールフィールド160、および任意選択で変位フィールド162Aまたは変位スケールフィールド162Bを含む。
汎用ベクトル向け命令フォーマット100に関して、フォーマットフィールド140、基本演算フィールド142、およびデータ要素幅フィールド164を含む完全なオペコードフィールド174が示されている。完全なオペコードフィールド174がこれらのフィールドのすべてを含む一実施形態が示されているが、完全なオペコードフィールド174は、それらのすべてをサポートしない実施形態では、これらのフィールドのすべてより少ないものを含む。完全なオペコードフィールド174は、操作コード(オペコード)を提供する。
拡張演算フィールド150、データ要素幅フィールド164、および書き込みマスクフィールド170は、これらの特徴を、汎用ベクトル向け命令フォーマットで命令ごとに指定することを可能にする。
書き込みマスクフィールドとデータ要素幅フィールドの組み合わせにより、異なるデータ要素幅に基づいてマスクを適用できるという点で、型付き命令が作成される。
クラスAとクラスBにあるさまざまな命令テンプレートは、さまざまな状況で役立つ。本発明のいくつかの実施形態では、異なるプロセッサまたはプロセッサ内の異なるコアは、クラスAのみ、クラスBのみ、または両方のクラスをサポートし得る。たとえば、汎用コンピューティングを対象とした高性能の一般的な順不同コアはクラスBのみをサポートし、主にグラフィックスおよび/または科学(スループット)コンピューティングを対象としたコアはクラスAのみをサポートし、コアは両方のために両方をサポートすることができる(もちろん、両方のクラスからのテンプレートと命令のいくつかの組み合わせを有するが、両方のクラスからのすべてのテンプレートと命令を有していないコアは本発明の範囲内にある)。また、単一のプロセッサに複数のコアが含まれる場合があり、そのすべてが同じクラスをサポートするか、異なるコアが異なるクラスをサポートする。たとえば、別個のグラフィックスと汎用コアを備えたプロセッサでは、主にグラフィックスおよび/または科学コンピューティングを目的としたグラフィックスコアの1つがクラスAのみをサポートし、汎用コアのうち1つまたは複数が、クラスBのみをサポートする汎用コンピューティングを対象としたアウトオブオーダ実行とレジスタリネーミングを使用する高性能汎用コアである場合がある。個別のグラフィックコアを持たない別のプロセッサには、クラスAおよびクラスBの両方をサポートするもう1つの汎用逐次コアまたは順不同コアが含まれる場合がある。もちろん、本発明の異なる実施形態では、1つのクラスからの特徴は、他のクラスにも実装され得る。高レベル言語で記述されたプログラムは、1)実行用のターゲットプロセッサでサポートされているクラスの命令のみを含む形式、または2)すべてのクラスの命令のさまざまな組み合わせを使用して記述された代替ルーチンを持ち、現在コードを実行しているプロセッサによってサポートされる命令に基づいて実行するルーチンを選択する制御フローコードを持つ形式、のようなさまざまな実行可能形式に変換(たとえば、ジャストインタイムコンパイルまたは静的コンパイル)される。
VEX命令フォーマット
VEX符号化では、命令に3つ以上のオペランドを含めることができ、SIMDベクトルレジスタを28ビットより長くすることができる。VEXプレフィックスを使用すると、3オペランド(またはそれ以上)の構文が提供される。たとえば、以前の2オペランドの命令は、ソースオペランドを上書きするA=A+Bなどの演算を実行した。VEXプレフィックスを使用すると、オペランドでA=B+Cなどの非破壊演算を実行できる。
図2Aは、VEXプレフィックス202、実オペコードフィールド230、Mod R/Mバイト240、SIBバイト250、変位フィールド262、およびIMM8 272を含む例示的なAVX命令フォーマットを示している。図2Bは、図2Aのどのフィールドが完全なオペコードフィールド274および基本演算フィールド241を構成するかを示している。図2Cは、図2Aのどのフィールドがレジスタインデックスフィールド244を構成するかを示している。
VEXプレフィックス(バイト0〜2)202は、3バイト形式で符号化される。第1のバイトはフォーマットフィールド290(VEXバイト0、ビット[7:0])であり、明示的なC4バイト値(C4命令フォーマットを区別するために使用される一意の値)が含まれている。第2および第3のバイト(VEXバイト1〜2)には、特定の機能を提供するいくつかのビットフィールドが含まれている。具体的には、REXフィールド205(VEXバイト1、ビット[7〜5])は、VEX.Rビットフィールド(VEXバイト1、ビット[7]〜R)、VEX.Xビットフィールド(VEXバイト1、ビット[6]〜X)、およびVEX.Bビットフィールド(VEXバイト1、ビット[5]〜B)で構成される。命令の他のフィールドは、当技術分野で知られているようにレジスタインデックスの下位3ビット(rrr、xxx、およびbbb)を符号化するので、Rrrr、Xxxx、およびBbbbは、VEX.R、VEX.X、およびVEX.Bを加えることで形成される。オペコードマップフィールド215(VEXバイト1、ビット[4:0]−mmmmm)には、暗黙の先行オペコードバイトを符号化するコンテンツが含まれている。Wフィールド264(VEXバイト2、ビット[7]−W)は、表記VEX.Wで表され、命令に応じて異なる機能を提供する。VEX.vvvv 220(VEXバイト2、ビット[6:3]−vvvv)の役割には、次のもの、すなわち、1)VEX.vvvvが、反転(1の補数)形式で指定された第1のソースレジスタオペランドを符号化し、2つ以上のソースオペランドを持つ命令に対して有効である、2)VEX.vvvvが、特定のベクトルシフトに対して1の補数形式で指定された宛先レジスタオペランドを符号化する、または3)VEX.vvvvはオペランドを符号化せず、フィールドは予約されており、1111bを含む必要がある、が含まれる。VEX.L 268サイズフィールド(VEXバイト2、ビット[2]−L)=0の場合、28ビットベクトルを示し、VEX.L=1の場合、256ビットのベクトルを示す。プレフィックス符号化フィールド225(VEXバイト2、ビット[1:0]−pp)は、基本演算フィールド241に追加のビットを提供する。
実オペコードフィールド230(バイト3)は、オペコードバイトとも呼ばれる。このフィールドでは、オペコードの一部が指定されている。
MOD R/Mフィールド240(バイト4)には、MODフィールド242(ビット[7−6])、レジスタインデックスフィールド244(ビット[5−3])、およびR/Mフィールド246(ビット[2−0])が含まれる。レジスタインデックスフィールド244の役割は、以下の、宛先レジスタオペランドまたはソースレジスタオペランド(Rrrrのrrr)のいずれかを符号化すること、またはオペコード拡張として扱われ、命令オペランドを符号化するために使用されないこと、を含み得る。R/Mフィールド246の役割は、以下の、メモリアドレスを参照する命令オペランドを符号化すること、または宛先レジスタオペランドまたはソースレジスタオペランドのいずれかを符号化すること、を含み得る。
スケール、インデックス、ベース(SIB)−スケールフィールド250(バイト5)のコンテンツには、メモリアドレスの生成に使用されるSS252(ビット[7〜6])が含まれる。SIB.xxx 254(ビット[5〜3])およびSIB.bbb 256(ビット[2〜0])のコンテンツは、レジスタインデックスXxxxおよびBbbbに関して事前に参照されている。
変位フィールド262およびイミディエートフィールド(IMM8)272は、データを含む。
例示的なレジスタアーキテクチャ
図3は、本発明の一実施形態によるレジスタアーキテクチャ300のブロック図である。図示の実施形態では、512ビット幅である32個のベクトルレジスタ310が存在する。これらのレジスタは、zmm0からzmm31として参照される。下位6つのzmmレジスタの下位256ビットは、レジスタymm0〜15に重ね合わせられる。下位6つのzmmレジスタの下位128ビット(ymmレジスタの下位128ビット)は、レジスタxmm0〜15に重ね合わされる。
汎用レジスタ325は、図示の実施形態では、メモリオペランドをアドレス指定するために既存のx86アドレス指定モードと共に使用される16個の64ビット汎用レジスタが存在する。これらのレジスタは、RAX、RBX、RCX、RDX、RBP、RSI、RDI、RSP、およびR8〜R15という名前で参照される。
スカラ浮動小数点スタックレジスタファイル(x87スタック)345は、図示の実施形態では、その上でMMXパック整数フラットレジスタファイル350のエイリアスが作成され、x87スタックは、x87命令セット拡張を使用して32/64/80ビットの浮動小数点データでスカラ浮動小数点演算を実行するために使用される8要素スタックであり、一方、MMXレジスタは、64ビットパック整数データの演算を実行するため、およびMMXレジスタとXMMレジスタ間で実行される一部の演算のオペランドを保持するために使用される。
本発明の代替の実施形態は、より広いまたはより狭いレジスタを使用することができる。さらに、本発明の代替の実施形態は、より多くの、より少ない、または異なるレジスタファイルおよびレジスタを使用することができる。
例示的なコアアーキテクチャ、プロセッサ、およびコンピュータアーキテクチャ
プロセッサコアは、さまざまな方法、さまざまな目的、さまざまなプロセッサで実装できる。たとえば、そのようなコアの実装は、以下の、1)汎用コンピューティングを目的とした汎用逐次コア、2)汎用コンピューティングを目的とした高性能の一般的な順不同コア、3)主にグラフィックスおよび/または科学(スループット)コンピューティングを目的とした特殊目的コア、を含み得る。異なるプロセッサの実装には、以下の、1)汎用コンピューティングを目的とした1つまたは複数の一般的な逐次コアおよび/または汎用コンピューティングを目的とした1つまたは複数の一般的な順不同コアを含むCPU、2)主にグラフィックスおよび/または科学(スループット)を目的とした1つまたは複数の特殊目的コアを含むコプロセッサ、が含まれ得る。このような異なるプロセッサは、1)CPUとは別のチップ上のコプロセッサ、2)CPUと同じパッケージ内の別のダイ上のコプロセッサ、3)CPUと同じダイ上のコプロセッサ(この場合、そのようなコプロセッサは、統合グラフィックスや科学(スループット)ロジックなどの特殊目的ロジック、または特殊目的コアと呼ばれることがある)、4)同じダイ上に、記載されたCPU(アプリケーションコアまたはアプリケーションプロセッサと呼ばれることもある)、上記のコプロセッサ、および追加の機能を含み得るチップ上のシステム、を含む、異なるコンピュータシステムアーキテクチャにつながる。次に、例示的なコアアーキテクチャについて説明し、続いて、例示的なプロセッサおよびコンピュータアーキテクチャについて説明する。本明細書では、例示的なコア、プロセッサなどを含む回路(ユニット)が詳述されている。
例示的なコアアーキテクチャ
図4Aは、本発明の実施形態による、例示的な逐次パイプラインおよび例示的なレジスタリネーミング、アウトオブオーダ発行/実行パイプラインの両方を示すブロック図である。図4Bは、本発明の実施形態による、逐次アーキテクチャコアの例示的な実施形態と、プロセッサに含まれる例示的なレジスタリネーミング、アウトオブオーダ発行/実行アーキテクチャコアの両方を示すブロック図である。図4A〜図4Bの実線のボックスは、逐次パイプラインと逐次コアを示し、破線のボックスのオプションの追加は、レジスタのリネーミング、アウトオブオーダ発行/実行パイプラインとコアを示している。逐次アスペクトが順不同アスペクトのサブセットであるとして、順不同アスペクトについて説明する。
図4Aでは、プロセッサパイプライン400は、フェッチステージ402、長さ復号ステージ404、復号ステージ406、割り当てステージ408、リネーミングステージ410、スケジューリング(ディスパッチまたは発行としても知られる)ステージ412、レジスタ読み取り/メモリ読み取りステージ414、実行ステージ416、書き戻し/メモリ書き込みステージ418、例外処理ステージ422、およびコミットステージ424を含む。
図4Bは、実行エンジンユニット450に結合されたフロントエンドユニット430を含むプロセッサコア490を示しており、両方ともメモリユニット470に結合されている。コア490は、縮小命令セットコンピューティング(RISC)コア、複雑な命令セットコンピューティング(CISC)コア、超長命令ワード(VLIW)コア、またはハイブリッドまたは代替コアタイプであり得る。さらに別のオプションとして、コア490は、たとえば、ネットワークまたは通信コア、圧縮エンジン、コプロセッサコア、汎用コンピューティンググラフィックス処理ユニット(GPGPU)コア、グラフィックスコアなどの専用コアであり得る。
フロントエンドユニット430は、復号ユニット440に結合された命令フェッチユニット438に結合された命令変換ルックアサイドバッファ(TLB)436に結合された命令キャッシュユニット434に結合された分岐予測ユニット432を含む。復号ユニット440(または復号部)は、命令を復号し、出力として、1つまたは複数のマイクロ操作、マイクロコードエントリポイント、マイクロ命令、他の命令、または元の命令から他の方法で復号、またはそうでなければ反射される他の制御信号を生成することができる。復号ユニット440は、さまざまな異なるメカニズムを使用して実装することができる。適切なメカニズムの例には、ルックアップテーブル、ハードウェア実装、プログラマブルロジックアレイ(PLA)、マイクロコード読み取り専用メモリ(ROM)などが含まれるが、これらに限定されない。一実施形態では、コア490は、特定のマクロ命令のためのマイクロコードを格納するマイクロコードROMまたは他の媒体を含む(たとえば、復号ユニット440内またはそうでなければフロントエンドユニット430内に)。復号ユニット440は、実行エンジンユニット450内のリネーミング/アロケータユニット452に結合されている。
実行エンジンユニット450は、リタイアメントユニット454および1つまたは複数のスケジューラユニット456のセットに結合されたリネーミング/アロケータユニット452を含む。スケジューラユニット456は、予約ステーション、中央命令ウィンドウなどを含む、任意の数の異なるスケジューラを表す。スケジューラユニット456は、物理レジスタファイルユニット458に結合されている。物理レジスタファイルユニット458のそれぞれは、1つまたは複数の物理レジスタファイルを表し、その異なるファイルは、スカラ整数、スカラ浮動小数点、パック整数、パック浮動小数点、ベクトル整数、ベクトル浮動小数点、ステータス(たとえば、次に実行される命令のアドレスである命令ポインタ)などの1つまたは複数の異なるデータ形式を格納する。一実施形態では、物理レジスタファイルユニット458は、ベクトルレジスタユニットおよびスカラレジスタユニットを含む。これらのレジスタユニットは、アーキテクチャベクトルレジスタ、ベクトルマスクレジスタ、および汎用レジスタを提供する場合がある。物理レジスタファイルユニット458は、レジスタのリネーミングおよびアウトオブオーダ実行を実装することができるさまざまな方法を示すために、リタイアメントユニット454とオーバーラップしている(たとえば、リオーダバッファおよびリタイアメントレジスタファイルを使用する、将来のファイル、履歴バッファ、およびリタイアメントレジスタファイルを使用する、レジスタマップとレジスタのプールを使用する、など)。リタイアメントユニット454および物理レジスタファイルユニット458は、実行クラスタ460に結合されている。実行クラスタ460は、1つまたは複数の実行ユニット462のセットおよび1つまたは複数のメモリアクセスユニット464のセットを含む。実行ユニット462は、さまざまな操作(たとえば、シフト、加算、減算、乗算)およびさまざまなタイプのデータ(たとえば、スカラ浮動小数点、パック整数、パック浮動小数点、ベクトル整数、ベクトル浮動小数点)に対して実行することができる。いくつかの実施形態は、特定の機能または機能のセット専用のいくつかの実行ユニットを含み得るが、他の実施形態は、すべてがすべての機能を実行する1つの実行ユニットまたは複数の実行ユニットのみを含み得る。特定の実施形態が特定のタイプのデータ/演算のために別個のパイプラインを作成するため、スケジューラユニット456、物理レジスタファイルユニット458、および実行クラスタ460は、おそらく複数であるとして示されている(たとえば、スカラ整数パイプライン、スカラ浮動小数点/パック整数/パック浮動小数点/ベクトル整数/ベクトル浮動小数点パイプライン、および/またはそれぞれ独自のスケジューラユニット、物理レジスタファイルユニット、および/またはメモリアクセスパイプライン実行クラスタ−および別個のメモリアクセスパイプラインの場合、このパイプラインの実行クラスタのみがメモリアクセスユニット464を有する特定の実施形態が実装される)。別々のパイプラインが使用されている場合、これらのパイプラインのうち1つまたは複数がアウトオブオーダ発行/実行であり、残りが順不同である可能性があることも理解する必要がある。
メモリアクセスユニット464のセットは、メモリユニット470に結合され、メモリユニット470は、レベル2(L2)キャッシュユニット476に結合されたデータキャッシュユニット474に結合されたデータTLBユニット472を含む。例示的な一実施形態では、メモリアクセスユニット464は、ロードユニット、ストアアドレスユニット、およびストアデータユニットを含み得、これらのそれぞれは、メモリユニット470内のデータTLBユニット472に結合される。命令キャッシュユニット434は、メモリユニット470内のレベル2(L2)キャッシュユニット476にさらに結合されている。L2キャッシュユニット476は、1つまたは複数の他のレベルのキャッシュに結合され、最終的にはメインメモリに結合される。
例として、例示的なレジスタリネーミング、アウトオブオーダ発行/実行コアアーキテクチャは、パイプライン400を以下のように実装することができ、1)命令フェッチ438は、フェッチおよび長さ復号ステージ402および404を実行し、2)復号ユニット440は、復号ステージ406を実行し、3)リネーミング/アロケータユニット452は、割り当てステージ408およびリネーミングステージ410を実行し、4)スケジューラユニット456は、スケジュールステージ412を実行し、5)物理レジスタファイルユニット458およびメモリユニット470は、レジスタ読み取り/メモリ読み取りステージ414を実行し、実行クラスタ460は、実行ステージ416を実行し、6)メモリユニット470および物理レジスタファイルユニット458は、書き戻し/メモリ書き込みステージ418を実行し、7)さまざまなユニットが例外処理ステージ422に関与し得、8)リタイアメントユニット454および物理レジスタファイルユニット458は、コミットステージ424を実行する。
コア490は、本明細書に記載されている命令を含む、1つまたは複数の命令セット(たとえば、x86命令セット(新しいバージョンで追加されたいくつかの拡張を含む)、カリフォルニア州サニーベールのMIPS TechnologiesのMIPS命令セット、カリフォルニア州サニーベールのARM Holdingsの(NEONなどのオプションの追加拡張機能を含む)ARM命令セット)をサポートし得る。一実施形態では、コア490は、パックドデータ命令セット拡張(たとえば、AVX1、AVX2)をサポートするロジックを含み、それによって、パックドデータを使用して多くのマルチメディアアプリケーションによって使用される操作を実行できるようにする。
コアがマルチスレッド(2つ以上の並列セットの操作またはスレッドを実行する)をサポートする場合があり、タイムスライスマルチスレッド、同時マルチスレッディング(単一の物理コアが、物理コアが同時にマルチスレッド化されている各スレッドに論理コアを提供する場合)、またはそれらの組み合わせ(たとえば、タイムスライスされたフェッチと復号、およびその後のインテル(登録商標)ハイパースレッディングテクノロジーなどの同時マルチスレッディング)を含むさまざまな方法でサポートする場合があることを理解する必要がある。
レジスタのリネーミングはアウトオブオーダ実行の文脈で説明されているが、レジスタのリネーミングは逐次アーキテクチャで使用される場合があることを理解する必要がある。プロセッサの図示された実施形態はまた、別個の命令およびデータキャッシュユニット434/474および共有L2キャッシュユニット476を含むが、代替の実施形態は、たとえば、レベル1(L1)内部キャッシュ、または複数レベルの内部キャッシュのような、命令およびデータの両方のための単一の内部キャッシュを有し得る。いくつかの実施形態では、システムは、コアおよび/またはプロセッサの外部にある内部キャッシュと外部キャッシュとの組み合わせを含み得る。あるいは、すべてのキャッシュがコアおよび/またはプロセッサの外部にある場合がある。
特定の例示的な逐次コアアーキテクチャ
図5A〜図5Bは、より具体的な例示的な逐次コアアーキテクチャのブロック図を示しており、このコアは、チップ内のいくつかのロジックブロック(同じタイプおよび/または異なるタイプの他のコアを含む)の1つである。ロジックブロックは、アプリケーションに応じて、高帯域幅の相互接続ネットワーク(たとえば、リングネットワーク)を介して、いくつかの固定機能ロジック、メモリI/Oインターフェース、およびその他の必要なI/Oロジックと通信する。
図5Aは、本発明の実施形態による、オンダイ相互接続ネットワーク502への接続、およびレベル2(L2)キャッシュ504のそのローカルサブセットを伴う、単一プロセッサコアのブロック図である。一実施形態では、命令復号部500は、パックされたデータ命令セット拡張を備えたx86命令セットをサポートする。L1キャッシュ506は、メモリをスカラおよびベクトルユニットにキャッシュするための低待ち時間アクセスを可能にする。一実施形態(設計を単純化するため)では、スカラユニット508およびベクトルユニット510は、別個のレジスタセット(それぞれ、スカラレジスタ512およびベクトルレジスタ514)を使用し、それらの間で転送されるデータは、メモリに書き込まれ、次に、レベル1(L1)キャッシュ506、本発明の代替の実施形態は、異なるアプローチを使用することができる(たとえば、単一のレジスタセットを使用するか、またはデータを書き込みおよび読み出しせずに2つのレジスタファイル間で転送できるようにする通信パスを含む)。
L2キャッシュ504のローカルサブセットは、プロセッサコアごとに1つずつ、別個のローカルサブセットに分割されるグローバルL2キャッシュの一部である。各プロセッサコアは、L2キャッシュ504のそれ自身のローカルサブセットへの直接アクセスパスを有する。プロセッサコアによって読み取られたデータは、そのL2キャッシュサブセット504に格納され、他のプロセッサコアがそれら自身のローカルL2キャッシュサブセットにアクセスするのと並行して、迅速にアクセスすることができる。プロセッサコアによって書き込まれたデータは、それ自体のL2キャッシュサブセット504に格納され、必要に応じて、他のサブセットからフラッシュされる。リングネットワークは、共有データの一貫性を保証する。リングネットワークは双方向であるため、プロセッサコア、L2キャッシュ、その他のロジックブロックなどのエージェントがチップ内で相互に通信できる。いくつかの実施形態では、各リングデータパスは、方向ごとに1024ビット幅である。
図5Bは、本発明の実施形態による、図5Aのプロセッサコアの一部の拡大図である。図5Bは、L1キャッシュ504のL1データキャッシュ506Aの一部、ならびにベクトルユニット510およびベクトルレジスタ514に関するより詳細な情報を含む。具体的には、ベクトルユニット510は、整数、単精度浮動小数点数、および倍精度浮動小数点数のうち1つまたは複数の命令を実行する6幅のベクトル処理ユニット(VPU)(16幅のALU 528を参照)である。VPUは、スウィズルユニット520でのレジスタ入力のスウィズリング、数値変換ユニット522A〜522Bでの数値変換、およびメモリ入力上の複製ユニット524での複製をサポートする。
統合されたメモリコントローラおよびグラフィックスを備えたプロセッサ
図6は、本発明の実施形態による、1つよりも多いコアを有し得、統合メモリコントローラを有し得、統合グラフィックスを有し得るプロセッサ600のブロック図である。図6の実線のボックスは、シングルコア602A、システムエージェント610、1つまたは複数のバスコントローラユニット616のセットを備えたプロセッサ600を示し、破線のボックスのオプションの追加は、複数のコア602A〜602N、システムエージェントユニット610内の1つまたは複数の統合メモリコントローラユニット614のセット、および特殊目的ロジック608を備えた代替プロセッサ600を示している。
したがって、プロセッサ600の異なる実装は、1)統合されたグラフィックスおよび/または科学的(スループット)論理(1つまたは複数のコアを含み得る)である特殊目的ロジック608を有するCPU、および1つまたは複数の汎用コアであるコア602A〜602N(たとえば、汎用逐次コア、汎用順不同コア、2つの組み合わせ)、2)コア602A〜602Nが、主にグラフィックスおよび/または科学(スループット)を目的とした多数の特殊目的コアであるコプロセッサ、3)コア602A〜602Nが多数の汎用逐次コアであるコプロセッサ、を含み得る。したがって、プロセッサ600は、たとえば、ネットワークまたは通信プロセッサ、圧縮エンジン、グラフィックプロセッサ、GPGPU(汎用グラフィック処理ユニット)、スループットの高い統合コア(MIC)コプロセッサ(30以上のコアを含む)、組み込みプロセッサなどの汎用プロセッサ、コプロセッサ、または特殊目的プロセッサであり得る。プロセッサは、1つまたは複数のチップ上に実装され得る。プロセッサ600は、たとえば、BiCMOS、CMOS、またはNMOSなどのいくつかのプロセス技術のいずれかを使用して、1つまたは複数の基板の一部であり得、および/または実装され得る。
メモリ階層は、コア604A〜604N内の1つまたは複数のレベルのキャッシュ、セットまたは1つまたは複数の共有キャッシュユニット606、および統合メモリコントローラユニット614のセットに結合された外部メモリ(図示せず)を含む。共有キャッシュユニット606のセットは、レベル2(L2)、レベル3(L3)、レベル4(L4)、または他のレベルのキャッシュ、最後のレベルのキャッシュ(LLC)などの1つまたは複数の中間レベルのキャッシュ、および/またはそれらの組み合わせを含み得る。一実施形態では、リングベースの相互接続ユニット612は、統合グラフィックスロジック608、共有キャッシュユニットのセット606、およびシステムエージェントユニット610/統合メモリコントローラユニット614を相互接続するが、代替の実施形態は、任意の数のそのようなユニットを相互接続するための既知の技術を使用することができる。一実施形態では、コヒーレンシは、1つまたは複数のキャッシュユニット606とコア602A〜602Nとの間で維持される。
いくつかの実施形態では、コア602A〜602Nのうち1つまたは複数は、マルチスレッド化が可能である。システムエージェント610は、コア602A〜602Nを調整および動作するこれらのコンポーネントを含む。システムエージェントユニット610は、たとえば、電力制御ユニット(PCU)およびディスプレイユニットを含み得る。PCUは、コア602A〜602Nおよび統合グラフィックスロジック608の電力状態を調整するために必要なロジックおよびコンポーネントであり得るか、またはそれらを含み得る。ディスプレイユニットは、1つまたは複数の外部接続されたディスプレイを駆動するためのものである。
コア602A〜602Nは、アーキテクチャ命令セットに関して同種または異種であり得る。すなわち、2つ以上のコア602A〜602Nは、同じ命令セットを実行することができ、一方、他のコアは、その命令セットのサブセットまたは異なる命令セットのみを実行することができる場合がある。
例示的なコンピュータアーキテクチャ
図7〜図10は、例示的なコンピュータアーキテクチャのブロック図である。ラップトップ、デスクトップ、ハンドヘルドPC、携帯情報端末、エンジニアリングワークステーション、サーバ、ネットワークデバイス、ネットワークハブ、スイッチ、組み込みプロセッサ、デジタルシグナルプロセッサ(DSP)、グラフィックスデバイス、ビデオゲームデバイス向けのその他のシステム設計と構成、セットトップボックス、マイクロコントローラ、携帯電話、携帯情報端末、ハンドヘルドデバイス、およびその他のさまざまな電子デバイスも適している。一般に、本明細書に開示されるようなプロセッサおよび/または他の実行ロジックを組み込むことができる多種多様なシステムまたは電子デバイスが一般的に適切である。
ここで図7を参照すると、本発明の一実施形態によるシステム700のブロック図が示されている。システム700は、コントローラハブ720に結合された1つまたは複数のプロセッサ710、715を含み得る。一実施形態では、コントローラハブ720は、グラフィックスメモリコントローラハブ(GMCH)790および入力/出力ハブ(IOH)750(これらは別個のチップ上にあり得る)を含み、GMCH 790は、メモリ740およびコプロセッサ745が結合されたメモリおよびグラフィックスコントローラを含み、IOH 750は、入力/出力(I/O)デバイス760をGMCH 790に結合する。あるいは、メモリおよびグラフィックスコントローラの一方または両方がプロセッサ内に統合され(本明細書で説明されるように)、メモリ740およびコプロセッサ745は、プロセッサ710に直接結合され、コントローラハブ720は、IOH 750を備えた単一チップである。
追加のプロセッサ715のオプションの性質は、図7に破線で示されている。各プロセッサ710、715は、本明細書に記載の処理コアのうち1つまたは複数を含み得、プロセッサ600のいくつかのバージョンであり得る。
メモリ740は、たとえば、ダイナミックランダムアクセスメモリ(DRAM)、相変化メモリ(PCM)、またはその2つの組み合わせであり得る。少なくとも1つの実施形態では、コントローラハブ720は、フロントサイドバス(FSB)、ポイントツーポイントインターフェース、または同様の接続795などのマルチドロップバスを介してプロセッサ710、715と通信する。
一実施形態では、コプロセッサ745は、たとえば、高スループットMICプロセッサ、ネットワークまたは通信プロセッサ、圧縮エンジン、グラフィックプロセッサ、GPGPU、組み込みプロセッサなどのような特殊用途のプロセッサである。一実施形態では、コントローラハブ720は、統合されたグラフィックアクセラレータを含み得る。
物理的リソース710、7155の間には、建築的、マイクロアーキテクチャ的、熱的、電力消費特性などを含むメリットの測定基準のスペクトルに関してさまざまな違いがあり得る。
一実施形態では、プロセッサ710は、一般的なタイプのデータ処理操作を制御する命令を実行する。命令内に埋め込まれているのは、コプロセッサ命令である。プロセッサ710は、これらのコプロセッサ命令を、接続されたコプロセッサ745によって実行されるべきタイプのものとして認識する。したがって、プロセッサ710は、コプロセッサバスまたは他の相互接続上でこれらのコプロセッサ命令(またはコプロセッサ命令を表す制御信号)をコプロセッサ745に発行する。コプロセッサ745は、受信したコプロセッサ命令を受け入れて実行する。
ここで図8を参照すると、本発明の実施形態による第1のより具体的な例示的なシステム800のブロック図が示されている。図8に示されるように、マルチプロセッサシステム800は、ポイントツーポイント相互接続システムであり、ポイントツーポイント相互接続850を介して結合された第1のプロセッサ870および第2のプロセッサ880を含む。プロセッサ870および880のそれぞれは、プロセッサ600のいくつかのバージョンであり得る。本発明の一実施形態では、プロセッサ870および880はそれぞれプロセッサ710および715であり、コプロセッサ838はコプロセッサ745である。別の実施形態では、プロセッサ870および880は、それぞれ、プロセッサ710コプロセッサ745である。
統合メモリコントローラ(IMC)ユニット872および882をそれぞれ含むプロセッサ870および880が示されている。プロセッサ870はまた、そのバスコントローラユニットの一部として、ポイントツーポイント(P−P)インターフェース876および878を含む。同様に、第2のプロセッサ880は、P−Pインターフェース886および888を含む。プロセッサ870、880は、P−Pインターフェース回路878、888を使用して、ポイントツーポイント(P−P)インターフェース850を介して情報を交換することができる。図8に示されるように、IMC 872および882は、プロセッサをそれぞれのメモリ、すなわち、メモリ832およびメモリ834に結合し、これらは、それぞれのプロセッサにローカルに接続されたメインメモリの一部であり得る。
プロセッサ870、880はそれぞれ、ポイントツーポイントインターフェース回路876、894、886、898を使用して、個々のP−Pインターフェース852、854を介してチップセット890と情報を交換することができる。チップセット890は、任意選択で、高性能インターフェース892を介してコプロセッサ838と情報を交換することができる。一実施形態では、コプロセッサ838は、たとえば、高スループットMICプロセッサ、ネットワークまたは通信プロセッサ、圧縮エンジン、グラフィックプロセッサ、GPGPU、組み込みプロセッサなどのような特殊用途のプロセッサである。
共有キャッシュ(図示せず)は、プロセッサのいずれかに含まれるか、両方のプロセッサの外部に含まれ、P−P相互接続を介してプロセッサに接続され、プロセッサが低電力モードに置かれている場合、いずれかまたは両方のプロセッサのローカルキャッシュ情報が共有キャッシュに格納される。
チップセット890は、インターフェース896を介して第1のバス816に結合され得る。一実施形態では、第1のバス816は、ペリフェラルコンポーネント相互接続(PCI)バス、またはPCI Expressバスまたは別のI/O相互接続バスなどのバスであり得るが、本発明の範囲はそのように限定されない。
図8に示されるように、さまざまなI/Oデバイス814は、第1のバス816を第2のバス820に結合するバスブリッジ818とともに、第1のバス816に結合され得る。一実施形態では、コプロセッサ、ハイスループットMICプロセッサ、GPGPU、アクセラレータ(たとえば、グラフィックアクセラレータまたはデジタル信号処理(DSP)ユニットなど)、フィールドプログラマブルゲートアレイなどの1つまたは複数の追加のプロセッサ815、または他の任意のプロセッサは、第1のバス816に結合されている。一実施形態では、第2のバス820は、低ピン数(LPC)バスであり得る。一実施形態では、さまざまなデバイスが、たとえば、キーボードおよび/またはマウス822、通信デバイス827、およびディスクドライブまたは命令/コードおよびデータ830を含み得る他の大容量記憶装置などの記憶装置828を含む第2のバス820に結合され得る。さらに、オーディオI/O 824は、第2のバス816に結合され得る。他のアーキテクチャも可能であることに注意されたい。たとえば、図8のポイントツーポイントアーキテクチャの代わりに、システムはマルチドロップバスまたは他のそのようなアーキテクチャを実装する場合がある。
ここで図9を参照すると、本発明の実施形態による、第2のより具体的な例示的なシステム900のブロック図が示されている。図8および図9の同様の要素には同様の参照番号が付いており、図9の他の側面を曖昧にしないように、図8の特定の側面は図9から省略されている。
図9は、プロセッサ870、880が、それぞれ、統合メモリおよびI/O制御ロジック(「CL」)972および982を含み得ることを示している。したがって、CL 972、982は、統合メモリコントローラユニットを含み、I/O制御ロジックを含む。図9は、メモリ832、834がCL 872、882に結合されているだけでなく、I/Oデバイス914も制御論理872、882に結合されていることを示している。レガシーI/Oデバイス915は、チップセット890に結合されている。
ここで図10を参照すると、本発明の実施形態によるSoC 1000のブロック図が示されている。図6の同様の要素には、同様の参照番号が付いている。また、破線のボックスは、より高度なSoCのオプション機能である。図10では、相互接続ユニット1002は、1つまたは複数のコア102A〜102N、キャッシュユニット604A〜604N、および共有キャッシュユニット606のセットを含むアプリケーションプロセッサ1010、システムエージェントユニット610、バスコントローラユニット616、統合メモリコントローラユニット614、統合グラフィックスロジック、画像プロセッサ、オーディオプロセッサ、およびビデオプロセッサを含み得るセットまたは1つまたは複数のコプロセッサ1020、スタティックランダムアクセスメモリ(SRAM)ユニット1030、ダイレクトメモリアクセス(DMA)ユニット1032、1つまたは複数の外部ディスプレイに結合するためのディスプレイユニット1040、に結合されている。一実施形態では、コプロセッサ1020は、たとえば、ネットワークまたは通信プロセッサ、圧縮エンジン、GPGPU、ハイスループットMICプロセッサ、組み込みプロセッサなどのような特殊目的プロセッサを含む。
本明細書に開示されるメカニズムの実施形態は、ハードウェア、ソフトウェア、ファームウェア、またはそのような実装アプローチの組み合わせで実装され得る。本発明の実施形態は、少なくとも1つのプロセッサ、記憶システム(揮発性および不揮発性メモリおよび/または記憶要素を含む)、少なくとも1つの入力デバイス、および少なくとも1つの出力デバイスを含むプログラム可能なシステム上で実行されるコンピュータプログラムまたはプログラムコードとして実装され得る。
図8に示されるコード830などのプログラムコードは、本明細書で説明される機能を実行し、出力情報を生成するための入力命令に適用され得る。出力情報は、既知の方法で1つまたは複数の出力デバイスに適用することができる。このアプリケーションの目的のために、処理システムは、たとえば、デジタルシグナルプロセッサ(DSP)、マイクロコントローラ、特定用途向け集積回路(ASIC)、またはマイクロプロセッサのようなプロセッサを有する任意のシステムを含む。
プログラムコードは、処理システムと通信するために、高レベルの手続き型またはオブジェクト指向プログラミング言語で実装することができる。プログラムコードは、必要に応じて、アセンブリ言語または機械語で実装することもできる。実際、ここで説明するメカニズムは、特定のプログラミング言語に範囲が限定されていない。いずれの場合も、言語はコンパイル済みまたはインタープリタ型言語である可能性がある。
少なくとも1つの実施形態の1つまたは複数の態様は、プロセッサ内のさまざまなロジックを表す機械可読媒体に格納された代表的な命令によって実装され得、機械によって読み取られると、機械は、本明細書に記載の技術を実行するロジックを製造する。「IPコア」として知られるこのような表現は、有形の機械可読媒体に格納され、さまざまな顧客または製造施設に供給されて、実際にロジックまたはプロセッサを製造する製造機械にロードされる。
このような機械可読記憶媒体には、ハードディスクなどの記憶媒体、フロッピーディスク、光ディスク、コンパクトディスク読み取り専用メモリ(CD−ROM)、コンパクトディスク書き換え可能(CD−RW)、および磁気光学ディスクを含む他のタイプのディスク、読み取り専用メモリ(ROM)などの半導体デバイス、ダイナミックランダムアクセスメモリ(DRAM)などのランダムアクセスメモリ(RAM)、スタティックランダムアクセスメモリ(SRAM)、消去可能プログラマブル読み取り専用メモリ(EPROM)、フラッシュメモリ、電気的消去可能プログラマブル読み取り専用メモリ(EEPROM)、位相変化メモリ(PCM)、磁気カードまたは光学カード、またはその他電子命令を格納するのに適した他のタイプの媒体を含む、機械またはデバイスによって製造または形成された物品の非一時的で有形の配置が含まれ得るが、これらに限定されない。
したがって、本発明の実施形態は、本明細書に記載の構造、回路、装置、プロセッサ、および/またはシステム機能を定義する、命令を含むか、またはハードウェア記述言語(HDL)などの設計データを含む、非一時的で有形の機械可読媒体も含む。このような実施形態は、プログラム製品と呼ばれることもある。
エミュレーション(バイナリ変換、コードモーフィングなどを含む)
場合によっては、命令変換器を使用して、命令をソース命令セットからターゲット命令セットに変換することができる。たとえば、命令変換器は、(たとえば、静的バイナリ変換、動的コンパイルを含む動的バイナリ変換を使用して)変換、変形、エミュレート、またはコアによって処理される1つまたは複数の他の命令に命令を変換することができる。命令変換器は、ソフトウェア、ハードウェア、ファームウェア、またはそれらの組み合わせで実装することができる。命令変換器は、オンプロセッサ、オフプロセッサ、または一部オンおよび一部オフプロセッサであり得る。
図11は、本発明の実施形態による、ソース命令セット内のバイナリ命令をターゲット命令セット内のバイナリ命令に変換するためのソフトウェア命令変換器の使用を対比するブロック図である。図示の実施形態では、命令変換器はソフトウェア命令変換器であるが、代替として、命令変換器は、ソフトウェア、ファームウェア、ハードウェア、またはそれらのさまざまな組み合わせで実装され得る。図11は、高レベル言語1102のプログラムが、第1のコンパイラ1104を使用してコンパイルされて、少なくとも1つの第1の命令セットコア1116を有するプロセッサによってネイティブに実行され得る第1のバイナリコード(たとえば、x86)1106を生成し得ることを示す。いくつかの実施形態では、少なくとも1つの第1の命令セットコア1116を備えたプロセッサは、(1)の実質的な部分を互換的に実行または処理することによって、少なくとも1つのx86命令セットコアを備えたインテルプロセッサと実質的に同じ機能を実行できる任意のプロセッサを表す。インテルプロセッサと実質的に同じ結果を達成するために、インテルx86命令セットコアの命令セットまたは(2)少なくとも1つのx86命令セットコアを備えたインテルプロセッサで実行することを目的としたアプリケーションまたはその他のソフトウェアのオブジェクトコードバージョン少なくとも1つのx86命令セットコアを備えている。第1のコンパイラ1104は、追加のリンケージ処理の有無にかかわらず、少なくとも1つの第1の命令セットコア1116を備えたプロセッサ上で実行できる第1の命令セットのバイナリコード1106(たとえば、オブジェクトコード)を生成するように動作可能なコンパイラを表す。同様に、図11は、高レベル言語1102のプログラムが、代替命令セットコンパイラ1108を使用してコンパイルされて、少なくとも1つの第1の命令セットコア1114(たとえば、カリフォルニア州サニーベールのMIPSテクノロジーのMIPS命令セットを実行するコアおよび/またはカリフォルニア州サニーベールのARMホールディングスのARM命令セットを実行するコアを備えたプロセッサ)なしでプロセッサによってネイティブに実行され得る代替命令セットバイナリコード1110を生成し得ることを示す。命令変換器1112は、第1のバイナリコード1106を、第1の命令セットコア1114なしでプロセッサによってネイティブに実行され得るコードに変換するために使用される。この変換されたコードは、これが可能な命令変換器を作成するのが難しいため、代替の命令セットバイナリコード1110と同じである可能性は低い。ただし、変換されたコードは一般的な操作を実行し、代替命令セットからの命令で構成される。したがって、命令変換器1112は、エミュレーション、シミュレーション、または他の任意のプロセスを通じて、第1の命令セットプロセッサまたはコアを持たないプロセッサまたは他の電子デバイスが第1のバイナリコード1106を実行することを可能にするソフトウェア、ファームウェア、ハードウェア、またはそれらの組み合わせを表す。
シャドウスタックを効率的に管理および処理するための装置および方法
本発明の一実施形態は、トークンメカニズムの基礎となるセキュリティ特性を保持しながら、シャドウスタックポインタ(SSP)を妥当性確認するために使用されるトークンの検証のためのアトミック操作を回避する技術を実装する。さらに、特定の実施形態は、効率的なトークン検証アーキテクチャをサポートするための仮想化拡張を含む。
多くの場合、x86アーキテクチャなどの命令セットアーキテクチャ(ISA)は、命令を実行できる複数の特権レベルを提供する。特権レベルは、信頼性の低いエンティティによる直接アクセスからリソースを保護することにより、ハードウェアプラットフォームに関連付けられたオペレーティングシステム(たとえば、カーネル)の信頼性を向上させるために使用される。いくつかの実施形態では、これらの特権レベルは、最も信頼できる特権レベルであるリング0(たとえば、スーパーバイザモード)から、リング3、または非特権レベル(たとえば、アプリケーションまたはユーザモード)までの範囲である。各特権レベルでは、新しい特権レベルへのリング遷移時に後で使用できるように、いくつかのリソースを事前に割り当てて保存する必要がある。
プロセッサの現在の特権レベルが命令の実行を制御する。プロセッサは、現在の特権レベルを変更して、アプリケーションによるシステムレジスタ、システム命令、指定されたシステムメモリ領域などのシステムリソースへのアクセスを制御できる。アプリケーションを実行する際に、プロセッサは、実行された命令の制御フローを指示するために、データ(たとえば、パラメータおよびサブルーチンに渡される他のデータなど)および制御情報の両方を格納するデータスタックを利用する。通常、制御情報には、呼び出された手順が完了したときに制御フローが戻る1つまたは複数のリターンアドレスが含まれる。
リターン指向プログラミング(Return−Oriented Programming:ROP)攻撃では、攻撃者はデータスタックの制御を取得して、プログラムの制御フローを乗っ取ろうとする。たとえば、攻撃者は、データスタックに格納されている手順のリターンアドレスの不正なスタック変更を実行する可能性がある。不正なスタック変更は、現在のプロセスの制御フローを任意のメモリ位置に迂回させて、ハッキングの目標を推進するために使用される。データスタックをROPやその他のタイプの制御フロー転覆攻撃に対してより脆弱にする1つの要因は、スタックが一般にデータと制御情報の両方を格納するため、データスタックをソフトウェアで書き込み可能にする必要があることである。データスタックをこのような攻撃に対してより脆弱にする他の要因は、データスタックの切り替えが一般に非特権操作として実行されることである。
一部のイベント(たとえば、割り込み/例外)に応答して、プロセッサは、そのイベントを処理するために必要なリソースにアクセスするために、非特権ユーザレベルで実行される一連の命令の制御をスーパーバイザ特権レベルに移す場合がある。上記のこれらの要因は、スタックポインタおよび/または制御フロー情報(たとえば、リターンアドレス)の変更(たとえば、マルウェア/攻撃者の制御メモリを指す)を可能にする悪用されたバグのために、制御フロー破壊攻撃へのシステムの露出を増加させる傾向がある。
本発明の実施形態は、特権転送に対する制御フロー破壊攻撃からスタックを保護するための技術を含む。一実施形態では、データスタック上の制御情報を改ざんの試みから保護するために、いくつかの「シャドウ」スタックが提供される。本明細書で使用される場合、シャドウスタックは、データスタックとは別の第2のスタックであり、制御転送操作で使用されるデータスタックからの情報を格納および保護するために使用される。たとえば、シャドウスタックは、制御情報を格納できるが、データは格納できない(たとえば、ユーザレベルのアプリケーションプログラムが書き込みおよび変更するスタックに格納されているタイプのパラメータやその他のデータは格納できない)。
いくつかの実施形態では、シャドウスタックは、制御転送操作とフロー(たとえば、割り込み/例外配信)を実行する「CALL」(データスタックを使用するメカニズムを呼び出す手順の例である)および「FAR CALL」(マイクロ分岐およびマクロ分岐ジャンプ命令の両方を実装する分岐命令の例である)などの特定の命令によってのみ書き込むことができる。このような状況では、シャドウスタックは、1回の操作で複数のバイトを転送する「MOV」や文脈状態をメモリに格納するために使用される「XSAVE」など、他の命令を介して他のソフトウェア開始ストアで書き込むことができない場合がある。文脈状態をメモリからプロセッサのレジスタに復元する。この書き込み保護は、ページテーブルのシャドウスタックに使用されるメモリをシャドウスタックメモリとしてマークし、「MOV」、「XSAVE」などの命令を使用してソフトウェアによって開始されたストアが完了せず、障害が発生しないようにすることで実現される。同様に、「CALL」などの命令は、シャドウスタックメモリを対象としたストア命令を生成するときに、ストアが実行されるメモリがページテーブルでシャドウスタックメモリとしてマークされている場合にのみ完了するように、特定のストア操作を使用する。そうしないと、障害が発生する。
いくつかの実施形態では、シャドウスタックは、任意選択で、非特権ユーザレベルモード(たとえば、リング3特権レベル)または特権またはスーパーバイザ特権レベルモード(リング0、リング1、またはリング2の特権レベル)で個別に動作するように構成され得る。ソース特権レベルから新しい特権レベルへの特権スイッチでのシャドウスタックの切り替えをサポートするために、1つの実装には各特権レベルに関連付けられたレジスタが含まれている。
いくつかの実施形態では、システムソフトウェア(たとえば、システムカーネルまたはオペレーティングシステム)は、シャドウスタックポインタ(SSP)を各特権レベルで1つまたは複数のレジスタにロードする。次に、プロセッサは、新しい特権レベルに関連付けられたレジスタを介してSSPにアクセスし、その特権レベルのシャドウスタックを識別する。動作中、プロセッサが新しい特権レベルのSSPを選択すると、プロセッサは新しいレベルでプロセッサが使用するSSPを妥当性確認/検証する。妥当性確認が成功すると、プロセッサはシャドウスタックを新しい特権レベルでビジーとして設定し、ソース特権レベルのリターンアドレス情報をシャドウスタックにプッシュする。その後、本開示の実施形態は、シャドウスタックがビジーではないとマークされる前に、プロセッサがソース特権レベルに戻る遷移が検証されることを保証する。この検証には、シャドウスタックにプッシュされたソース特権レベルのリターンアドレスが、データスタックに関連付けられている現在のアドレスと一致することの確認が含まれる。この検証を実行するために、プロセッサは特定のロード操作(たとえば、「shadowStackPop」またはシャドウスタックセマンティクスを使用したロード)を使用して、ロード操作がページテーブルでシャドウスタックメモリとしてマークされたメモリに対して行われない場合、このロードは完了されない(たとえば、障害状態を生成する)。したがって、シャドウスタックポインタを非シャドウスタックメモリに向けようとする試みはすべて検出され、防止される。
他の実施形態では、本明細書に記載の技術は、たとえば、割り込み/例外配信の一部として、またはソース特権レベルの現在のタスクから新しい特権レベルの新しいタスクへのタスク切り替えの一部としてシャドウスタック切り替えを保護するために使用され得、シャドウスタックを使用して高速システムコール(たとえば、ユーザモードの特権をハードウェア権限を完全に制御するモードに移行)を実行し、特権の低いプロセスからの攻撃など、クロススレッド攻撃からシャドウスタックを保護し、より特権的なプロセス、およびリング遷移中のシャドウスタックを、攻撃者が採用した他のタイプの不正なスタック変更から保護する。
図12は、一実施形態による、リング遷移中にスタックを保護するためのプロセッサ拡張をサポートするための処理デバイスのブロック図を示す。処理デバイスは、一般に「プロセッサ」または「CPU」と呼ばれることがある。ここでの「プロセッサ」または「CPU」とは、算術演算、論理演算、またはI/O演算を符号化する命令を実行できるデバイスを指す。一例では、プロセッサは、算術論理演算装置(ALU)、制御装置、および複数のレジスタを含み得る。さらなる態様では、プロセッサは、1つまたは複数の処理コアを含み得、したがって、典型的には単一の命令パイプラインを処理することができるシングルコアプロセッサ、または複数の命令パイプラインを同時に処理し得るマルチコアプロセッサであり得る。別の態様では、プロセッサは、単一の集積回路、2つ以上の集積回路として実装され得るか、またはマルチチップモジュールのコンポーネントであり得る(たとえば、個々のマイクロプロセッサダイが単一の集積回路パッケージに含まれ、したがって、単一のソケットを共有する)。
図12に示すように、処理デバイスにはさまざまなコンポーネントが含まれる場合がある。一実施形態では、処理デバイスは、示されるように互いに結合された、他のコンポーネントの中で、1つまたは複数の処理コア1210およびメモリコントローラユニット1220を含み得る。処理デバイスはまた、処理デバイス1200のさまざまなコンポーネント間のポイントツーポイント通信に使用され得る通信コンポーネント(図示せず)を含み得る。処理デバイスは、デスクトップコンピュータ、タブレットコンピュータ、ラップトップコンピュータ、ネットブック、ノートブックコンピュータ、パーソナルデジタルアシスタント(PDA)、サーバ、ワークステーション、携帯電話、モバイルコンピューティングデバイス、スマートフォン、インターネットアプライアンス、またはその他の種類のコンピューティングデバイスを含むがこれらに限定されないコンピューティングシステム(図示せず)で使用することができる。別の実施形態では、処理デバイスは、システムオンチップ(SoC)システムで使用することができる。一実施形態では、SoCは、処理デバイスおよびメモリを含み得る。そのようなシステムの1つのメモリはDRAMメモリである。DRAMメモリは、プロセッサや他のシステムコンポーネントと同じチップ上に配置できる。さらに、メモリコントローラやグラフィックスコントローラなどの他のロジックブロックもチップ上に配置できる。
処理コア1210は、処理デバイス1200のための命令を実行することができる。命令は、命令をフェッチするためのプリフェッチロジック、命令を復号するための復号ロジック、命令を実行するための実行ロジックなどを含み得るが、これらに限定されない。コンピューティングシステムは、カリフォルニア州サンタクララのインテル(登録商標)コーポレーションから入手可能なインテルx86ファミリーのプロセッサおよび/またはマイクロプロセッサ(たとえば、インテルCore i5、i7プロセッサなど)に基づく処理システムを代表する場合があるが、他のマイクロプロセッサ、エンジニアリングワークステーション、セットトップボックスなどを有するコンピューティングデバイスを含む他のシステムも使用することができる。一実施形態では、サンプルコンピューティングシステムは、オペレーティングシステム、組み込みソフトウェア、および/またはグラフィカルユーザインターフェースのバージョンを実行することができる。したがって、本開示の実施形態は、ハードウェア回路とソフトウェアの特定の組み合わせに限定されない。
例示的な例では、処理コア1210は、プロセッサロジックおよび回路を含むマイクロアーキテクチャを有し得る。異なるマイクロアーキテクチャを備えたプロセッサコアは、共通の命令セットの少なくとも一部を共有できる。たとえば、同様のレジスタアーキテクチャは、専用の物理レジスタ、レジスタリネーミングメカニズム(たとえば、レジスタエイリアステーブル(RAT)、リオーダバッファ(ROB)およびリタイアメントレジスタファイルの使用)を使用して動的に割り当てられた1つまたは複数の物理レジスタなど、さまざまな手法を使用して、さまざまなマイクロアーキテクチャでさまざまな方法で実装できる。
メモリコントローラ1220は、処理デバイスが、揮発性メモリおよび/または不揮発性メモリを含むメモリ(図示せず)にアクセスして通信することを可能にする機能を実行することができる。いくつかの実施形態では、メモリコントローラ1220は、処理デバイス1200に関連するプロセッサダイ上に配置され得、一方、メモリは、プロセッサダイから離れて配置される。いくつかの実施形態では、処理デバイスは、命令および/またはデータをキャッシュするためのキャッシュユニット1230を含む。キャッシュユニット1230は、レベル1(L1)1232、レベル2(L2)1234、およびラストレベルキャッシュ(LLC)1236、または処理デバイス1200内のキャッシュメモリの他の構成を含むが、これらに限定されない。いくつかの実施形態では、L1キャッシュ1232およびL2キャッシュ1234は、LLC 1236との間でデータを転送することができる。一実施形態では、メモリコントローラ1220をLLC 1236に接続して、キャッシュユニット1230とメモリとの間でデータを転送することができる。示されるように、キャッシュユニット1230は、処理コア1210に統合することができる。キャッシュユニット1230は、処理デバイス1200の1つまたは複数のコンポーネントによって利用されるデータ(たとえば、命令を含む)を格納することができる。
いくつかの実施形態では、処理デバイスは、1つまたは複数のユーザレベルのアプリケーション1240(たとえば、ユーザレベルのマルチスレッドアプリケーション)を実行することができる。そのようなユーザレベルのアプリケーション1240は、処理デバイス1200にインストールされたシステムソフトウェア(図示せず)によって実行され得る。システムソフトウェアの例には、1つまたは複数のオペレーティングシステム、仮想マシンモニタ(VMM)、ハイパーバイザなど、およびそれらの組み合わせが含まれるが、これらに限定されない。ユーザレベルのアプリケーション1240は、命令(たとえば、命令1250)を使用して、本明細書に開示されるように処理デバイスを制御することができる。命令1250は、実行のために処理コア1210に提供されるマクロ命令、アセンブリ言語命令、またはマシンレベル命令を表すことができる。
いくつかの実施形態では、処理コア1210は、命令1250によって指定されるように、呼び出し手順命令1252の実施形態および手順命令1254からの復帰の実施形態を実行するように動作可能である。呼び出し手順命令1252は、しばしば単に呼び出し命令と呼ばれ、手順命令1254からの復帰は、しばしば単にリターン命令と呼ばれる。呼び出しおよびリターン命令は、処理デバイスが特定の特権レベルで実行するための特定の命令セットの命令または制御信号を表すことができる。動作中、処理コア1210は、呼び出し命令1252を受信することができる。たとえば、呼び出し命令1252は、サブルーチン、ルーチン、割り込みハンドラなどを呼び出しているユーザレベルのアプリケーション1240に関連する呼び出し手順から受信され得る。いくつかの実施形態では、リターン命令1254のアドレスは、関数または手順が呼び出されたときに、メモリに格納されたデータスタックにプッシュされ得る。
呼び出し命令1252が処理デバイス1200の現在の特権レベルの変更を引き起こす場合、処理デバイスは、現在のスタックから新しい特権レベルのために定義されたスタックへのスタック切り替えを実行する。たとえば、呼び出し命令1252は、処理デバイスに現在の特権レベルを変更させて、現在の特権レベルではアクセスできない特定のシステムリソースにアクセスさせることができる。いくつかの実施形態では、メモリに格納された1つまたは複数のシャドウスタックを使用して、データスタックを改ざんから保護するのを助け、および/またはコンピュータのセキュリティを高めるのを助ける。シャドウスタックに格納された情報は、リターン命令1254に関連するリターンアドレス関連情報(たとえば、実際のリターンアドレス、リターンアドレスを妥当性確認/検証するための情報、他のリターンアドレス情報)を表すことができる。
特定の特権レベルの現在のシャドウスタックを識別するために、処理デバイスは、各レジスタが特定の特権レベルに関連付けられているいくつかのシャドウスタックレジスタ1270を含む。例示的な例として、処理デバイスは、IA32_PLx_SSPと呼ばれる4つのレジスタを含むことができ、xは、特権レベル(たとえば、0、1、2、または3)を表す。いくつかの実施形態では、シャドウスタックレジスタ1270は、モデル固有レジスタ(MSR)または汎用レジスタ(GPR)であり得る。他の実施形態では、本明細書に記載のようにデータを格納および提供することができる限り、さまざまなタイプの構造をレジスタ1270として使用することができる。
処理デバイス1200の起動時に、デバイスに関連するシステムソフトウェアは、スタックポインタ(SSP)1275をシャドウスタックレジスタ1270のそれぞれにプログラムすることができる。スタックポインタ(SSP)1275は、レジスタによって識別される特権レベルの特定のシャドウスタックを識別するように動作する。たとえば、SSP 1275は、シャドウスタックの最上部を指すメモリ内の線形アドレスである場合がある。一実施形態では、処理デバイスは、リング遷移中にシャドウスタックレジスタ1270を介してシャドウスタックへのアクセスを制御するためのシャドウスタック保護ロジック1280を含むことができる。
シャドウスタック保護ロジック1280は、このロードまたはストアが実行されるアドレスがページテーブルでシャドウスタックタイプとしてマークされていない場合、シャドウスタックを対象としたロードおよびストアが障害状態を生成するように強制することもできる。このシャドウスタック保護ロジック1280は、「MOV」や「XSAVE」などの命令を介してソフトウェアが開始したストアによるシャドウスタックメモリへのストアを防ぐこともできる。いくつかの実施形態では、シャドウスタック保護ロジック1280はまた、オプションの構成可能なシャドウスタックモード1285を含み得る。シャドウスタックモード1285は、処理デバイス1200によるシャドウスタックの使用を交互に有効化および無効化するように構成されたビットインジケータであり得る。あるいは、シャドウスタックは、任意選択で常に有効にされ得、シャドウスタックモード1285は、任意選択で省略され得る。あるいは、各特権レベルに対応するシャドウスタックモードが存在する場合がある。
図13は、一実施形態による、リング遷移中にスタックを保護するためのプロセッサ拡張をサポートするためのメモリ1301を含むシステム1300を示している。この例では、メモリ1301は、データスタック1303などの1つまたは複数のデータスタックを格納する。データスタックは、コールスタック、データスタック、または単にスタックと呼ばれることもある。データスタック1303は、実行された命令の制御フローを指示するために、データ1305と制御情報1307の両方を格納するように動作するスタックタイプのデータ構造を表すことができる。通常、処理デバイス1200に関連付けられた特権レベルごとにデータスタック1303が存在する。したがって、処理デバイスは、特権レベルを切り替えると、本開示で説明するように、シャドウスタックの場合と同様にデータスタック1303も切り替える。各データスタックのデータ1305は、データスタック1301にプッシュすることができる多種多様な異なるタイプのデータ(たとえば、サブルーチンに渡されるパラメータおよび他のデータなど)のいずれかを表すことができる。一般に、制御情報1307は、1つまたは複数の以前に実行された手順コールのための1つまたは複数のリターンアドレスを含み得る。これらのリターンアドレスは、呼び出された手順が終了して戻ったときに、呼び出された手順が制御フローを返す命令アドレスを表す場合がある。
図13に示されるように、メモリ1301はまた、複数のシャドウスタック1309を含む。シャドウスタック1309は、特定のタイプの制御フロー攻撃からデータスタック1303を保護するのを助けるために使用される。シャドウスタック1309は、データスタック1303とは別個の追加のスタックタイプのデータ構造を表すことができる。いくつかの実施形態では、シャドウスタック1309を使用して、実行された命令の制御情報1307に関連する情報を格納することができるが、データ1305には格納しない。一例示的な例では、シャドウスタック1309は、実行されているメモリ1301内のコードセグメントを特定するCS 1340などのコードセグメント(CS)記述子と、データスタック1303内の命令および他の情報に関連するリターンアドレスを識別するEIP 1350などの命令ポインタ(EIP)を格納することができる。いくつかの実施形態では、シャドウスタックを作成するために使用されるメモリは、ページテーブル内でシャドウスタックメモリタイプであるとマークされ得、その結果、シャドウスタックタイプのメモリではない場合、シャドウスタック障害にロードおよび格納される。同様に、シャドウスタック障害を意図していないストアは、シャドウスタックメモリとしてマークされたメモリに対して作成された場合、失敗する。
システム1300は、複数のシャドウスタック1309を含むことができるが、一度に1つのシャドウスタックのみが、現在のシャドウスタック1310として選択され得る。この点に関して、シャドウスタック1309は、非特権ユーザレベルモード(たとえば、リング3特権レベル)または特権またはスーパーバイザ特権レベルモード(リング0、リング1、またはリング2特権レベル)で個別に動作することができる。いくつかの実施形態では、シャドウスタック1309のそれぞれは、シャドウスタックの最上部を識別するように動作するSSP 1320などのシャドウスタックポインタ(SSP)を含む。たとえば、SSP 1320は、現在のシャドウスタックの最上部を指すメモリ1301内の線形アドレスであり得る。上記のように、SSP 1320は、特定の特権レベルに関連付けられたシャドウスタックレジスタ1270の1つに格納され得る。
示されるように、システム1300はまた、図12からの処理デバイスを含み得る。いくつかの実施形態では、処理デバイスは、システム1300におけるアプリケーションの実行を制御する現在の特権レベルを有し得る。特定の状況では、処理デバイスは、システム1300のリソースへのアプリケーションのアクセス可能性を制御するために、その現在の特権レベルを新しい特権レベルに変更することができる。たとえば、処理デバイスは、呼び出された手順、割り込み/例外ハンドラなどの特定の型の演算に応答して、または他の型の演算に応答して、現在の特権レベルを変更する場合がある。いくつかの実施形態では、処理デバイスは、特権レベルの移行中にスタックを保護するために、シャドウスタック保護ロジック1280を使用することができる。
特権レベル移行の一例では、処理デバイスは、ユーザモード(たとえば、CPL3)の現在の特権レベル(CPL)から、スーパーバイザモード(たとえば、CPL<3)の新しい特権レベルに移行することができる。このタイプの特権レベルの移行は、たとえば、より高い特権レベルの変更を要求するコールゲートを介した呼び出しによって、または割り込み/例外ハンドラを呼び出すことによって開始できる。ユーザモードからスーパーバイザモードへの特権レベルの移行に応答して、処理デバイスは、シャドウスタック1309が新しい特権レベルで処理デバイスに対して有効にされているかどうかをチェックする。たとえば、処理デバイスは、シャドウスタックモード1285インジケータの設定をチェックして、シャドウスタック1309が有効であるか無効であるかを決定することができる。シャドウスタック1309が有効である場合、ユーザモードに関連付けられた現在のSSPは、シャドウスタックレジスタ1270の1つに保存される。次に、新しいシャドウスタック1310は、新しい特権レベルに関連付けられたレジスタに格納されたSSP 1320などのSSPを使用して、スーパーバイザモード用に確立される。いくつかの実施形態では、ユーザモードSSPは、シャドウスタックレジスタに保存され、その結果、スーパーバイザモードの処理デバイスは、再びユーザモードに戻る前に、スタックおよび他のタイプのエントリを削除するためにシャドウスタックを巻き戻す、および他の種類の修正を行うなど、必要に応じてユーザモードSSPを変更できる。
処理デバイスが新しい特権レベルに関連付けられたレジスタからSSP 220を取得すると、処理デバイスは、ビジー検証および設定ロジック1325など、シャドウスタック保護ロジック1280の特定のロジックを使用して、レジスタにプログラムされたSSPを検証するためのいくつかのチェックを自動的に実行する。自動チェックには、レジスタにプログラムされたSSP 1320がスーパーバイザシャドウスタック(たとえば、シャドウスタック1310)の最上部を指していることの検証が含まれるが、これに限定されない。SSP 1320によって識別されたシャドウスタックは、処理デバイスに関連付けられているプラットフォームハードウェアの現在のモード用に使用され、そのシャドウスタックは他のプロセススレッドにロードされない。これらのチェックは、攻撃者が2つの異なるプロセッサスレッドのレジスタを同じシャドウスタックにポイントして、第2のプロセッサで呼び出しを行うことにより、1つのプロセッサで消費されるリターンアドレスを操作するクロススレッドなど、特定の攻撃を防ぐために使用できる。
SSP 1320を検証するためのチェックを実行するために、処理デバイスのシステムソフトウェア(たとえば、カーネルまたはOS)は、SSPによって指し示されるシャドウスタック1310の最上部にあるトークン1330を識別する。いくつかの実施形態では、処理デバイスは、SSP 1320によって指定されたアドレスから(たとえば、8バイトの)トークン1330を(たとえば、原子的に)ロードすることができる。一実施形態では、トークン1330のロードは、トークンおよび/または場所(たとえば、キャッシュライン)をロックして、トークンが別のプロセッサコアまたは処理デバイスによってコピーまたは変更されるのを防ぐ。一実施形態では、トークンのロードは、特定のシャドウスタック操作を使用して処理デバイスによって行われ、ロードまたはストアが実行されるアドレスがページテーブルでシャドウスタックメモリとしてマークされたメモリでない場合、それは障害を引き起こす。
トークン1330は、レジスタにプログラムされたSSP 1320を検証するために使用される複数のビットを含む。いくつかの実施形態では、処理デバイスは、複数のビットを分析して、トークン1330の線形アドレスを表すセットビット、値(たとえば、1または0)に設定されたトークンの決定されたビットであり得るビジーインジケータ、シャドウスタック1310がすでに任意の論理プロセッサにロードされているかどうか、シャドウスタック1310が特定のビットモード(たとえば、32ビットまたは64ビット)で使用されるかどうかを示す値(たとえば、1または0)に設定されたトークンの別の決定されたビットであり得るフラグインジケータ、およびその他の関連情報を識別する。
検証ロジック1325に従って、処理デバイスは、シャドウスタック1310がどの論理プロセッサにもまだロードされていないことを示すビジーインジケータが設定されていない(たとえば、0)ことをチェックする。処理デバイスはまた、システム1300のハードウェアプラットフォームが、フラグインジケータによって表されるビットモードと一致するモードで動作していることをチェックする。たとえば、フラグインジケータに基づいて、フラグ処理デバイスは、シャドウスタック1310が32ビットまたは64ビットのマシンで使用するためのものであると決定することができる。次に、処理デバイスは、たとえば、ハードウェアプラットフォームに関連付けられたプラットフォームレジスタをチェックして、プラットフォームが対応する動作モード(たとえば、32ビットまたは64ビット)にあることを検証することができる。処理デバイスはまた、トークン1330に記録された線形アドレスがSSP 1320の線形アドレスと一致することをチェックする。
線形アドレスを照合するこのチェックは、トークン1330を初期化するためにシステムソフトウェアによって作成されたとき以外はシャドウスタック上の8バイトの場所の線形アドレスがシャドウスタック上のそれらの8バイトのコンテンツに表示されないため、レジスタ1270が有効なシャドウスタックの最上部を指していることを検証する。したがって、トークン1330は、レジスタ1270に格納されたシャドウスタックポインタが有効なシャドウスタックの最上部を指していることを示すインジケータを形成する。いくつかの実施形態では、処理デバイスは、処理デバイスが32ビットまたは64ビットの動作モードにあるかどうかに応じて、シャドウスタックが4バイトまたは8バイトに整列されることを強制し、したがって、シャドウスタックポインタ1320の下位2ビットは常に0であり、ビジーインジケータとトークン1330のフラグを保存するために使用できる。上記のすべてのチェックの結果が正しい表示である場合、トークンのビジーインジケータを値(たとえば、1)に設定して、SSP 1320が指すシャドウスタックが新しい特権レベルで使用されていることを示すことができる。これらのチェックが実行されている間、トークン1330を含むメモリ位置(たとえば、キャッシュライン)は、それを変更できないように(たとえば、別の論理プロセッサによってビジーに設定される)、処理デバイスによってロックされることに留意されたい。ビジービットを設定した後、プロセッサはこのメモリ位置のロックを解除する。トークンをロックした状態でこれらのチェック操作を実行すると、チェック時から使用時までの問題が発生しなくなる。そうでなければ、上記のチェックのいずれかが失敗した場合、処理デバイスは、たとえば、処理デバイス1200に関連付けられたオペレーティングシステムに送信することができる障害またはアラートを生成する可能性がある。いくつかの実施形態では、障害が生成された場合、トークン1330を含むメモリ位置のロックは、位置のコンテンツを変更することなく解放される。
CPL 0/1/2→CPL 3モード遷移など、スーパーバイザモードからユーザモード特権レベルに戻る際、処理デバイスは、ビジー検証およびクリアロジック1335など、特定のロジックを使用していくつかのチェックを実行する。このタイプの特権レベル移行は、たとえば、割り込みリターン(IRET)命令、または実行される次のアドレスをCPUの命令ポインタまたは他のタイプのリターン命令にシフトする「FAR RET」命令によって開始できる。
ユーザモード特権レベルへの復帰移行の一部として、ビジー検証およびクリアロジック1335によって指示された処理デバイスは、SSP 1320が8バイトに整列されたアドレスを指している場合、トークン1330内のビジーインジケータが設定されているかどうか、およびトークンに記録された線形アドレスがSSP 1320のアドレスと一致するかどうかをチェックする。上記のチェックのすべてが正しい表示をもたらす場合、処理デバイスは、トークン1330内のビジーインジケータをクリアすることによって、トークン1330を「空き」としてマークする。トークンは、ロックされたロードを使用してSSP 1320が指すメモリアドレスからロードされるため、場所(たとえば、キャッシュライン)はその後の変更からロックされることに注意されたい。検証が成功すると、ビジービットがクリアされ、ロックが解除される。検証が成功しなかった場合、その場所のコンテンツを変更せずにロックが解除される。その後、処理デバイスは、その特権レベルに関連付けられた適切なシャドウスタックレジスタ1270からユーザモードのSSPを検索する。そうでなければ、処理デバイスは、トークン1330が無効であることを示す障害を生成する可能性がある。
特権レベル移行の別の例では、処理デバイスは、現在のスーパーバイザモード特権レベルから、CPL2→CPL1、CPL1→CPL0またはCPL2→CPL0モード遷移などの新しいより高いスーパーバイザモードに遷移することができる。このタイプの特権レベルの移行は、たとえば、より高い特権レベルの変更を要求するコールゲートを介した呼び出しによって、または呼び出しと割り込み/例外ハンドラによって開始できる。そのような移行時に、処理デバイスは、そのレベルのシャドウスタックレジスタ1270の適切な1つから、新しい特権レベルのSSP 1320を選択する。処理デバイスが新しい特権レベルに関連付けられたレジスタからSSP 1320を取得すると、処理デバイスはいくつかのチェックを実行して、レジスタにプログラムされたSSPを検証する。
いくつかの実施形態では、処理デバイスは、上記のようにビジー検証および設定ロジック1325を検使用することによってチェックを実行する。チェックが成功した場合、処理デバイスは、トークン1330にビジーインジケータを設定することによって、シャドウスタック1310をビジーとしてマークする。次に、処理デバイスは、実行中のメモリ1301内のコードセグメントを識別するCS 1340セレクタ(たとえば、コードセグメントセレクタ)、リターンアドレス情報を識別するEIP 1350、および現在の特権レベルに関連付けられたSSP 1360を新しい特権レベルのシャドウスタックにプッシュする。いくつかの実施形態では、処理デバイスは、EIP 1350の代わりに、新しい特権レベルのシャドウスタック上で線形命令ポインタ(LIP)(EIPとコードセグメントベースである)をプッシュすることができる。これは、呼び出しと呼び出しからの戻りの間でコードセグメントベースを変更しようとする試みを検出するために行うことができる。
新しいスーパーバイザモードから前のスーパーバイザモードに戻ると、処理デバイスは、そのような戻りが前のコールが行われたのと同じアドレスにあることを確認する。たとえば、処理デバイスは、シャドウスタック1310からのCS 1340およびEIP 1350(またはLIP)がデータスタック1303上の対応する値と一致することを検証する。一致する場合、処理デバイスは、CS 1340、EIP 1350、およびSSP 1360をシャドウスタック1310から削除またはポップして、新しい特権レベルで使用される新しいSSPを確立する。いくつかの実施形態では、プッシュおよびポップ操作は、特定のシャドウスタックストアおよびロード操作を使用して行われ、その結果、操作がページテーブルでシャドウスタックメモリとしてマークされていないメモリに対するものである場合、操作は障害を引き起こす。
遷移の一部として、ビジー検証およびクリアロジック1335によって指示された処理デバイスは、SSP 1320を指すシャドウスタックのトークン1330内のビジーインジケータが設定されているかどうか、およびトークン1330に記録された線形アドレスがSSP 1320のアドレスに一致するかどうかをチェックする。上記のチェックのすべてが正しい表示をもたらす場合、処理デバイスは、トークン1330内のビジーインジケータをクリアすることによって、トークン1330を「空き」としてマークする。
特権レベル移行のさらに別の例では、処理デバイスのユーザモードから最も信頼できる特権レベルへのモード遷移、たとえば、CPL3→CPL0モード遷移に基づくことができる。このタイプの特権レベルの移行は、たとえば、システムコールの一部がスタックを使用してシステムコール操作を実行しないシステムコールを呼び出すように設計されたSYSCALLやSYSENTERなどの特定の命令を使用して開始できる。このような移行では、処理デバイスは現在のSSPをユーザモードに関連付けられたレジスタに保存し、対応するレジスタでSSPを取得することにより、CPL0特権レベルに関連付けられたシャドウスタックに切り替える。処理デバイスはシステムクリティカルな操作を実行している可能性があるため、SSPを検証しないが、シャドウスタックのセットからシャドウスタックの1つを、新しい特権レベルの現在のSSPとして選択する。たとえば、このタイプの特権レベルの移行は、たとえば、スタックを使用してシステムコール操作を実行しない高速システムコールによって開始される場合がある。いくつかの実施形態では、システムコールがスタックを使用して呼び出しを行う必要がある場合、ビジー検証および設定ロジック1325で使用されるなど、ビジーとしてのシャドウスタックの検証およびマークを実行するために、処理デバイスによって提供される新しい命令を使用するように構成され得る。ビジー検証および設定ロジック1325のこの操作は、選択されているが、以前にビジーを検証および設定していないシャドウスタックで実行される。
CPL0→CPL3モード遷移など、最も信頼できる特権レベルから前のユーザモードに戻ると、処理デバイスは、ユーザモード特権レベルに対応するレジスタに格納されているSSPにアクセスすることにより、ユーザモードシャドウスタックを復元する。このタイプの特権レベルの移行は、たとえば、システムのリターン命令または終了命令(たとえば、SYSRETまたはSYSEXIT)によって開始できる。CPL3に戻る前に、システムコールが処理デバイスによって提供された新しい命令を使用してシャドウスタックをビジーとして検証およびマークした場合、ビジー検証およびクリアロジック1335で使用されるなど、処理デバイスによって補完的な命令が提供され、シャドウスタックを検証および空きとしてマークする。
図14は、一実施形態による、割り込みまたは例外配信の一部としてスタックを切り替えるための図13のメモリ1301を含むシステム1400を示している。いくつかの実施形態では、本開示は、この割り込みまたは例外ハンドラが実行される特権レベルのシャドウスタックポインタを選択するために使用されるシャドウスタックレジスタ1270の代わりに、割り込みシャドウスタックポインタテーブル1410を使用することによって、特定の割り込みの配信および実行中にシャドウスタックスイッチを補完する技術を提供する。処理デバイス1210のシステムソフトウェアは、テーブル1410のアドレスを、割り込みSSPテーブルアドレスレジスタ1420などのレジスタにプログラムすることができる。テーブル1410は、システム1300に関して上記のようにリング遷移中に処理デバイスによって識別されるSSP 1320を格納するために、または割り込みまたは例外が新しいシャドウスタック上で動作するように構成されている場合、リング遷移がなくてもスタックスイッチを引き起こすために使用される。この点に関して、新しいシャドウスタックの選択は、割り込み記述子テーブル(IDT)内のその割り込み用に構成されたセレクタ1430を使用して、割り込みシャドウスタックテーブル1410内のシャドウスタックポインタの1つからである。
動作中、例外または割り込みが発生すると、処理デバイスは、そのようなイベントを処理することを目的とした特定のコードシーケンスへの制御転送で応答する場合がある。このコードシーケンスは通常、スーパーバイザモードで実行される。この特別なコードシーケンスまたはルーチンのアドレスは、発生した例外のタイプに固有のIDTへのインデックスを使用して、割り込み記述子テーブル(IDT)から処理デバイスによって取得される(たとえば、1つのインデックスが別のページフォールトはオーバーフロー例外に対応する)。このIDTエントリはさらに、割り込みシャドウスタックテーブル1410へのインデックスを有することができ、その結果、このインデックス値がゼロ以外である場合、割り込みまたは例外を配信する特権の変更が必要でなくても、その割り込みまたは例外に対してシャドウスタック切り替えを実行しなければならないことを示す。処理デバイスは、IDTに関連付けられたインデックスを使用して、割り込みシャドウスタックポインタテーブル1410にインデックスを付けて、SSP 1320を格納するエントリを識別することができる。たとえば、割り込みシャドウスタックポインタテーブル1410のエントリはまた、発生した例外のタイプに固有であり得る。次に、SSP 1320は、割り込みに関連する新しい特権レベルで処理デバイスによって使用され得る。SSPの選択に続いて、プロセッサデバイスは、特定のロジック(たとえば、ビジー検証および設定ロジック1325)を呼び出して、割り込みシャドウスタックテーブル1410に格納されたSSP 1320がその動作モードの有効なシャドウスタックの最上部を指すこと、およびシャドウスタックがビジーではないことを確実にする。
図15は、一実施形態によるタスク切り替えの一部としてスタックを切り替えるための図13のメモリ1301を含むシステム1500を示している。タスク切り替え操作において、処理デバイスは、現在実行中のタスクから新しいタスクへのタスク切り替えを引き起こす制御転送命令を実行することができる。いくつかの実施形態では、タスクは、処理デバイスがディスパッチ、実行、または一時停止することができる作業単位を表すことができる。例として、タスクは、プログラム、タスクまたはプロセス、オペレーティングシステムサービスユーティリティ、割り込みまたは例外ハンドラ、またはカーネルまたは実行ユーティリティのうち1つまたは複数を実行するために使用され得る。一態様では、タスク切り替えは、呼び出し手順命令が実行されるとき、または割り込みまたは例外が発生するとき、またはその他の方法で実行され得る。
処理デバイスが現在のタスクから新しいタスクへのタスク切り替えを実行するとき、デバイスは、現在のTSS 1520などのタスク状態セグメント(TSS)と呼ばれる、現在のタスクに対応する現在のタスクの状態情報を、メモリ1301内のデータ構造に保存する。新しいタスク1527の状態情報は、新しいタスク1527に対応する別のTSS(たとえば、新しいTSS 1525)からロードまたは検索され得る。この状態情報には、スタックおよび命令ポインタ、1210マップベースアドレスなどのタスク切り替えを実行するために必要な情報が含まれ得るが、これらに限定されない。
TSSは、タスクに関する情報を格納するために使用できるコンピュータ上のメモリ内のハードウェア管理データ構造を表す。たとえば、TSSは、処理デバイス1200がスタックポインタなどのタスクスイッチを実行するために必要な情報を含む。異なるタスクの各TSSには、異なる特権レベルの異なるスタック(たとえば、制御情報とデータの両方を格納するために使用されるデータスタック)へのスタックポインタが含まれる場合がある。スタックポインタは、タスク切り替え操作によって特権レベルが変更されたときに、適切なスタックを識別するために使用される。たとえば、タスク切り替え操作は、現在の特権レベルでの現在のタスクを新しい特権レベルでの新しいタスクに切り替えることを含み得る。
いくつかの実施形態では、本明細書で説明するシャドウスタックを使用して、現在のタスクから新しいタスクへの特権レベルの移行中にデータスタックを保護することができる。上記のように、シャドウスタックは、制御転送操作で使用されるデータスタックからの情報を格納および保護する、データスタックとは別の第2のスタックである。一実施形態では、シャドウスタックポインタ1530などのシャドウスタック選択情報は、特定のプロセッサアーキテクチャ(たとえば、インテルコアi7、i5、およびXeonプロセッサ)のTSS構造に格納され得る。
図15を参照すると、動作中の処理デバイスは、新しいタスクに関連付けられたTSS 1520を識別することによって、現在のタスクから新しいタスクへのタスク切り替えに応答する。これに関して、タスク切り替えは、たとえば、呼び出し命令、割り込み/例外、またはその他によって開始され得る。いくつかの実施形態では、処理デバイスは、TSS 1520に格納されたSSP 1530を検索する。SSP 1530は、新しいタスクで使用するシャドウスタック1510を識別する。
いくつかの実施形態では、処理デバイスは、上記のようにビジー検証および設定ロジック1325を使用してチェックを実行することによってSSP 1530を検証する。チェックが成功した場合、処理デバイスは、トークン1540にビジーインジケータを設定することによって、シャドウスタック1310をビジーとしてマークする。次に、処理デバイスは、実行中の現在のタスクのコードセグメントを識別するCS 1550ポインタ、現在のタスクに関連するリターンアドレス情報を識別するEIP 1560、および現在のタスクの現在の特権レベルに関連付けられるSSP 1570を新しいシャドウスタックにプッシュする。
新しいタスクから前のタスクに戻ると、処理デバイスは、そのような戻りが前のタスクと同じアドレスにあることを確認する。たとえば、処理デバイスは、シャドウスタック1510からのCS 1550およびEIP 1560が、前のタスクに関連するTSS内の対応する値と一致することを検証する。一致する場合、処理デバイスは、CS 1550、EIP 1560、およびSSP 1570をシャドウスタック1510から削除またはポップして、前のタスクで使用されている現在のSSPを確立する。前のタスクへの復帰移行の一部として、ビジー検証およびクリアロジック1335によって指示された処理デバイスは、トークン1540のビジーインジケータが設定されているかどうか、およびトークン1540の線形アドレスがSSP 1530のアドレスと一致するかどうかをチェックする。上記のチェックのすべてが正しい表示をもたらす場合、処理デバイスは、トークン1540のビジーインジケータをクリアすることによって、トークン1540を「空き」としてマークする。
特定のアーキテクチャは特権レベル1または2(CPL==1またはCPL==2)での動作をサポートしているが、これらの特権リングは一部のオペレーティングシステムでは使用されていない。さらに、特定のアーキテクチャは、0より大きい特権レベルで動作するハンドラによる割り込み/例外配信をサポートしていない。この詳細な説明の残りの部分は、特権リング0内の相互作用に焦点を当てているが、本発明の基本原理は、特定の特権レベルでの動作に限定されない。
処理デバイスの一実施形態は、最新の64ビットオペレーティングシステムの割り込み/例外配信アーキテクチャを大幅に高速化することを目標とする高速リターンおよびイベント配信(FRED)実装をサポートする。特に、この実施形態は、割り込み記述子テーブル(IDT)を介した配信を置き換え、それによって、イベントハンドラのコードおよびスタックセグメントセレクタおよびポインタを見つけるために必要なメモリアクセスおよび記述子テーブルの負荷を取り除く。さらに、リング1および2のイベント/例外配信の非推奨により、イベント配信マイクロコードおよび/または回路がこれらのパスを考慮する必要がないため、遅延が減少する。最後に、一実施形態は、低遅延で最適なマイクロコード実装のために、ユーザ空間およびスーパーバイザ空間に戻るための別個の命令を提供する。
一実施形態では、複数のシャドウスタックが使用される場合、所与の時間に利用可能なシャドウスタック(現在のシャドウスタック)は1つだけである。上記のように、現在のシャドウスタックの最上部へのポインタは、シャドウスタックポインタ(SSP)1320に保持されている。特権スイッチでのシャドウスタックの切り替えをサポートするために、プロセッサの一実施形態には、以下のモデル固有レジスタ(MSR)が含まれる。 1.IA32_PL3_SSP 2.IA32_FRED_SSP0 3.IA32_FRED_SSP1 4.IA32_FRED_SSP2 5.IA32_FRED_SSP3 一実施形態では、IA32_PL3_SSP MSRは、CPL 3に移行するときに確立されるSSP値を保持する。IA32_FRED_SSPiは、割り込みやイベント配信のためにCPL 0に移行するときに確立されるSSP値を保持する。
図16は、イベント処理回路/ロジック1690が、割り込み/例外1694の優先度レベルおよび現在の特権レベル1696に基づいて、それぞれ、シャドウスタック1640〜1644へのポインタを有するSSP MSR 1600〜1604を選択する実施形態を示す。この実施形態では、割り込みおよび例外1694は、0〜3の4つの優先度レベルのうちの1つに分類され、0は最低の優先度であり、3は最高の優先度である。イベントを処理する必要がある場合、イベント処理回路/ロジック1690は、SSPを対応するIA32_FRED_SSPi MSRの値に切り替えることにより、そのレベル(「i」)に設定されたスタックレベルでイベントを配信する。たとえば、優先度レベル2の割り込みまたは例外1694に応答して、FRED SSP2 MSR 1602からのシャドウスタックポインタが選択され、スーパーバイザシャドウスタックSS2 1642が識別される(以下で説明するように、現在の特権レベル1696に依存する)。ただし、プロセッサが現在アクティブなスタックレベルよりも高いスタックレベルで配信されるように分類されたイベントをすでに処理している場合、プロセッサは現在のスタックに留まる。
この説明の残りの部分では、イベント/割り込みを配信する必要があるスタックレベル「i」のシャドウスタックへの切り替えを想定している。一実施形態では、FRED SSPi MSR 1600〜1603のそれぞれは、以下のビットフィールド定義を格納する。
・ビット0−検証済み(V)−MSRが検証済みのsupervisor−shadow−stackトークンを指しているかどうかを示す(後述)。
・ビット2:1−予約済み(0に設定)
・ビット63:3−スーパーバイザシャドウスタック上の有効なスーパーバイザシャドウスタックトークンの線形アドレス。
一実施形態では、イベント処理回路/ロジック1690は、プロセッサがCPL3(つまり、現在の特権レベル1694で示される)でユーザモードで実行されているときにイベント1694が到着した場合、またはプロセッサがすでにCPL0でスーパーバイザモードで実行されており、イベント1694をより高いスタックレベルで配信する必要がある場合、それぞれ、新しいスーパーバイザシャドウスタック1640〜1643を識別するSSP MSR 1600〜1603の1つからポインタを選択する。したがって、シャドウスタックがCPL3(ユーザモード)およびCLP0(スーパーバイザモード)で有効になっていると仮定すると、SSPはPL3 SSP 1604に保存され(つまり、ユーザモードで起動する場合)、選択したFRED SSPi MSR 1600−1603におけるSSPアドレスを使用してスーパーバイザモード用にシャドウスタックが確立され、iは、配信されるイベント1694の優先度によって識別されるように切り替えられるスタックレベルである。
スーパーバイザモードの暫定SSPがFRED SSPi MSR 1600〜1603の1つからPL0 SSP 1650として選択されると、検証および使用チェック回路/ロジック1695は、(1)選択されたSSP MSR 1600〜1603でプログラムされたSSPは、対応するスーパーバイザシャドウスタック1640〜1643の最上部をそれぞれ指すこと、および(2)この暫定SSP 1602が指すスーパーバイザシャドウスタック1640〜1643は、ビジービット(B)により示されるように、他の論理プロセッサではまだアクティブではないことを確認する。両方のチェックに合格すると、FRED SSPi MSR 1602が新しい特権レベル0(PL0)SSP 1650になる。
これらのチェックは、攻撃者が2つの論理プロセッサ上のMSRを同じシャドウスタックに向け、第2の論理プロセッサで呼び出しを行うことによって1つの論理プロセッサで消費されるリターンアドレスを操作できるクロススレッド攻撃を防ぐために実行される。
一実施形態では、これらのチェックを実行するために、システムソフトウェアは、各スーパーバイザシャドウスタックの最上部にスーパーバイザシャドウスタックトークン1650〜1653を配置する。ある特定の実装では、スーパーバイザシャドウスタックトークン1650〜1653は次のようにフォーマットされる。
・ビット63:3−シャドウスタック上のトークンの線形アドレス
・ビット2:1−予約済み(0に設定)
・ビット0−ビジー(B)。このビットが0の場合、選択されたシャドウスタック1640〜1643はどの論理プロセッサにもロードされない。
図17は、スーパーバイザシャドウスタックトークン1652を備えたスーパーバイザシャドウスタック1642を示している。PL0_SSP 1650は、スーパーバイザシャドウスタックトークン1652を保持するスーパーバイザシャドウスタック1642の最上部を指す線形アドレス0x1008を保持する。システムソフトウェアがこのシャドウスタックを作成すると、ビジーフラグ1701(ビット0)が0に初期化される。
本発明の一実施形態による方法が図18に示されている。この方法は、本明細書に記載のプロセッサおよびシステムアーキテクチャ上に実装することができるが、特定のアーキテクチャに限定されない。
1801で、システムイベント(たとえば、割り込み)は、優先度iで現在の特権レベルで受信される。1802で、特権レベル0のシャドウスタックポインタへの変更が必要であるかどうかに関して決定がなされる。上記のように、プロセッサがCPL3でユーザモードで実行されているときにイベントが到着する場合、またはプロセッサがすでにCPL0でスーパーバイザモードで実行されており、イベントをより高いスタックレベルで配信する必要がある場合は、変更が必要である。変更が必要ない場合、プロセスは、1810において、現在のSSPを有する現在の特権レベルのままである。
変更が必要な場合は、1803で、イベントの優先度(i)に基づいて暫定SSPが選択される。たとえば、暫定SSPは、SSP MSRiから選択され得る。1804で、検証とビジーチェックが暫定SSPで実行される。たとえば、シャドウスタックの最上部にあるトークンを暫定SSPと比較し、ビジービットをチェックして、暫定SSPによって識別されたシャドウスタックが他の論理プロセッサにロードされていないことを確認できる。1805で決定されたこれらのチェックのいずれかが失敗した場合、1811で障害/例外が生成される。
両方のチェックが1805で合格した場合、1806で、特権レベル0のシャドウスタックポインタが暫定SSPに設定される。現在の特権レベルも変更される可能性がある。1807に、イベントは現在の特権レベルで、新しいSSP PL0値を使用して処理される。次に、次のシステムイベントが受信されると、プロセスは1801に戻る。
一実施形態では、妥当性確認および使用チェック回路/ロジック1690および妥当性確認およびビジーチェック1804は、MSRが検証されていないとマークされた場合、シャドウスタック(たとえば、FRED SSP2 1602)がいつでも1つの論理プロセッサにのみロードできることを保証するように動作する(上記のコードシーケンスの「チェック1」)。さらに、これらの実施形態は、MSR内のシャドウスタックポインタが、スタックの最上部にある有効なスーパーバイザシャドウスタックトークンを指していることを保証する(上記のコードシーケンスの「チェック2」)。
一実施形態では、トークンを検証し、シャドウスタックポインタSSPをトークン内のアドレスに設定するために、以下のコードシーケンスが実行される。
MSRが検証済みとしてマークされていない場合、これらのチェックは、キャッシュラインのロックを取得する上記のコードシーケンスのAtomic−StartとAtomic−Endで示されるように、ロックされた読み取り−変更−書き込みを使用してアトミックに実行できることに注意されたい。取得したロックを解除する。これらのチェックが成功すると、トークンはビジーとしてマークされ、MSRは検証済みとしてマークされる。
一実施形態では、MSRが検証済みとしてマークされると、これらの操作のその後の呼び出しで、それ以上ロックされた読み取り−変更−書き込み操作は実行されない。むしろ、MSRがすでに検証済みとしてマークされている場合は、トークンを保持しているキャッシュラインのロックを取得せずに、メモリからトークンをロードすることにより、同じ2つのチェックを実行できる。一実施形態では、検証済みビットが誤ってまたは悪意を持ってMSRに設定されることを回避するために、このMSRを書き込むために使用される命令は、書き込まれた値の検証済みビット(たとえば、ビット0)を常に無視し、検証済みビットを無条件に0にクリアする。このような命令には、WRMSR命令(モデル固有のMSRの書き込み)およびXRSTORS命令(メモリからプロセッサスーパーバイザモードの拡張状態を復元する)が含まれるが、これらに限定されない。
図19は、検証されたビットに基づいてアトミック操作と非アトミック操作のどちらかを選択する方法の一実施形態を示している。1901で、割り込みなどのシステムイベントが優先度レベルiで受信される。1902で、検証されたビット(たとえば、SSPi=0)が0である(すなわち、検証されていない)かどうかを決定するためにチェックが行われる。検証されたビットが0の場合、1903においてアトミックな操作のセットが開始される。ビジービットは1904でチェックされる。0に設定されている場合、1905においてシャドウスタックトークンが一時SSPと比較される。それらが一致する場合、アトミック操作は1906において完了する。1907において検証済みビットが1に設定され、1908において一時シャドウスタックポインタ(SSPi)が現在のシャドウスタックポインタ(SSP)になる。
1904に戻ると、ビジービットが1に設定されている場合(シャドウスタックが別の論理プロセッサによって使用されていることを意味する)、または1905で、トークンが一時SSPと一致しない場合、1913で障害状態が生成される。さらに、1902で、検証済みビットが1に設定されている場合(つまり、SSPがすでに検証済みである場合)、操作のアトミックセットは必要ない。同じ2つのチェックは、1914(ビジービットのチェック)と1915(トークンの比較)で実行できる。ただし、これらの操作は、必要なデータを保持するキャッシュラインのロックを取得せずに実行される。たとえば、トークンを格納するキャッシュラインでロックが取得されないため、他の操作を同時に続行できるため、パフォーマンスが向上する。
プロセッサは、割り込み/例外の処理から戻るときに、ユーザモード(CPL3)に戻る場合、またはスーパーバイザモードで中断された手順に戻るが中断された手順に戻るときに、スーパーバイザシャドウスタック(たとえば、PL0 SSP 1650)から切り替わる場合がある。イベントが処理されたスタックレベルよりも低いスタックレベルで実行されていた。
イベント/割り込みの処理の一部としてのオペレーティングシステムは、文脈切り替えを実行する場合もある。一実施形態では、文脈切り替えは、FRED_SSPi MSRへの書き込みを引き起こして、1つまたは複数の優先度レベルに関連付けられたシャドウスタックポインタを更新する。このような場合、FRED_SSPi MSRへの書き込みにより、MSRの検証済みビットが0にクリアされる。
したがって、一実施形態では、3つのケースが、イベントハンドラからの戻り時に発生する可能性がある。
(1)FRED_SSPi=SSP|1:
−SSPはMSR値と一致し(SSPはスタックの最下部にある)、MSRが検証される
−何もしない
(2)FRED_SSPi=SSP
−SSPはMSR値と一致するが、MSRは検証されていない
−トークンをチェックして、MSRを再検証できるかどうかを確認する。
(3)FRED_SSPi[63:1]≠SSP[63:1]
−SSPがMSRと一致しない。トークンをリセットして解放し、MSR検証をクリアする
−この操作には、上記のようにアトミックな読み取り−変更−書き込みが必要である。
したがって、MSRが有効でビジーなスーパーバイザシャドウスタックトークンを指している場合、MSRは検証済みとしてマークされる。この操作は最も頻繁なケースであり、ロックされた操作を必要としないため、パフォーマンスが向上する。MSRが現在のシャドウスタック上の有効でビジーなスーパーバイザシャドウスタックトークンを指していない場合、および現在のシャドウスタックにビジーなスーパーバイザシャドウスタックトークンがある場合、そのトークンは解放される。この操作は、一貫性とセキュリティを確保するためにロックされた操作を使用して実行される。
トークンをクリアした後、プロセッサがユーザモード(CPL3)に戻る場合、プロセッサはPL3_SSP 1604からユーザモードのシャドウスタックポインタを確立する。プロセッサがスーパーバイザモード(CPL0)で中断された手順に戻る場合、中断された手順のシャドウスタックポインタが復元される(たとえば、FRED SSP0ポインタを使用)。
FRED_SSPi MSRに書き込むWRMSR命令またはXRSTORS命令により、そのMSRの検証済みビットが0にクリアされることに注意されたい。ただし、仮想マシンマネージャ(VMM)またはハイパーバイザは、仮想マシン(VM)スイッチでこれらのMSRの状態を文脈切り替えする必要がある。この実施形態では、VM文脈切り替えは、これらのMSRの検証された状態が失われる原因となるべきではない。
一実施形態では、VM終了が発生したときにこのケースに対処するために、プロセッサは、検証されたビットを含むFRED_SSPi MSRを仮想マシン制御構造(VMCS)に保存する。後続のVMエントリの1つで、プロセッサは検証済みビットを含むこれらのMSRの状態をVMCSから復元する。
例
以下は、本発明の異なる実施形態の例示的な実装である。
[実施例1]複数のシャドウスタックポインタ(SSP)を格納するための複数のレジスタであって、各SSPが、異なるイベント優先度に関連付けられている、複数のレジスタと、第1のイベント優先度レベルに関連する第1のイベントの受信に応答して、複数のレジスタの第1のレジスタから複数のSSPの第1のSSPを選択するためのイベント処理回路であって、第1のSSPが、第1のシャドウスタックの最上部を識別するために使用可能である、イベント処理回路と、第1のSSPが以前に検証されているかどうかを判断するための検証および使用チェック回路と、を備え、第1のSSPが以前に検証されていない場合は、一連のアトミック操作を開始して第1のSSPを検証し、第1のSSPが使用されていないことを確認し、一連のアトミック操作は、一連のアトミック操作が完了するまでデータをロックするロック操作を使用し、第1のSSPが以前に検証されている場合は、第1のSSPを再検証し、ロック操作を使用せずに第1のSSPが使用されていないことを確認する、プロセッサ。
[実施例2]複数のSSPが、スーパーバイザ特権レベルに関連付けられた対応する複数のスーパーバイザシャドウスタックを指す、第1のSSPを含む複数のスーパーバイザSSPを含む、実施例1に記載のプロセッサ。
[実施例3]複数のSSPが、ユーザ特権レベルに関連付けられたユーザレベルのシャドウスタックを指す少なくとも1つのユーザレベルのSSPをさらに含む、実施例2に記載のプロセッサ。
[実施例4]第1のイベントは、第1のイベント優先度レベルに関連する第1の割り込みまたは第1の例外を含む、実施例1に記載のプロセッサ。
[実施例5]複数のSSPが対応する複数のイベント優先度レベルに関連付けられる、実施例4に記載のプロセッサ。
[実施例6]第1のSSPが使用されていないことを確認することは、第1のSSPに関連付けられたビジービットの値をチェックすることを含む、実施例1に記載のプロセッサ。
[実施例7]第1のSSPを検証および再検証することは、第1のSSPを第1のシャドウスタックの最上部に格納された第1のトークン値と比較することを含む、実施例6に記載のプロセッサ。
[実施例8]第1のシャドウスタックに関連付けられた第1のデータスタックを使用して、第1のデータスタックに関連付けられた第1のスーパーバイザ特権レベルで、1つまたは複数の命令を実行する実行回路をさらに備える、実施例7に記載のプロセッサ。
[実施例9]イベント処理回路ならびに前記検証および使用チェック回路は、プロセッサの命令実行パイプラインの一部を含み、検証および使用チェック回路は、SSPの検証および使用チェックに関連する第1の一連の命令を実行するための命令実行パイプラインの第1の部分を含み、イベント処理回路は、イベント処理に関連する第2の一連の命令を実行するための命令実行パイプラインの第2の部分を含む、実施例8に記載のプロセッサ。
[実施例10]複数のシャドウスタックポインタ(SSP)を対応する複数のレジスタに格納し、各SSPが、異なるイベント優先度に関連付けられる、ことと、第1のイベント優先度レベルに関連付けられた第1のイベントの受信に応答して、複数のレジスタの第1のレジスタから複数のSSPの第1のSSPを選択し、第1のSSPが、第1のシャドウスタックの最上部を識別するために使用可能である、ことと、第1のSSPが以前に検証されているかどうかを判断することと、を含み、第1のSSPが以前に検証されていない場合は、一連のアトミック操作を開始して第1のSSPを検証し、第1のSSPが使用されていないことを確認し、前記一連のアトミック操作は、一連のアトミック操作が完了するまでデータをロックするロック操作を使用し、第1のSSPが以前に検証されている場合は、第1のSSPを再検証し、ロック操作を使用せずに第1のSSPが使用されていないことを確認する、方法。
[実施例11]複数のSSPが、スーパーバイザ特権レベルに関連付けられた対応する複数のスーパーバイザシャドウスタックを指す、第1のSSPを含む複数のスーパーバイザSSPを含む、実施例10に記載の方法。
[実施例12]複数のSSPが、ユーザ特権レベルに関連付けられたユーザレベルのシャドウスタックを指す少なくとも1つのユーザレベルのSSPをさらに含む、実施例11に記載の方法。
[実施例13]第1のイベントが、第1のイベント優先度レベルに関連する第1の割り込みまたは第1の例外を含む、実施例10に記載の方法。
[実施例14]複数のSSPが、対応する複数のイベント優先度レベルに関連付けられる、実施例13に記載の方法。
[実施例15]第1のSSPが使用されていないことを確認することは、第1のSSPに関連するビジービットの値をチェックすることを含む、実施例10に記載の方法。
[実施例16]第1のSSPを検証および再検証することは、第1のSSPを第1のシャドウスタックの最上部に格納された第1のトークン値と比較することを含む、実施例15に記載の方法。
[実施例17]第1のデータスタックに関連付けられた第1のスーパーバイザ特権レベルで、第1のシャドウスタックに関連付けられた第1のデータスタックを使用して1つまたは複数の命令を実行することをさらに含む、実施例16に記載の方法。
[実施例18]プログラムコードが格納されている機械可読媒体であって、プログラムコードが機械によって実行されると、機械が、複数のシャドウスタックポインタ(SSP)を対応する複数のレジスタに格納し、各SSPが、異なるイベント優先度に関連付けられる、ことと、第1のイベント優先度レベルに関連付けられた第1のイベントの受信に応答して、複数のレジスタの第1のレジスタから複数のSSPの第1のSSPを選択し、第1のSSPが、第1のシャドウスタックの最上部を識別するために使用可能である、ことと、第1のSSPが以前に検証されているかどうかを判断することと、を含み、第1のSSPが以前に検証されていない場合は、一連のアトミック操作を開始して第1のSSPを検証し、第1のSSPが使用されていないことを確認し、一連のアトミック操作は、一連のアトミック操作が完了するまでデータをロックするロック操作を使用し、第1のSSPが以前に検証されている場合は、第1のSSPを再検証し、ロック操作を使用せずに第1のSSPが使用されていないことを確認する、という動作を実行する、機械可読媒体。
[実施例19]複数のSSPが、スーパーバイザ特権レベルに関連付けられた対応する複数のスーパーバイザシャドウスタックを指す、第1のSSPを含む複数のスーパーバイザSSPを含む、実施例18に記載の機械可読媒体。
[実施例20]複数のSSPが、ユーザ特権レベルに関連付けられたユーザレベルのシャドウスタックを指す少なくとも1つのユーザレベルのSSPをさらに含む、実施例19に記載の機械可読媒体。
[実施例21]第1のイベントが、第1のイベント優先度レベルに関連する第1の割り込みまたは第1の例外を含む、実施例18に記載の機械可読媒体。
[実施例22]複数のSSPが、対応する複数のイベント優先度レベルに関連付けられる、実施例21に記載の機械可読媒体。
[実施例23]第1のSSPが使用されていないことを確認することは、第1のSSPに関連付けられたビジービットの値をチェックすることを含む、実施例18に記載の機械可読媒体。
[実施例24]第1のSSPを検証および再検証することは、第1のSSPを第1のシャドウスタックの最上部に格納された第1のトークン値と比較することを含む、実施例23に記載の機械可読媒体。
[実施例25]第1のシャドウスタックに関連付けられた第1のデータスタックを使用して、第1のデータスタックに関連付けられた第1のスーパーバイザ特権レベルで、1つまたは複数の命令を実行する、という動作を機械に実行させるためのプログラムコードをさらに含む、実施例24に記載の機械可読媒体。
前述の明細書では、本発明の実施形態は、その特定の例示的な実施形態を参照して説明されてきた。しかしながら、添付の特許請求の範囲に記載されているように、本発明のより広い精神および範囲から逸脱することなく、さまざまな修正および変更を行うことができることは明らかであろう。したがって、本明細書および図面は、限定的な意味ではなく例示的な意味で見なされるべきである。
本発明の実施形態は、上で説明されたさまざまなステップを含み得る。ステップは、汎用または特殊目的のプロセッサにステップを実行させるために使用され得る機械実行可能命令で具体化され得る。あるいは、これらのステップは、ステップを実行するためのハードワイヤードロジックを含む特定のハードウェアコンポーネントによって、またはプログラムされたコンピュータコンポーネントとカスタムハードウェアコンポーネントの任意の組み合わせによって実行され得る。
本明細書で説明するように、命令は、特定の操作を実行するように構成された、または非一時的なコンピュータ可読媒体に具現化されたメモリに格納された所定の機能またはソフトウェア命令を有する特定用途向け集積回路(ASIC)などのハードウェアの特定の構成を指し得る。したがって、図に示される技術は、1つまたは複数の電子デバイス(たとえば、エンドステーション、ネットワーク要素など)に格納および実行されるコードおよびデータを使用して実装することができる。そのような電子デバイスは、非一時的なコンピュータ機械可読記憶媒体(たとえば、磁気ディスク、光ディスク、ランダムアクセスメモリ、読み取り専用メモリ、フラッシュメモリデバイス、位相変化メモリ)、および一時的なコンピュータの機械可読通信媒体(たとえば、電気、光、音響、またはその他の形式の伝搬信号(キャリア波、赤外線信号、デジタル信号など))などのコンピュータ機械可読媒体を使用して、コードおよびデータを(内部的におよび/またはネットワークを介して他の電子デバイスと)格納および通信する。さらに、そのような電子デバイスは、通常、1つまたは複数の記憶装置(非一時的な機械可読記憶媒体)、ユーザ入力/出力デバイス(たとえば、キーボード、タッチスクリーン、および/またはディスプレイ)、およびネットワーク接続などの1つまたは複数の他のコンポーネントに結合された1つまたは複数のプロセッサのセットを含む。プロセッサのセットと他のコンポーネントの結合は、通常、1つまたは複数のバスとブリッジ(バスコントローラとも呼ばれる)を介して行われる。ネットワークトラフィックを伝送する記憶装置および信号は、それぞれ、1つまたは複数の機械可読記憶媒体および機械可読通信媒体を表す。したがって、所与の電子デバイスの記憶装置は、通常、その電子デバイスの1つまたは複数のプロセッサのセット上で実行するためのコードおよび/またはデータを記憶する。もちろん、本発明の実施形態の1つまたは複数の部分は、ソフトウェア、ファームウェア、および/またはハードウェアの異なる組み合わせを使用して実装され得る。この詳細な説明を通して、説明の目的で、本発明の完全な理解を提供するために、多くの特定の詳細が述べられた。しかしながら、本発明がこれらの特定の詳細のいくつかなしで実施され得ることは当業者には明らかであろう。特定の例において、本発明の主題を曖昧にすることを回避するために、周知の構造および機能が詳細に説明されていない。したがって、本発明の範囲および精神は、以下の特許請求の範囲に関して判断されるべきである。
(項目1) 複数のシャドウスタックポインタ(SSP)を格納するための複数のレジスタであって、各SSPが、異なるイベント優先度に関連付けられている、複数のレジスタと、
第1のイベント優先度レベルに関連する第1のイベントの受信に応答して、上記複数のレジスタの第1のレジスタから上記複数のSSPの第1のSSPを選択するためのイベント処理回路であって、上記第1のSSPが、第1のシャドウスタックの最上部を識別するために使用可能である、イベント処理回路と、
上記第1のSSPが以前に検証されているかどうかを判断するための検証および使用チェック回路と、を備え、
上記第1のSSPが以前に検証されていない場合は、一連のアトミック操作を開始して上記第1のSSPを検証し、上記第1のSSPが使用されていないことを確認し、上記一連のアトミック操作は、上記一連のアトミック操作が完了するまでデータをロックするロック操作を使用し、
上記第1のSSPが以前に検証されている場合は、上記第1のSSPを再検証し、上記ロック操作を使用せずに上記第1のSSPが使用されていないことを確認する、プロセッサ。
(項目2) 上記複数のSSPが、スーパーバイザ特権レベルに関連付けられた対応する複数のスーパーバイザシャドウスタックを指す、上記第1のSSPを含む複数のスーパーバイザSSPを含む、項目1に記載のプロセッサ。
(項目3) 上記複数のSSPが、ユーザ特権レベルに関連付けられたユーザレベルのシャドウスタックを指す少なくとも1つのユーザレベルのSSPをさらに含む、項目2に記載のプロセッサ。
(項目4) 上記第1のイベントが、上記第1のイベント優先度レベルに関連する第1の割り込みまたは第1の例外を含む、項目1に記載のプロセッサ。
(項目5) 上記複数のSSPが、対応する複数のイベント優先度レベルに関連付けられる、項目4に記載のプロセッサ。
(項目6) 上記第1のSSPが使用されていないことを確認することは、上記第1のSSPに関連付けられたビジービットの値をチェックすることを含む、項目1に記載のプロセッサ。
(項目7) 上記第1のSSPを検証すること、および再検証することは、上記第1のSSPを、上記第1のシャドウスタックの最上部に格納された第1のトークン値と比較することを含む、項目6に記載のプロセッサ。
(項目8) 上記第1のシャドウスタックに関連付けられた第1のデータスタックを使用して、上記第1のデータスタックに関連付けられた第1のスーパーバイザ特権レベルで、1つまたは複数の命令を実行するための実行回路
をさらに備える、項目7に記載のプロセッサ。
(項目9) 上記イベント処理回路ならびに上記検証および使用チェック回路は、上記プロセッサの命令実行パイプラインの一部を含み、上記検証および使用チェック回路は、SSPの検証および使用チェックに関連する第1の一連の命令を実行するための上記命令実行パイプラインの第1の部分を含み、上記イベント処理回路は、イベント処理に関連する第2の一連の命令を実行するための上記命令実行パイプラインの第2の部分を含む、項目8に記載のプロセッサ。
(項目10) 複数のシャドウスタックポインタ(SSP)を対応する複数のレジスタに格納し、各SSPが、異なるイベント優先度に関連付けられる、ことと、
第1のイベント優先度レベルに関連付けられた第1のイベントの受信に応答して、上記複数のレジスタの第1のレジスタから上記複数のSSPの第1のSSPを選択し、上記第1のSSPが、第1のシャドウスタックの最上部を識別するために使用可能である、ことと、
上記第1のSSPが以前に検証されているかどうかを判断することと、を含み、
上記第1のSSPが以前に検証されていない場合は、一連のアトミック操作を開始して上記第1のSSPを検証し、上記第1のSSPが使用されていないことを確認し、上記一連のアトミック操作は、上記一連のアトミック操作が完了するまでデータをロックするロック操作を使用し、
上記第1のSSPが以前に検証されている場合は、上記第1のSSPを再検証し、上記ロック操作を使用せずに上記第1のSSPが使用されていないことを確認する、方法。
(項目11) 上記複数のSSPが、スーパーバイザ特権レベルに関連付けられた対応する複数のスーパーバイザシャドウスタックを指す、上記第1のSSPを含む複数のスーパーバイザSSPを含む、項目10に記載の方法。
(項目12) 上記複数のSSPが、ユーザ特権レベルに関連付けられたユーザレベルのシャドウスタックを指す少なくとも1つのユーザレベルのSSPをさらに含む、項目11に記載の方法。
(項目13) 上記第1のイベントが、上記第1のイベント優先度レベルに関連する第1の割り込みまたは第1の例外を含む、項目10に記載の方法。
(項目14) 上記複数のSSPが、対応する複数のイベント優先度レベルに関連付けられる、項目13に記載の方法。
(項目15) 上記第1のSSPが使用されていないことを確認することは、上記第1のSSPに関連付けられたビジービットの値をチェックすることを含む、項目10に記載の方法。
(項目16) 上記第1のSSPを検証すること、および再検証することは、上記第1のSSPを、上記第1のシャドウスタックの最上部に格納された第1のトークン値と比較することを含む、項目15に記載の方法。
(項目17) 上記第1のシャドウスタックに関連付けられた第1のデータスタックを使用して、上記第1のデータスタックに関連付けられた第1のスーパーバイザ特権レベルで、1つまたは複数の命令を実行すること、
をさらに含む、項目16に記載の方法。
(項目18) プログラムコードが格納されている機械可読媒体であって、上記プログラムコードが機械によって実行されると、上記機械が、
複数のシャドウスタックポインタ(SSP)を対応する複数のレジスタに格納し、各SSPが、異なるイベント優先度に関連付けられる、ことと、
第1のイベント優先度レベルに関連付けられた第1のイベントの受信に応答して、上記複数のレジスタの第1のレジスタから上記複数のSSPの第1のSSPを選択し、上記第1のSSPが、第1のシャドウスタックの最上部を識別するために使用可能である、ことと、
上記第1のSSPが以前に検証されているかどうかを判断することと、を含み、
上記第1のSSPが以前に検証されていない場合は、一連のアトミック操作を開始して上記第1のSSPを検証し、上記第1のSSPが使用されていないことを確認し、上記一連のアトミック操作は、上記一連のアトミック操作が完了するまでデータをロックするロック操作を使用し、
上記第1のSSPが以前に検証されている場合は、上記第1のSSPを再検証し、上記ロック操作を使用せずに上記第1のSSPが使用されていないことを確認する、
という動作を実行する、機械可読媒体。
(項目19) 上記複数のSSPが、スーパーバイザ特権レベルに関連付けられた対応する複数のスーパーバイザシャドウスタックを指す、上記第1のSSPを含む複数のスーパーバイザSSPを含む、項目18に記載の機械可読媒体。
(項目20) 上記複数のSSPが、ユーザ特権レベルに関連付けられたユーザレベルのシャドウスタックを指す少なくとも1つのユーザレベルのSSPをさらに含む、項目19に記載の機械可読媒体。
(項目21) 上記第1のイベントが、上記第1のイベント優先度レベルに関連する第1の割り込みまたは第1の例外を含む、項目18に記載の機械可読媒体。
(項目22) 上記複数のSSPが、対応する複数のイベント優先度レベルに関連付けられる、項目21に記載の機械可読媒体。
(項目23) 上記第1のSSPが使用されていないことを確認することは、上記第1のSSPに関連付けられたビジービットの値をチェックすることを含む、項目18に記載の機械可読媒体。
(項目24) 上記第1のSSPを検証すること、および再検証することは、上記第1のSSPを、上記第1のシャドウスタックの最上部に格納された第1のトークン値と比較することを含む、項目23に記載の機械可読媒体。
(項目25) 上記第1のシャドウスタックに関連付けられた第1のデータスタックを使用して、上記第1のデータスタックに関連付けられた第1のスーパーバイザ特権レベルで、1つまたは複数の命令を実行する
という動作を上記機械に実行させるためのプログラムコードをさらに含む、項目24に記載の機械可読媒体。