(57)【要約】      （修正有）【課題】投機実行されるメモリアクセス命令によるプロセッサの効率化を残しつつ、重要なデータが格納されているデータへのメモリアクセス命令の投機的実行を抑止する。【解決手段】演算処理装置において、命令制御部Ｉ＿ＣＮＴは、メモリアクセス命令が分岐命令の分岐先未確定中に投機的に実行される投機実行のメモリアクセス命令の場合、有効な投機フラグと分岐命令の命令識別子を、メモリアクセス命令に付加して発行する。第１レベルのキャッシュ制御部は、アドレス変換テーブルバッファのヒット判定で、発行された前記メモリアクセス命令の仮想アドレスがアドレス変換テーブルバッファのいずれかのエントリの仮想アドレスと一致する場合、発行されたメモリアクセス命令の投機フラグが有効で且つエントリが投機アクセスを禁止する投機アクセス禁止フラグを記憶するなら、発行されたメモリアクセス命令の実行を中断する。【選択図】図４
2019212128.tif 000002
【特許請求の範囲】
【請求項１】
命令を発行する命令制御部と、
メモリ内のアドレス変換テーブルの一部を記憶するアドレス変換テーブルバッファと、メモリ内の一部のデータを記憶する第１レベルのデータキャッシュメモリと、前記命令制御部が発行したメモリアクセス命令に応答して、前記アドレス変換テーブルバッファのヒット判定を行い、前記アドレス変換テーブルバッファのヒット判定がヒットの場合、前記第１レベルのデータキャッシュメモリに対するキャッシュ制御を行う第１レベルのキャッシュ制御部とを有する、第１レベルのキャッシュユニットと、
メモリ内の一部のデータを記憶する第２レベルのキャッシュメモリと、前記第１レベルのキャッシュ制御部が発行するデータ要求に応答して、前記データ要求を制御する第２レベルのキャッシュ制御部とを有する、前記第２レベルのキャッシュユニットとを有し、
前記命令制御部は、前記メモリアクセス命令が分岐命令の分岐先未確定中に投機的に実行される投機実行のメモリアクセス命令の場合、有効な投機フラグと前記分岐命令の命令識別子を、前記メモリアクセス命令に付加して前記第１レベルのキャッシュユニットに発行し、
前記第１レベルのキャッシュ制御部は、
（１）前記アドレス変換テーブルバッファのヒット判定で、発行された前記メモリアクセス命令の仮想アドレスが前記アドレス変換テーブルバッファのいずれかのエントリの仮想アドレスと一致する第１のケースの場合、
（１−１）発行された前記メモリアクセス命令の前記投機フラグが有効で且つ前記メモリアクセス命令の仮想アドレスと一致する仮想アドレスを有するエントリが投機アクセスを禁止する投機アクセス禁止フラグを記憶する第２のケースの場合なら、前記発行された前記メモリアクセス命令の実行を中断し、
（１−２）前記第２のケースに該当しない場合なら、前記アドレス変換テーブルバッファから読み出した物理アドレスで前記第１レベルのデータキャッシュメモリに対するキャッシュ制御を実行する、演算処理装置。
【請求項２】
前記第１レベルのキャッシュ制御部は、
（２）前記アドレス変換テーブルバッファのヒット判定で、発行された前記メモリアクセス命令の仮想アドレスが前記アドレス変換テーブルバッファの全てのエントリの仮想アドレスと不一致の第３のケースの場合、前記第２レベルのキャッシュユニットにアドレス変換テーブルのデータを要求するデータ要求を発行し、前記データ要求により取得した前記アドレス変換テーブルのデータで前記アドレス変換テーブルバッファを更新する、請求項１に記載の演算処理装置。
【請求項３】
前記命令制御部は、前記メモリアクセス命令が分岐命令の分岐先確定後に実行される非投機実行のメモリアクセス命令の場合、無効な前記投機フラグを前記メモリアクセス命令に付加して発行し、
前記第１レベルのキャッシュ制御部は、前記第１のケースの場合、前記第２のケースに該当しないと判定し、前記アドレス変換テーブルバッファから読み出した物理アドレスで前記第１レベルのデータキャッシュメモリに対するキャッシュ制御を実行する、請求項１に記載の演算処理装置。
【請求項４】
前記第１レベルのキャッシュ制御部は、前記命令制御部から発行されたメモリアクセス命令を記憶するメモリアクセスキューを有し、
前記命令制御部は、前記分岐命令の分岐先が確定した場合、分岐予測が成功か否かの情報と前記分岐命令の識別子とを付加した分岐確定通知を前記第１レベルのキャッシュ制御部に送信し、
前記第１レベルのキャッシュ制御部は、
前記分岐確定通知に応答して、
前記分岐予測が成功の場合、前記分岐確定通知に付加された前記分岐命令の識別子と一致する分岐命令の識別子を有する前記メモリアクセスキューに記憶されたメモリアクセス命令の前記投機フラグを無効化し、
前記分岐予測が失敗の場合、前記分岐確定通知に付加された前記分岐命令の識別子と一致するまたは後続する分岐命令の識別子を有する前記メモリアクセスキューに記憶されたメモリアクセス命令を無効化する、請求項１に記載の演算処理装置。
【請求項５】
前記第１レベルのキャッシュ制御部は、
前記メモリアクセスキューから発行された前記メモリアクセス命令に対する、前記第１レベルのキャッシュメモリへのアクセス制御を実行し、
前記メモリアクセスキューから発行された前記メモリアクセス命令が、前記第１のケースの場合で、更に前記第２のケースの場合、前記投機フラグが有効であれば、前記分岐確定通知に応答して前記投機フラグが無効化されるまで、前記メモリアクセスキューから発行しない、請求項４に記載の演算処理装置。
【請求項６】
前記命令制御部は、命令をデコードする命令デコーダと、前記命令デコーダから発行された命令を前記第１レベルのキャッシュ制御部に発行するリザベーションステーションとを有し、
前記命令デコーダが、前記投機フラグと前記分岐命令の命令識別子を付加して前記メモリアクセス命令を前記リザベーションステーションに発行し、
前記リザベーションステーションは、前記命令デコーダから発行された前記メモリアクセス命令を記憶するリザベーションステーションキューを有し、
前記リザベーションステーションは、
前記分岐確定通知に応答して、
前記分岐予測が成功の場合、前記分岐確定通知に付加された前記分岐命令の識別子と一致する分岐命令の識別子を有する前記リザベーションステーションキューに記憶されたメモリアクセス命令の前記投機フラグを無効化し、
前記分岐予測が失敗の場合、前記分岐確定通知に付加された前記分岐命令の識別子と一致するまたは後続する分岐命令の識別子を有する前記リザベーションステーションキューに記憶されたメモリアクセス命令を無効化する、請求項４に記載の演算処理装置。
【請求項７】
命令を発行する命令制御部と、
メモリ内のアドレス変換テーブルの一部を記憶するアドレス変換テーブルバッファと、メモリ内の一部のデータを記憶する第１レベルのデータキャッシュメモリと、前記命令制御部が発行したメモリアクセス命令に応答して、前記アドレス変換テーブルバッファのヒット判定を行い、前記アドレス変換テーブルバッファのヒット判定がヒットの場合、前記第１レベルのデータキャッシュメモリに対するキャッシュ制御を行う第１レベルのキャッシュ制御部とを有する、第１レベルのキャッシュユニットと、
メモリ内の一部のデータを記憶する第２レベルのキャッシュメモリと、前記第１レベルのキャッシュ制御部が発行するデータ要求に応答して、前記データ要求を制御する第２レベルのキャッシュ制御部とを有する、前記第２レベルのキャッシュユニットとを有する演算制御装置の制御方法であって、
前記命令制御部は、前記メモリアクセス命令が分岐命令の分岐先未確定中に投機的に実行される投機実行のメモリアクセス命令の場合、有効な投機フラグと前記分岐命令の命令識別子を、前記メモリアクセス命令に付加して前記第１レベルのキャッシュユニットに発行し、
前記第１レベルのキャッシュ制御部は、
（１）前記アドレス変換テーブルバッファのヒット判定で、発行された前記メモリアクセス命令の仮想アドレスが前記アドレス変換テーブルバッファのいずれかのエントリの仮想アドレスと一致する第１のケースの場合、
（１−１）発行された前記メモリアクセス命令の前記投機フラグが有効で且つ前記メモリアクセス命令の仮想アドレスと一致する仮想アドレスを有するエントリが投機アクセスを禁止する投機アクセス禁止フラグを記憶する第２のケースの場合なら、前記発行された前記メモリアクセス命令の実行を中断し、
（１−２）前記第２のケースに該当しない場合なら、前記アドレス変換テーブルバッファから読み出した物理アドレスで前記第１レベルのデータキャッシュメモリに対するキャッシュ制御を実行する、演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
演算処理装置は、プロセッサまたはCPU（Central Processing Unit）チップである。以下、演算処理装置をプロセッサと称する。プロセッサは、プログラムの命令を効率的に実行するために、様々な構成上または制御上の特徴を有する。その一つは、分岐命令の分岐条件が確定する前に分岐予測先の命令を投機的に実行する構成または制御である。
【０００３】
分岐命令の分岐先が確定するまで後続の命令を実行しない制御の場合、分岐先が確定するまでに必要とする時間が長くなればなるほど、何も実行できない状態が長くなる。そこで、分岐命令の後続の命令を投機実行する場合、分岐先が確定し分岐予測が正しいときには、性能向上につながる。分岐予測が誤りのときは、分岐命令の後続の命令の実行を全てキャンセルして、正しい分岐先の命令を実行することにより、プログラムは正常に動作する。投機実行の命令をキャンセルできるのは、投機実行された命令は、分岐先が確定するまで完了処理されず、命令セットで定義されたアーキテクチャレジスタを更新することがないからである。
【０００４】
プロセッサの投機実行やキャッシュメモリの制御などについては、以下の特許文献に記載されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１７−４１１４５号公報
【特許文献２】特開２００７−５２４８１号公報
【非特許文献】
【０００６】
【非特許文献１】Jann Horn, “Reading privileged memory with a side-channel”, [online], [searched on May 9, 2018], internet<https://googleprojectzero.blogspot.jp/2018/01/reading-privileged-memory-with-side.html?m=1>
【発明の概要】
【発明が解決しようとする課題】
【０００７】
以下のような悪意のプログラムにより、プロセッサのセキュリティの脆弱性を招くことが報告されている。即ち、分岐命令の分岐先未確定中に、誤った分岐先の悪意のあるロード命令を投機的に実行してメモリの特権モード領域内の秘密の値を読み出し、秘密の値をアドレスとするロード命令を投機的に実行して第１レベルのデータキャッシュメモリを更新し、更新されたデータキャッシュメモリのアクセスレイテンシの違いに基づいて秘密の値を取得する。
【０００８】
前述のセキュリティの脆弱性を防ぐためには、投機実行のロード命令の実行を中断し、分岐命令の分岐確定（分岐予測成功）を待ってロード命令の実行を再開すればよい。
【０００９】
しかし、一律に、分岐命令に後続するロード命令やストア命令の投機的な実行を、分岐確定まで待たせるようにすると、メモリアクセス命令の投機的実行によるプロセッサの処理効率化のメリットを活かすことができない。メモリアクセス命令は、キャッシュミスによりメインメモリにアクセスするというレイテンシが大きな処理が行われることがあり、投機的実行は処理の効率化には重要な制御方法の一つである。
【００１０】
そこで，本実施の形態の第1の側面の目的は，投機実行されるメモリアクセス命令によるプロセッサの効率化を残しつつ、重要なデータが格納されているデータへのメモリアクセス命令の投機的実行を抑止する演算処理装置及び演算処理装置の制御方法を提供することにある。  
【課題を解決するための手段】
【００１１】
本実施の形態の第１の側面は，
命令を発行する命令制御部と、
メモリ内のアドレス変換テーブルの一部を記憶するアドレス変換テーブルバッファと、メモリ内の一部のデータを記憶する第１レベルのデータキャッシュメモリと、前記命令制御部が発行したメモリアクセス命令に応答して、前記アドレス変換テーブルバッファのヒット判定を行い、前記アドレス変換テーブルバッファのヒット判定がヒットの場合、前記第１レベルのデータキャッシュメモリに対するキャッシュ制御を行う第１レベルのキャッシュ制御部とを有する、第１レベルのキャッシュユニットと、
メモリ内の一部のデータを記憶する第２レベルのキャッシュメモリと、前記第１レベルのキャッシュ制御部が発行するデータ要求に応答して、前記データ要求を制御する第２レベルのキャッシュ制御部とを有する、前記第２レベルのキャッシュユニットとを有し、
前記命令制御部は、前記メモリアクセス命令が分岐命令の分岐先未確定中に投機的に実行される投機実行のメモリアクセス命令の場合、有効な投機フラグと前記分岐命令の命令識別子を、前記メモリアクセス命令に付加して前記第１レベルのキャッシュユニットに発行し、
前記第１レベルのキャッシュ制御部は、
（１）前記アドレス変換テーブルバッファのヒット判定で、発行された前記メモリアクセス命令の仮想アドレスが前記アドレス変換テーブルバッファのいずれかのエントリの仮想アドレスと一致する第１のケースの場合、
（１−１）発行された前記メモリアクセス命令の前記投機フラグが有効で且つ前記メモリアクセス命令の仮想アドレスと一致する仮想アドレスを有するエントリが投機アクセスを禁止する投機アクセス禁止フラグを記憶する第２のケースの場合なら、前記発行された前記メモリアクセス命令の実行を中断し、
（１−２）前記第２のケースに該当しない場合なら、前記アドレス変換テーブルバッファから読み出した物理アドレスで前記第１レベルのデータキャッシュメモリに対するキャッシュ制御を実行する、演算処理装置である。
【発明の効果】
【００１２】
第１の側面によれば，投機実行されるメモリアクセス命令によるプロセッサの効率化を残しつつ、重要なデータが格納されているデータへのメモリアクセス命令の投機的実行を抑止することができる。
【図面の簡単な説明】
【００１３】
【図１】プロセッサの脆弱性を説明する図である。
【図２】分岐命令と後続の投機実行のメモリアクセス命令の動作例を示す図である。
【図３】図２の分岐命令とロード命令の処理のフローチャート図である。
【図４】本実施の形態における演算処理装置の概略的な構成を示す図である。
【図５】本実施の形態における分岐命令と後続の投機実行のメモリアクセス命令の動作例を示す図である。
【図６】本実施の形態における分岐命令とロード命令の処理のフローチャート図である。
【図７】本実施の形態のプロセッサを搭載する情報処理装置の概略図である。
【図８】本実施の形態におけるプロセッサの構成例を示す図である。
【図９】本実施の形態における命令デコーダの構成例を示す図である。
【図１０】RSAの構成例を示す図である。
【図１１】L1データキャッシュユニットの構成を示す図である。
【図１２】メモリアクセスキューの構成を示す図である。
【図１３】分岐確定した場合の、RSAの発行キュー内及びL1データキャッシュ内のメモリアクセスキュー内の各エントリの投機フラグに対する制御を示すフローチャート図である。
【図１４】L1データキャッシュ内のメモリアクセスキューのエントリ例と分岐確定時の制御例を示す図である。
【図１５】L1データキャッシュ内のL1TLB及びL1TLBヒット判定回路の一例を示す図である。
【図１６】L1キャッシュのメモリアクセス命令の実行処理の第１の例を示すフローチャート図である。
【図１７】L1キャッシュのメモリアクセス命令の実行処理の第１の例を示すフローチャート図である。
【図１８】L1キャッシュのメモリアクセス命令の実行処理の第１の例を示すフローチャート図である。
【発明を実施するための形態】
【００１４】
［プロセッサのセキュリティの脆弱性の例］
図１は、プロセッサの脆弱性を説明する図である。プロセッサのセキュリティの脆弱性は、例えば、以下の不正な命令列が実行された場合に生じる場合がある。
JMP C                        //分岐先Cに分岐する分岐命令//
B LOAD1 R0 [秘密値格納のアドレス] //秘密値が格納されたアドレスで投機的にロードし
レジスタR0に秘密値を格納//
A LOAD2  *[100+R0]          //レジスタR0内のアドレス（秘密値）で投機的にロードする//
上記の命令列には、分岐命令JMP Cの後ろに不正なロード命令“LOAD1”“LOAD2”が追加されている。不正なプログラムは、最初にキャッシュメモリの内容をクリアしておき、特権モード（OSモード）に遷移する（S91）。そして、プロセッサが、特権モードで、分岐命令JMP Cを実行する。分岐命令の分岐先Cが確定する前に、分岐予測先Bのロード命令LOAD1を投機的に実行する（S92）。この分岐予測先Bは分岐予測情報として不正に登録されていて、分岐命令の正しい分岐先はCであるとする。
【００１５】
プロセッサが、この誤った分岐予測先Bのロード命令LOAD1を投機的に実行すると、特権モードでしかアクセスが許可されていないプロテクトされたメモリ領域M0内の秘密値Xを読み出し、レジスタR0に格納する。このロード命令によりL1（Level-1）キャッシュメモリ内にも秘密値Xが登録される。
【００１６】
更に、秘密値Xをアクセス許可領域M1の先頭アドレス「100」に加算し（S93）、次のロード命令A LOAD2を投機的に実行する（S94）。すると、先頭アドレス[100]にレジスタR0内の秘密値Xを加算したアドレス100+Xのロード命令LOAD2が、L1キャッシュでキャッシュミスし、L2（Level-2）キャッシュにデータ要求を発行する。このデータ要求で、ユーザモードでアクセスが許可されているメモリのアクセス許可領域M1内のアドレス100+XのデータDA1が読み出される。この結果、プロセッサのL1キャッシュメモリ内のアドレス100+XのエントリにデータDA1が登録され、L1キャッシュの更新が行われる（S95）。
【００１７】
その後、プロセッサが、アドレスを変更しながら図示しないロード命令LOAD3を繰り返すと（S96）、データDA1が登録されているアドレス100+Xへのロード命令のアクセスレイテンシが他のアドレス100よりも短くなり、アドレス100+Xの内容を知ることができる。これにより、秘密値Xのセキュリティが低下する。
【００１８】
２つのロード命令LOAD1, LOAD2が投機的に実行された後、分岐命令JMP Cの実行が完了して分岐先が確定すると、分岐予測先Bが分岐予測ミスであったことが判明する。その結果、プロセッサ内のパイプライン回路で投機的に実行されたロード命令LOAD1, LOAD2が無効化され、レジスタR0の内容がクリアされる。投機実行の命令は未完了であり、リネーミングレジスタであるレジスタR0の内容はクリアされる。しかし、キャッシュメモリの内容はクリアされないため、キャッシュメモリのレイテンシに基づいて秘密値Xを獲得することができる。
【００１９】
このように、分岐命令JMPの分岐先が確定する前に、誤った分岐予測先の投機実行のロード命令LOAD1,LOAD2が実行されることと、LOAD2の実行によりキャッシュ登録状態が維持されることが、プロセッサの脆弱性の原因の一つである。
【００２０】
［分岐命令と投機実行のメモリアクセス命令］
図２は、分岐命令と後続の投機実行のメモリアクセス命令の動作例を示す図である。図２の横軸は時間を、縦軸はプログラムの順番を示す。図２では、分岐命令BRと、それに後続するロード命令LOAD_A及びロード命令LOAD_Bとが順番に発行される。
【００２１】
図３は、図２の分岐命令とロード命令の処理のフローチャート図である。図３を参照して、図２の分岐命令、ロード命令の処理について説明する。
【００２２】
分岐命令BRは、命令デコーダでデコードされ、実行可能な分岐命令にされて実行される（S1）。分岐命令BRは、分岐命令のソースデータを演算器などから受信した後、分岐先が確定され、命令が完了する。分岐命令がデコードされてから分岐先が確定するまでの分岐未確定の間にデコードされて発行される命令は、投機実行の命令である。図２中のロード命令LOAD_AとLOAD_Bは、いずれも分岐未確定中に発行されるので、投機実行のメモリアクセス命令である。
【００２３】
先発のロード命令LOAD_Aと後発のロード命令LOAD_Bは、共にデコードされ（S2）、メモリアクセス命令を処理するストレージユニットのリザベーションステーションであるRSA（Reservation Station for Address generation）から第1レベル（以下L1(Level 1)と称する）データキャッシュに発行され、L1データキャッシュ内のキューにキューインされる（S3）。L1データキャッシュ内のキューからL1データキャッシュ制御部に投入（入力）されたロード命令LOAD_Aは、L1TLBでキャッシュミスし、L1データキャッシュL1D$でもキャッシュミスし、一方、ロード命令LOAD_BはL1TLBでキャッシュヒットし、L1データキャッシュでもキャッシュヒットする命令である。
【００２４】
この場合、先発のロード命令LOAD_Aは、デコード後（S2）、RSAから発行され（S3）、L1データキャッシュ内のキューから投入（入力）されたロード命令LOAD_Aは、L1データキャッシュでTLBキャッシュミスし（S4のNO）、第２レベル（以下L2と称する）のキャッシュL2$にデータ要求が発行される（S5）。そして、L2キャッシュがデータ要求を実行してメインメモリからTLBデータを読み出してL1データキャッシュに応答し（S5）、応答されたデータでL1TLBが更新され（S6）、ロード命令の実行を終了する。
【００２５】
さらに、ロード命令LOAD_AがL1データキャッシュに再投入され、今度は、L1TLBでヒットし（S4のYES）、L1データキャッシュメモリでキャッシュミスし（S7のNO）、L2キャッシュにデータ要求が発行される（S8）。そして、L2キャッシュがデータ要求を実行してメインメモリからロードデータを読み出してL1データキャッシュに応答し（S8）、応答されたデータでL1データキャッシュメモリが更新され（S9）、ロード命令の実行を終了する。
【００２６】
再度ロード命令LOAD_AがL1データキャッシュに投入され、L1TLBヒット（S4のYES）、L1データキャッシュでヒットし（S7のYES）、L1データキャッシュメモリからロードデータが読み出され（S10）、ロード命令の実行が終了する（S11）。そして、直前の分岐命令BRの命令が完了した後、ロード命令LOAD_Aの完了処理が行われる。命令完了処理は命令をインオーダーで完了する制御であり、例えば、ロードデータをアーキテクチャレジスタに格納する処理を伴う。
【００２７】
一方、後発のロード命令LOAD_Bは、RSAから発行され（S3）、L1データキャッシュ内のキューから投入され、L1TLBでキャッシュヒットし（S4のYES）、更に、L1データキャッシュメモリでキャッシュヒットし（S7のYES）、ロードデータを読み出し（S10）、命令実行を終了する（S11）。そして、直前のロード命令LOAD_Aが命令完了処理された後、ロード命令LOAD_Bが完了処理される。
【００２８】
図２に示されたロード命令LOAD_A,LOAD_Bは、いずれも分岐命令BRの分岐予測が正しかった（分岐予測成功）場合である。分岐命令の分岐予測が正しくなかった（分岐予測失敗）の場合、投機実行された２つのロード命令LOAD_A,LOAD_Bは、命令の完了処理を行うことなく、無効化されキャンセルされる。分岐予測失敗に伴うロード命令の無効化により、命令デコーダから発行されたRSA内またはキャッシュ制御部内の投機実行のロード命令は無効化され、リネーミングレジスタに格納されていたロードデータも無効化される。
【００２９】
［本実施の形態の概略］
図４は、本実施の形態における演算処理装置の概略的な構成を示す図である。図４に示した演算処理装置は、命令制御部I_CNTを構成する命令デコーダI_DECと、命令デコーダが発行するメモリアクセス命令をキューインするRSAと、命令デコーダが発行する分岐命令をキューインするRSBR（Reservation Station for Branch）を有する。
【００３０】
更に、演算処理装置は、ストレージユニットSUを構成するオペランドアドレス生成器OP_ADD_GENと、L1データキャッシュL1D$とを有する。L1データキャッシュL1D$は、L2キャッシュL2$に接続される。また、固定小数点物理レジスタファイルFX_REGは、オペランドアドレス生成器が生成したアドレスや、L1データキャッシュL1D$から応答されるデータが格納される。固定小数点物理レジスタは、命令の完了処理前に処理結果が格納されるリネーミングレジスタと、命令の完了処理で処理結果が格納されるアーキテクチャレジスタを含む。
【００３１】
図５は、本実施の形態における分岐命令と後続の投機実行のメモリアクセス命令の動作例を示す図である。また、図６は、本実施の形態における分岐命令とロード命令の処理のフローチャート図である。図４，図６を参照して、図５の分岐命令、ロード命令の処理について説明する。
【００３２】
まず、命令デコーダI_DECは、分岐命令をデコードするとき（S1）、分岐命令に割り当てた命令識別子（BR_IID：BRidge Instruction ID）を保持し（S12）、分岐命令が分岐未確定中に有効になる投機フラグを保持する（S13）。そして、命令デコーダは、メモリアクセス命令であるロード命令をデコードするとき、分岐命令が分岐未確定中に実行される投機実行のメモリアクセス命令（ロード命令）に、その直前の分岐命令のBR_IIDと投機フラグを付加する。更に、命令デコーダは、メモリアクセス命令を、RSAに発行し、RSAの命令の発行キューにキューインする。
【００３３】
RSAは、メモリアクセス命令のオペランドアドレスの準備ができるなど実行可能になると、発行キュー内のメモリアクセス命令をストレージユニットSUに発行する（S3）。発行されたメモリアクセス命令は、オペランドアドレス生成器OP_ADD_GENでオペランドアドレスを生成された後、L1データキャッシュL1D$に送られる。
【００３４】
L1データキャッシュは、メモリアクセス命令がキューインされるメモリアクセスキューを有する。そして、メモリアクセス命令は、分岐命令のBR_IIDと投機フラグが付加されてL1データキャッシュに送られ、メモリアクセスキューに記憶される。
【００３５】
その後、メモリアクセスキューから投入されたメモリアクセス命令は、L1データキャッシュ内のL1TLBでTLBヒット判定される（S4,S12）。TLBヒット判定では、TLBの全エントリを、メモリアクセス命令のアクセス先アドレスの仮想アドレスで検索し、同じ仮想アドレスに対する変換テーブルを有するエントリの有無をチェックする（S4）。TLBのいずれかのエントリがメモリアクセス命令の仮想アドレスと一致する仮想アドレスを有する場合、TLBヒットとなり（S4のYES）、TLBが仮想アドレスに対応する物理アドレスを出力する。TLBは、仮想アドレスで検索し、検索の仮想アドレスと一致する仮想アドレスに関連付けられた物理アドレスを出力する、コンテンツアドレッサブルメモリ（またはコンテンツ連想メモリ）である。
【００３６】
本実施の形態では、アドレス変換テーブル内の、秘密の値などセキュリティ性の高い情報に対する特定の仮想アドレスのエントリに、投機アクセス禁止フラグINH_SP_ACCが格納される。アドレス変換テーブルは、メインメモリに記憶され、その一部がL1TLBにキャッシュ登録される。このアドレス変換テーブルへの投機アクセス禁止フラグの設定は、例えば、ユーザプログラムからの指示に基づいて、OS（Operating System）が実行する。したがって、L1TLBでも、特定の仮想アドレスのエントリで投機アクセス禁止フラグINH_SP_ACCが有効化される。
【００３７】
TLBヒット判定では、TLBのいずれかのエントリの仮想アドレスがメモリアクセス命令の仮想アドレスと一致すると（S4のYES）、メモリアクセス命令の投機フラグSP_ACCと、仮想アドレスが一致したエントリの投機アクセス禁止フラグINH_SP_ACCとが共に有効「１」か否かの判定が行われる（S12）。
【００３８】
共に有効の場合（S12のYES）、特定アドレス向け投機アクセス禁止によるTLBミスと判定され、メモリアクセス命令の処理を中断（アボート）して（S13）、ロード命令の実行を終了し（S11）、メモリアクセスキューに差し戻される。
【００３９】
一方、メモリアクセス命令の投機フラグSP_ACCと、仮想アドレスが一致したエントリの投機アクセス禁止フラグINH_SP_ACCのいずれかが無効「０」の場合（S12のNO）、TLBヒットと判定され、TLBの仮想アドレスが一致したエントリの物理アドレスが読み出されて、アドレス変換が行われる（S13）。
【００４０】
また、TLBヒット判定で、TLBの全てのエントリがメモリアクセス命令の仮想アドレスと不一致の場合（S4のNO）、L1データキャッシュ制御部は、L2キャッシュにTLBデータを要求し（S5）、L2キャッシュから受領したTLBデータでL1TLBを更新する（S6）。TLB内の全てのエントリの仮想アドレスがメモリアクセス命令の仮想アドレスと不一致の場合、一致するTLBエントリでTLBを更新し、その投機アクセス禁止フラグが有効か否かを判定する必要があるので、L2キャッシュにデータ要求してL1TLBを更新する。
【００４１】
次に、TLBヒットと判定されて（S12のNO）、TLBにより仮想アドレスが物理アドレスに変換されると（S13）、L1データキャッシュ内のL1データキャッシュメモリに対してキャッシュヒット判定される（S7）。キャッシュミスする場合（S7のNO）、L1データキャッシュ制御部は、L2キャッシュにデータ要求を発行してL2キャッシュからロードデータを取得し（S8）、L1データキャッシュメモリを更新する（S9）。この場合、再度メモリアクセス命令が投入されると、キャッシュヒットする（S7のYES）。
【００４２】
一方、キャッシュヒットする場合（S7のYES）、L1データキャッシュメモリからロードデータを読み出し（S10）、ロードデータを固定小数点レジスタのりネーミングレジスタに格納し、ロード命令の実行を終了する。
【００４３】
図５に示したロード命令LOAD_Aは、投機実行のロード命令であるため、命令デコーダから、投機フラグSP_ACCと分岐命令のBR_IIDとが付加されて、RSAに発行され、さらに、RSAからL1データキャッシュに発行される。図５の例では、投機実行のロード命令LOAD_Aが、投機アクセスが禁止されている特定アドレス向けのロード命令であったため、TLB判定S12でSP_ACC=1且つINH_SP_ACC=1の判定がYESとなり、ロード命令LOAD_Aの処理が中断されている。
【００４４】
そして、ロード命令LOAD_Aは分岐先確定待ち状態となり、分岐予測成功で分岐先確定となると、ロード命令の投機フラグSP_ACCが無効化（SP_ACC=0）される。この結果、TLB判定S12がNOとなり、TLBヒットとなる。そのため、ロード命令LOAD_Aは、L1データキャッシュメモリでキャッシュミスし（S7のNO）、一旦、L2キャッシュにデータ要求を発行してロードデータを読み出し（S8）、L1データキャッシュメモリを更新する（S9）。そして、再投入されると、TLBヒット（S4のYES,S12のNO）、L1データキャッシュヒット（S7のYES）、L1データキャッシュメモリからデータを読み出し（S10）、ロード命令の実行終了となる（S11）。
【００４５】
図５の例では、分岐命令が分岐確定し且つ分岐予測が正しかったため、２つのロード命令LOAD_A、LOAD_Bに対して、L1データキャッシュは、L2キャッシュからデータを取得し、L1データキャッシュまたはL1TLBキャッシュを更新している。もし、分岐予測が誤りであった場合、ロード命令LOAD_Aは、L2キャッシュにデータ要求することはなく無効化されると共に、ロード命令LOAD_Bも、命令の実行は終了しているが、命令の完了処理をされることなく、無効化される。
【００４６】
以上の通り、本実施の形態では、投機実行されるメモリアクセス命令が全てL1データキャッシュで中断されるわけではない。投機実行されるメモリアクセス命令が、L1TLBに一致する仮想アドレスのエントリが存在する場合でも、投機アクセスが禁止されている仮想アドレスにアクセスする場合に（INH_SP_ACC=1）、特定アドレス向け投機アクセス禁止によるTLBミスと判定され、TLBによるアドレス変換がされず、メモリアクセス命令の実行を中断する。そして、分岐命令が分岐予測成功で分岐確定するまで、その投機実行のメモリアクセス命令の実行を中断させられる。投機実行されるメモリアクセス命令でも、投機アクセスが禁止されている仮想アドレス以外のアドレスにアクセスする場合(INH_SP_ACC=0)は、その命令の実行は行われる。したがって、投機アクセスの制限によりプロセッサの処理効率が低下することが抑制される。
【００４７】
［本実施の形態のプロセッサ及びそれを有する情報処理装置］
図７は、本実施の形態のプロセッサを搭載する情報処理装置の概略図である。情報処理装置、HPC：High Performance Computerやスーパーコンピュータは、複数のノードそれぞれに、プロセッサCPU（Central Processing Unit）と、メインメモリM_MEMと、入出力部I/Oとを有する。各ノードのプロセッサCPUは、プロセッサ内に設けたインターコネクトを介して相互にパケット通信する。
【００４８】
演算処理装置であるプロセッサCPUは、複数のコアCORE_0〜CORE_nと、複数のコアで共有されるラストレベルキャッシュLL$（Last Level Cache）と、メモリへのアクセスを制御するメモリアクセス制御部MACと、他のノードのプロセッサとの間のパケット通信を制御するインターコネクトI_CNCTとを有する。各コアCOREは、後述するとおり、命令制御部と、演算器と、L1キャッシュとを有する。そして、図７のラストレベルキャッシュLL$は、例えば第２レベルキャッシュまたはL2キャッシュである。
【００４９】
図８は、本実施の形態におけるプロセッサの構成例を示す図である。図８のプロセッサは、命令制御部として、命令フェッチアドレス生成器I_F_ADD_GENと、L1命令キャッシュL1_ICACHEと、L2命令キャッシュL2_ICACHEと、命令バッファI_BUFと、命令デコーダI_DECと、複数の命令を演算器に発行する命令発行部である、リザベーションステーションRSA, RSE, RSFを有する。また、命令制御部は、分岐命令用リザベーションステーションRSBRと、コミットスタックエントリCSEを有する。
【００５０】
更に、プロセッサは、複数の演算器として、ストレージユニットSU、固定小数点演算器FX_EXC、浮動小数点演算器FL_EXCを有する。これらの演算器は、それぞれ単一または複数個を有する。
【００５１】
ストレージユニットSUは、アドレス計算するための加減算回路を含むオペランドアドレス生成器OP_ADD_GENと、L1データキャッシュL1_DCACHEを有する。L1データキャッシュは、キャッシュメモリに加えて、キャッシュメモリに対する制御を行うL1キャッシュ制御部L1$_CNTを有する。
【００５２】
また、固定小数点演算器FX_EXC、浮動小数点演算器FL_EXCは、例えば、加減算回路と論理演算器と乗算器などを有する。浮動小数点演算器は、例えば、SIMD（Single Instruction Multiple Data）演算ができるように、SIMD幅に対応した数の演算器を有する。プロセッサは、これらの演算器の処理結果を格納する固定小数点物理レジスタファイルFX_REGと、浮動小数点用レジスタファイルFL_REGを有する。これらのレジスタファイルは、複数のレジスタを有し、その一部は命令完了処理前に処理結果が格納されるリネーミングレジスタと、命令完了処理時に処理結果が格納されるアーキテクチャレジスタである。アーキテクチャレジスタは、ソフトウエアからアクセス可能なレジスタであり、汎用レジスタである。
【００５３】
プロセッサは、更に、複数のコアで共有されるL2キャッシュL2$を有し、図示しないメモリコントローラを介してメインメモリM_MEMに接続される。また、L2命令キャッシュL2_ICACHEもメモリコントローラを介してメインメモリM_MEMに接続される。L2キャッシュL2$は、前述のラストレベルキャッシュである。
【００５４】
プロセッサ全体の構成について、命令の処理の流れに沿って以下概略を説明する。命令フェッチアドレス生成器I_F_ADD_GENがフェッチアドレスを生成し、プログラム内の実行順に（インオーダーで）、L1命令キャッシュL1_ICACHEからフェッチ命令を一旦命令バッファI_BUFに格納する。そして、命令デコーダI_DECが、命令バッファ内のフェッチ命令をインオーダーで入力しデコードし、実行に必要な情報を付加した実行可能命令（実行命令）を生成する。
【００５５】
次に、命令デコーダで生成された実行命令は、インオーダーで、リザベーションステーションと呼ばれるキュー構造のストレージにキューインされ蓄積される。リザベーションステーションは、実行命令をキューに蓄積する実行キューであり、命令を実行する演算器毎に設けられる。
【００５６】
リザベーションステーションは、例えば、L1データキャッシュL1$を含むストレージユニットSUに設けられた、RSA（Reservation Station for Address generation）と、固定小数点演算器FX_EXCに設けられたRSE(Reservation Station for Execution)と、浮動小数点演算器FL_EXCに設けられたRSF（Reservation Station for Floating point）とを有する。さらに、分岐予測ユニットBR_PRDに対応するRSBR(Reservation Station for Branch)を有する。
【００５７】
以下、リザベーションステーションは、適宜、省略してRSと称する。
【００５８】
そして、各ＲＳにキューインされた実行命令は、命令実行に必要な入力オペランドが前の命令の演算処理の完了処理により汎用レジスタファイルから読み出し可能であるか否か（リードアフターライト（RAW）制約が満たされるか否か）や、演算器の回路資源を使用できるか否かなど、命令の実行条件が整ったものから、順不同で（アウトオブオーダーで）演算器に発行され演算器で実行される。
【００５９】
一方、命令デコーダI_DECは、フェッチ命令をデコードして生成した実行命令に、そのプログラム内の実行順に命令識別子（Instruction Identification: IID）を割り振り、実行命令をインオーダーでコミットスタックエントリCSE（Commit Stack Entry、以下CSEと称する）に送信する。CSEは、送信されてきた実行命令をインオーダーで格納するキュー構造のストレージと、演算器のパイプライン回路からの命令の処理完了報告に応答してキュー内の情報等に基づき各命令のコミット処理（完了処理）を行う命令コミット処理ユニットとを有する。したがって、CSEは命令の完了処理を行う完了処理回路（完了処理部）である。
【００６０】
実行命令は、CSE内のキューにインオーダーで格納され、各演算器からの命令の処理完了報告を待つ。そして、上記したとおり、各ＲＳから実行命令がアウトオブオーダーで演算器に送信され、演算器により実行される。その後、命令の処理完了報告がCSEに送られると、CSEの命令コミット処理ユニットが、キューに格納された処理完了報告待ちの命令の中から処理完了報告に対応する実行命令をインオーダーで完了処理し、レジスタなどの回路資源の更新を行う。CSEは、完了処理でプログラムカウンタPCをインクリメントする。
【００６１】
分岐処理用のRSBRにキューインされた分岐命令は、分岐予測ユニットBR_PRDによって分岐予測され、予測結果に基づいて命令フェッチアドレス生成器I_F_ADD_GENが分岐先アドレスを生成する。その結果、分岐予測に基づく命令が、命令キャッシュから読み出され、命令バッファ、命令デコーダを経由して、演算器により投機的に実行される。RSBRは、分岐命令をインオーダーで実行する。また、分岐命令の分岐先が確定する前に、分岐先を予測し、予測分岐先の命令を投機的に実行することが行われる。分岐予測が正しければ処理効率が上がり、一方、誤りであれば投機実行した命令はパイプライン内でキャンセルされるため処理効率が下がる。
【００６２】
［命令デコーダ］
図９は、本実施の形態における命令デコーダの構成例を示す図である。命令デコーダI_DECは、命令バッファI_BUF内の命令をインオーダーで入力し、命令をデコードし、分岐命令をRSBRに発行し、メモリアクセス命令をRSAに発行する。
【００６３】
命令デコーダI_DECは、フェッチ命令をデコードするデコーダ１０と、分岐命令の命令識別子BR_IIDとそのバリッドビットVを格納する分岐命令バッファ１２と、比較回路１４とを有する。命令デコーダ内のデコーダ１０は、分岐命令をデコードすると、分岐命令にBR_IIDを割り当てて、分岐命令バッファ１２に格納し、そのバリッドビットVを有効「１」にする。そして、デコーダ１０は、分岐命令をRSBRに発行する。
【００６４】
RSBRは、分岐命令の分岐先が確定すると、分岐確定を示す分岐確定通知信号BR_DTRと分岐命令のBR_IIDとを命令デコーダI_DECに送信する。命令デコーダ内の比較回路１４は、分岐命令バッファ１２内のBR_IIDとRSBRから分岐確定通知に付加されたBR_IIDとを比較し、一致すると、分岐命令バッファ１２のバリッドビットVを無効「０」にする。これにより、分岐確定状態となる。
【００６５】
そして、デコーダ１０は、新たに分岐命令をデコードすると、その分岐命令の命令識別子BR_IIDで分岐命令バッファ１２を更新する。このようにして、分岐命令バッファ１２には、最後にデコードした分岐命令のBR_IIDと、分岐未確定状態（バリッドビットVが「１」）か、分岐確定状態（バリッドビットVが「０」）かを示すバリッドビットVが格納される。
【００６６】
命令デコーダは、分岐命令が分岐未確定中に発行するメモリアクセス命令に、投機的実行のメモリアクセス命令であることを示す投機フラグSP_ACCと、未確定の分岐命令の命令識別子BR_IID（BRidge Instruction ID）とを付加して、RSAに発行する。投機フラグSP_ACCは、分岐命令バッファ１２のバリッドビットVと同じである。
【００６７】
一方、命令デコーダは、分岐命令が分岐確定後に発行するメモリアクセス命令に、分岐命令バッファ１２の分岐確定を示す無効なバリッド信号「０」に基づき、無効な投機フラグSP_ACC＝０を付加して、RSAに発行する。このメモリアクセス命令が実行されると、L1データキャッシュでTLBキャッシュ判定が、メモリアクセス命令の仮想アドレスVAがL1TLBのいずれかのエントリの仮想アドレスVAと一致する場合、SP_ACC=0によりTLBヒットと判定する。その結果、非投機実行のメモリアクセス命令は、TLBによりアドレス変換され、L1データキャッシュメモリでのキャッシュ判定でキャッシュヒットすると、L1データキャッシュメモリからデータを読み出し、命令の実行を終了する。
【００６８】
上記の通り、命令デコーダI_DECは、分岐命令が分岐未確定中に発行するメモリアクセス命令に、有効な投機フラグSP_ACCとその分岐命令のIIDとを付加して、RSAに発行する。一方、分岐確定後に発行するメモリアクセス命令には、無効な投機フラグSP_ACCを付加してRSAに発行する。
【００６９】
後述する通り、メモリアクセス命令は、RSAの発行キューに作成されたエントリに格納される。さらに、RSAがメモリアクセス命令を発行すると、発行されたメモリアクセス命令は、L1キャッシュ制御部内のメモリアクセスキューに作成されたエントリに格納される。そして、RSBRが分岐命令の分岐確定通知信号を分岐命令の命令識別子BR_IIDと共にRSAとL1キャッシュ制御部に送信すると、分岐予測が正しい場合は、RSA内の発行キューに格納されているメモリアクセス命令の投機フラグSP_ACCが無効化され、L1キャッシュ制御部のメモリアクセスキューに格納されているメモリアクセス命令の投機フラグSP_ACCも無効化される。
【００７０】
［RSA］
図１０は、RSAの構成例を示す図である。RSAは、発行キューRSA_QUEを有し、発行キューにエントリENTRY_0〜ENTRY_nを作成して、命令デコーダから発行されたメモリアクセス命令MA_Iをエントリに登録してキューインする。各エントリに登録（記憶）される情報は、エントリのバリッドビットVと、メモリアクセス命令MA_Iの情報（ロードかストアの種別、アクセス先アドレスに関する情報等）と、投機フラグSP_ACCと、分岐命令のBR_IIDである。
【００７１】
RSA内の発行キューの各エントリは、オペランドアドレスを生成するためのデータが揃ったら、そして、オペランドアドレス生成器やL1データキャッシュの資源が利用可能になると、ストレージユニットSUに発行される。また、各エントリが発行待ちの間にエントリ内のBR_IIDに対応する分岐命令の分岐先が確定すると、RSBRから分岐確定通知BR_DTRが、分岐先確定した分岐命令のBR_IIDと分岐予測が成功か失敗かの情報と共に、全エントリに送られる。各エントリには、分岐確定通知BR_DTRのBR_IIDと、エントリ内のBR_IIDとを比較し比較結果CMPを出力する比較回路２０が設けられる。
【００７２】
発行キューRSA_QUE内のエントリのメモリアクセス命令の投機フラグSP_ACCは、分岐命令が分岐予測成功で分岐確定されたとき、無効化される。また、エントリのメモリアクセス命令のバリッドビットは、分岐命令が分岐予測失敗で分岐確定されたとき、無効化される。これらの処理は、L1データキャッシュ内のメモリアクセスキュー内のエントリのメモリアクセス命令に対する制御と同じである。従って、分岐命令が分岐確定したときの発行キューRSA_QUE内のエントリに対する制御については、メモリアクセスキューと一緒に後で説明する。
【００７３】
［L1データキャッシュとそのメモリアクセスキュー］
図１１は、L1データキャッシュユニットの構成を示す図である。L1データキャッシュユニット（以下簡略してL1データキャッシュと称する）L1D$は、オペランドアドレス生成器OP_ADD_GENと共にストレージユニットSUを構成する。RSAから発行されたメモリアクセス命令は、オペランドアドレス生成器によりオペランドアドレスを生成され、L1データキャッシュ内のメモリアクセスキューMA_QUEにエントリを作成する。このエントリには、メモリアクセス命令の情報と、投機フラグSP_ACCと、分岐命令のBR_IIDと、後述するL1データキャッシュで特定アドレス向け投機アクセス禁止によるTLBミスしたことを示すL1TLBミスフラグL1TLB_MISSとが登録（記憶）される。
【００７４】
L1データキャッシュL1D$内には、L1データキャッシュメモリ３４と、L1TLB３５とを有する。L1データキャッシュメモリ３４には、メインメモリ内のデータの一部がそのタグ情報と共に記憶される。また、L1TLB３５には、メインメモリ内のアドレス変換テーブルの一部が記憶される。
【００７５】
L1データキャッシュユニットL1D$は、メモリアクセスキューから投入されたエントリのメモリアクセス命令に対してキャッシュ制御するL1データキャッシュ制御部L1D$_CNTを有する。L1データキャッシュ制御部L1D$_CNTは、L1TLBヒット判定回路３１と、L1データキャッシュヒット判定回路３０と、L1TLB実行制御部３３と、L1データキャッシュ実行制御部３２とを有する。
【００７６】
メモリアクセスキューMA_QUE内のエントリがL1データキャッシュ制御部L1D$_CNTのパイプライン回路に投入（入力）されると、L1データキャッシュ制御部L1D$_CNTは、L1TLB３５の全エントリから仮想アドレスを読み出し、L1TLBヒット判定回路３１に送る。そして、L1TLBヒット判定回路３１は、投入されたエントリの仮想アドレスが、L1TLB３５の全エントリの仮想アドレスと一致するか否か判定することで、L1TLB３５のいずれかのエントリの仮想アドレスが一致するかまたは全てのエントリの仮想アドレスが不一致かの判定を行う。
【００７７】
L1TLB３５のエントリのいずれかの仮想アドレスが一致すれば、メモリアクセス命令の投機フラグSP_ACCと、仮想アドレスが一致したTLBエントリ内の投機アクセス禁止フラグINH_SP_ACCとに基づいて、特定アドレス向け投機アクセス禁止によるTLBミスか否かの判定が行われる。（１）投機フラグが有効（SP_ACC=1）且つ投機アクセス禁止フラグが有効（INH_SP_ACC=1）なら、特定アドレス向け投機アクセス禁止によるTLBミスとなり、L2キャッシュへのデータ要求をすることなく、メモリアクセス命令は中断され、メモリアクセスキューに差し戻される。（２）一方、投機フラグが無効（SP_ACC=0）または投機アクセス禁止フラグが無効（INH_SP_ACC=0）なら、TLBヒットと判定される。
【００７８】
逆に、L1TLB３５の全てのエントリが不一致なら通常のTLBミスとなり、L1TLB実行制御部が、L2キャッシュにデータ要求してL1TLBが更新される。
【００７９】
TLBヒットと判定されると、L1TLB３５から変換後アドレスが読み出され、L1データキャッシュヒット判定回路３０に送られる。そして、L1データキャッシュヒット判定回路３０が、オペランドアドレスに基づいてL1データキャッシュメモリ３４からタグデータを読み出し、タグデータと変換後物理アドレスに基づいて、L1データキャッシュヒット判定を行う。
【００８０】
データキャッシュヒットの場合、L1データキャッシュ実行制御部３２は、通常通りL1データキャッシュメモリ３４からデータを読み出して、データ応答する。このデータ応答により、読み出したデータは固定小数点物理レジスタファイルFX_REG内のリネーミングレジスタに記憶される。
【００８１】
一方、データキャッシュミスの場合、L1データキャッシュ実行制御部３２は、L2キャッシュにデータを要求するデータ要求を発行する。
【００８２】
L2キャッシュユニットL2$は、L2キャッシュメモリ３６と、L2キャッシュ制御部L2$_CNTを有する。L2キャッシュ制御部は、L1データキャッシュ制御部が発行するデータ要求を処理して、L2キャッシュヒットならL2キャッシュメモリ３６から、L2キャッシュミスならメインメモリからデータを読み出して、L1データキャッシュ制御部のL1データキャッシュ実行制御部３２またはL1TLB実行制御部３３にデータ応答する。
【００８３】
図１２は、メモリアクセスキューの構成を示す図である。メモリアクセスキューMA_QUEは、RSAのキューと同様に、複数のエントリENTRY_0〜ENTRY_nを有する。但し、図１２には、一つのエントリENTRY_0のみが示され、その他のエントリENTRY_1〜ENTRY_nはまとめて示される。また、メモリアクセスキューの各エントリには、RSBRからの分岐確定通知BR_DTRに付加されるBR_IIDとエントリ内のBR_IIDとを比較する比較回路２２が設けられる。
【００８４】
メモリアクセスキューの各エントリには、バリッドビットVと、メモリアクセス命令MA_Iのデータと、投機フラグSP_ACCと、分岐命令のBR_IIDとが記憶され、更に、RSAのキューと異なり、エントリが特定アドレスへの投機アクセスのTLBミスしたことを示すL1TLBミスフラグL1TLB_MISSが記憶される。
【００８５】
メモリアクセスキューにエントリが作成されるとき、バリッドビットVは有効「１」にされ、エントリの実行処理が終了するとバリッドビットVは無効「０」にされる。また、メモリアクセス命令MA_Iのデータと、投機フラグSP_ACCと、分岐命令のBR_IIDとは、RSAから発行されたときの状態で記憶される。一方、L1TLBミスフラグL1TLB_MISSは、エントリ作成時は無効「０」の状態である。そして、エントリを実行したとき、特定アドレス向け投機アクセス禁止によるTLBミスするとL1TLB実行制御部３３により、L1TLBミスフラグL1TLB_MISSは有効「１」に変更される。
【００８６】
一旦、L1TLBミスフラグL1TLB_MISSが有効になると、投機フラグSP_ACCが有効である限り、そのエントリはメモリアクセスキューから発行されない。理由は、発行しても再度特定アドレス向け投機アクセス禁止によるTLBミスとなり、L2キャッシュへのデータ要求は抑止され、命令の実行が中断され、メモリアクセスキューに差し戻されるからである。そして、分岐命令が分岐予測成功で分岐確定して投機フラグSP_ACCが無効になると、エントリはメモリアクセスキューから発行される。
【００８７】
図１３は、分岐確定した場合の、RSAの発行キュー内及びL1データキャッシュ内のメモリアクセスキュー内の各エントリの投機フラグに対する制御を示すフローチャート図である。図１３を参照しながら、分岐確定時の、図１０のRSAのエントリ内の投機フラグに対する制御と、図１２のメモリアクセスキューのエントリ内の投機フラグに対する制御をまとめて説明する。
【００８８】
分岐命令が確定していなければ（S30のNO）、RSBRから分岐命令の分岐先が確定したことを通知する分岐確定通知がなく、エントリ内の投機フラグSP_ACCは現状の状態のまま保持される（S31）。一方、分岐命令が確定すると（S30のYES）、RSBRから分岐確定通知BR_DTRがRSA内の発行キュー及びL1データキャッシュ内のメモリアクセスキューに送信される。
【００８９】
分岐確定通知の分岐予測が正しかった場合（S32のYES）、RSA及びL1データキャッシュ制御部は、各エントリの投機フラグが有効「１」の場合（S33のYES）、比較回路２０により分岐確定通知に付加された分岐先確定した分岐命令のBR_IIDとエントリ内の分岐命令のBR_IIDとが一致すると判定されると（S35のYES）、そのエントリの投機フラグSP_ACCを無効「０」に変更する（S36）。これにより、エントリのメモリアクセス命令は非投機実行の命令となる。また、不一致のエントリの投機フラグSP_ACCは有効のまま保持される（S37）。
【００９０】
一方、分岐確定通知の分岐予測が誤りであった場合（S32のNO）、RSA及びL1データキャッシュ制御部は、比較回路２０により分岐確定通知に付加された分岐先確定した分岐命令のBR_IIDとエントリ内の分岐命令のBR_IIDとが比較され（S38）、エントリの分岐命令のBR_IIDが、分岐確定した分岐命令のBR_IIDと一致またはそれの後続の分岐命令のBR_IIDと一致する場合（S39のYES）、投機失敗を意味するので、エントリのバリッドビットVを無効化する（S40）。これにより無効化されたエントリの命令はキャンセルされる。一方、RSA及びL1データキャッシュ制御部は、エントリの分岐命令のBR_IIDが、分岐確定した分岐命令のBR_IIDと不一致またはそれの後続の分岐命令のBR_IIDと不一致の場合（S39のNO）、エントリの投機フラグSP_ACCを現状の状態のまま保持する（S41）。
【００９１】
図１４は、L1データキャッシュ内のメモリアクセスキューのエントリ例と分岐確定時の制御例を示す図である。まず、命令制御部I_CNT内の命令デコーダI_DECは、IID＝0x1〜0x5の５つの命令をRSAまたはRSBRに発行する。命令デコーダI_DECは、５つの命令のうち、分岐命令BR(A), BR(B)をRSBRに発行し、メモリアクセス命令であるロード命令LD(A)、ストア命令ST(A)、ロード命令（B）をRSAに発行する。そして、RSAの発行キューにロード命令LD(A)、ストア命令ST(A)、ロード命令（B）のエントリが生成される。
【００９２】
更に、RSAは、発行キュー内のエントリをL1データキャッシュユニットL1D$に発行し、メモリアクセスキューMA_QUEにエントリを生成する。これらのメモリアクセス命令には、命令種やアクセス情報などのメモリアクセス命令の情報MA_Iに加えて、投機フラグSP_ACCとそれぞれの直前の分岐命令のBR_IIDと、L1TLBミスフラグL1TLB_MISSが付加される。
【００９３】
メモリアクセスキューに３つの命令LD(A),ST(A),LD(B)のエントリが作成され、それぞれの投機フラグSP_ACCは全て有効「１」である。この状態で、RSBRが、分岐命令R(A)（BR_IID=0x1）が分岐予測成功で分岐確定したことを示す分岐確定通知BR_DTRを、RSAとL1データキャッシュに送信する。この分岐確定通知BR_DTRには、分岐予測の成功／失敗の情報と、分岐確定した分岐命令のBR_IIDが付加される。
【００９４】
この分岐確定通知BR_DTRに応答して、メモリアクセスキュー内の分岐命令のBR_IID=0x1の命令LD(A)とST(A)の投機フラグSP_ACCは、有効「１」から無効「０」に変更される。
【００９５】
［L1データキャッシュ内のL1TLB及びL1TLBヒット判定回路］
図１５は、L1データキャッシュ内のL1TLB及びL1TLBヒット判定回路の一例を示す図である。図１５には、RSAやRSBRなどの命令制御部I_CNTと、L1データキャッシュ制御部L1D$_CNT内のメモリアクセスキューMA_QUEと、L1TLB３５の構成例と、L1TLBヒット判定回路３１の論理構成の例が示される。
【００９６】
メモリアクセスキューMA_QUEには、エントリENTRYと、分岐命令のBR_IIDを比較する比較回路２２とが含まれる。エントリENTRYには、アクセス先アドレスを含むメモリアクセス命令の情報MA_Iと、投機フラグSP_ACCと、分岐命令のBR_IIDが格納される。メモリアクセス命令MA_Iのアクセス先アドレスの一部が仮想アドレスVAである。また、ここではL1TLBミスフラグL1TLB_MISSは省略されている。
【００９７】
L1TLBは、複数のエントリを有する。図１５の例では、L1TLBは４つのエントリENTRYを有するものとする。L1TLBは、仮想アドレスVAを記憶するTLB1と、変換後の物理アドレスPAを記憶するTLB3と、投機アクセス禁止フラグINH_SP_ACCを記憶するTLB2とを有する。メインメモリ内のアドレス変換テーブルも、同様に、仮想アドレスVA、投機アクセス禁止フラグINH_SP_ACC、物理アドレスPAを記憶する。L1TLBには、メインメモリ内のアドレス変換テーブルの一部のエントリが記憶される。
【００９８】
尚、プロセッサが複数のプログラム（またはプロセス）を並列に実行し、複数のプログラム間で仮想アドレスが重複する場合、TLB1には各プログラムの識別子としてのコンテキストIDと、仮想アドレスVAとが記憶される。
【００９９】
次に、L1TLBヒット判定回路３１は、L1TLBの各エントリENTRY毎に設けられる。図１５には、４つのL1TLBヒット判定回路３１が示され、最も左側のL1TLBヒット判定回路のみ内部の論理回路が示される。L1TLBヒット判定回路３１は、メモリアクセスキューのエントリのメモリアクセス命令の仮想アドレスVAと、L1TLB内のエントリの仮想アドレスVAとが一致するか否かを判定する仮想アドレス一致回路（マッチ回路）MTCHを有する。仮想アドレス一致回路MTCHは仮想アドレスマッチ信号VAM_0を出力する。
【０１００】
さらに、L1TLBヒット判定回路３１は、メモリアクセスキューのエントリENTRYのメモリアクセス命令の投機フラグSP_ACCと、L1TLB内のエントリENTRYの投機アクセス禁止フラグINH_SP_ACCとの論理積（AND）を出力する投機アクセス禁止検出回路AND1を有する。投機アクセス禁止検出回路AND1は、SP_ACC=1且つINH_SP_ACC=1が真か否かを示す投機アクセス禁止信号INH_0を出力する。
【０１０１】
そして、L1TLBヒット判定回路３１は、仮想アドレスマッチ信号VAM_0と投機アクセス禁止信号INH_0の反転信号（インバータINVによる反転信号）との論理積を出力するアンド回路AND2を有し、アンド回路AND2は、TLBヒット信号TLB_HIT_0を出力する。
【０１０２】
他の３つのL1TLBヒット判定回路３１も上記と同じ構成を有し、それぞれTLBヒット信号TLB_HIT_1, TLB_HIT_2, TLB_HIT_3を出力する。更に、４つの仮想アドレスマッチ信号VAM_0〜VAM_3の論理和を出力するオア回路ORを有する。オア回路ORの出力VAMは、いずれか一つのエントリの仮想アドレスが一致した場合に「１」となり、全エントリで不一致の場合に「０」となる。
【０１０３】
セレクタSLCTは、L1TLBのTLB3の４つのエントリの物理アドレスPAのうち一つの物理アドレスPAを、４つのL1TLBヒット判定回路３１がそれぞれ出力するTLBヒット信号TLB_HIT_0〜TLB_HIT_3に基づいて、選択する。
【０１０４】
仮想アドレス一致回路MTCHは、L1TLBのいずれか１つのエントリに対してのみ仮想アドレスマッチ信号VAM_#を「１」にするか、全エントリに対して仮想アドレスマッチ信号VAM_#を「０」にするかのいずれかの動作をする。そして、投機アクセス禁止検出回路AND1は、投入されたメモリアクセス命令の投機フラグがSP_ACC=1の場合に、投機アクセス禁止フラグINH_SP_ACC=1のエントリに対してのみ投機アクセス禁止信号INH_#を「１」にする。
【０１０５】
L1TLBヒット判定回路３１によるLTBヒット判定は、次のように行われる。
（１）仮想アドレス一致回路MUCHが、L1TLBのいずれか１つのエントリに対してのみ仮想アドレスマッチ信号VAM_#を「１」にした場合（オア回路ORの出力VAMが「１」）、
（１−１）その一致（マッチ）したエントリに対する投機アクセス禁止検出回路AND1の出力INH_#が真「１」であれば、特定アドレスの投機アクセス禁止によるTLBミスと判定する。この場合、アンド回路AND2の出力の全てのTLBヒット信号TLB_HIT_#は「０」となり、セレクタSLCTはいずれの物理アドレスPAも選択しない。つまり、TLB変換は行われない。後述する図１７のS61のYES、S62のYESの場合に該当する。
（１−２）その一致（マッチ）したエントリに対する投機アクセス禁止検出回路AND1の出力INH_#が偽「０」であれば、TLBヒットと判定する。この場合、アンド回路AND2の出力のTLBヒット信号TLB_HIT_#（#=0-3）は一つだけ「１」となり、セレクタSLCTは一つの物理アドレスPAを選択する。後述する図１７のS61のYES、S62のNOの場合に該当する。
（２）仮想アドレス一致回路MUCHが、L1TLBの全エントリに対して仮想アドレスマッチ信号VAM_#を「０」にした場合（オア回路ORの出力VAMが「０」）、投機アクセス禁止検出回路AND1の結果をチェックする必要性がないので、通常のTLBミスと判定する。この場合、アンド回路AND2の出力の全てのTLBヒット信号TLB_HIT_#は「０」となり、セレクタSLCTはいずれの物理アドレスも選択しない。後述する図１７のS61のNOに該当する。
【０１０６】
上記のとおり、（１−１）と（２）は、いずれも全てのTLBヒット信号TLB_HIT_#が「０」になり、セレクタSLCTはいずれのエントリの物理アドレスも選択しないので、TLBミスに該当する。しかし、（１−１）の場合は、いずれか一つのエントリに対する仮想アドレスマッチ信号VAM_#が「１」、そのエントリの投機アクセス禁止信号INH_#は「１」であるのに対して、（２）の場合は、全エントリに対する仮想アドレスマッチ信号VAM_#は「０」であり、（１−１）は特定アドレスの投機アクセス禁止のTLBミス、（２）は通常のTLBミスと判定される。
【０１０７】
［L1データキャッシュでのメモリアクセス命令の実行処理］
図１６、図１７、図１８は、L1キャッシュのメモリアクセス命令の実行処理の第１の例を示すフローチャート図である。図１６は、L1キャッシュのメモリアクセスキューでのエントリの投入制御を示し、図１７は、L1データキャッシュ制御部でのL1TLBキャッシュヒット判定とTLBミスした場合の処理を示し、図１８は、L1データキャッシュ制御部でのL1データキャッシュヒット判定とL1データキャッシュメモリに対する処理を示す。
【０１０８】
図１６を参照して、L1データキャッシュのメモリアクセスキューでのエントリの投入制御を説明する。メモリアクセスキューのエントリについて（S50）、投機フラグSP_ACCが有効「１」で（S51のYES）、L1TLBミスフラグL1TLB_MISSが有効「１」の場合（S52のYES）、そのエントリは実行不可であり（S53）、そのエントリはメモリアクセスキュー内に留まる（滞留する）（S54）。L1TLBミスフラグL1TLB_MISSは、前述の特定アドレス向け投機アクセス禁止によるTLBミスした場合に、有効にされるフラグである。このようなエントリは、L1データキャッシュで実行しても、再度L1データキャッシュL1D$で特定アドレスの投機アクセス禁止のTLBミスして、メモリアクセスキューに差し戻されるので、分岐確定で投機フラグが無効化されるまで、メモリアクセスキューから投入されない。
【０１０９】
一方、メモリアクセスキューのエントリについて（S50）、投機フラグSP_ACCが無効「０」（S51のNO）、または、L1TLBミスフラグL1TLB_MISSが無効「０」（S52のNO）の場合、そのエントリはメモリアクセスキューから実行可能である（S55）。そこで、メモリアクセスキューから実行可能なエントリを選択できる場合（S56のYES）、選択したエントリをL1データキャッシュ制御部に投入（入力）する（S58）。選択できない場合（S56のNO）、そのエントリはメモリアクセスキューに差し戻される（S57）。ここで、実行可能なエントリを選択できる場合とは、実行可能なエントリが複数存在し、自分より古いエントリが選択されるなどの場合である。
【０１１０】
次に、図１７，図１８を参照して、L1データキャッシュ制御部での制御を説明する。図１７で、L1データキャッシュ制御部は、メモリアクセスキューから投入されたエントリの実行を開始する（S60）。まず、L1データキャッシュ制御部のL1TLBヒット判定回路３１は、L1TLB３５のTLBヒット判定を行う（S61,S62）。TLBヒット判定では、L1TLBヒット判定回路が、図１５の仮想アドレス一致回路MTCHの仮想アドレスマッチ信号VAM_#の論理和を出力するオア回路ORの出力VAMに基づいて、いずれか一つのエントリで仮想アドレスVAが一致したか（VAM=1）、全エントリで仮想アドレスが不一致か（VAM=0）を判定する（S61）。
【０１１１】
（１）いずれか一つのエントリで仮想アドレスVAが一致した場合（VAM=1、S61のYES）、一致したエントリの投機アクセス禁止検出回路AND1の投機アクセス禁止信号INH_#に基づいて、メモリアクセス命令が投機実行中（SP_ACC=1）で、且つ、一致したエントリが投機実行メモリアクセス命令ではアクセスを禁止されているアドレスである（INH_SP_ACC=1）であるか否かを判定する（S62）。
【０１１２】
（１−１）投機アクセス禁止信号INH_#＝１であれば、投機アクセスが禁止されているアドレスのエントリと判定され、特定アドレス向け投機アクセス禁止によるTLBミスと判定される（S62のYES）。この場合、L1データキャッシュ制御部のL1TLB実行制御部３３は、TLBによるアドレス変換を行わず、メモリアクセス命令のエントリの実行を中断し（S64）、L1TLBミスフラグL1TLB_MISSを有効「１」にして（S65）、メモリアクセス命令をメモリアクセスキューに差し戻す（S66）。
【０１１３】
（１）いずれか一つのエントリで仮想アドレスVAが一致した場合（VAM=1、S61のYES）、
（１−２）投機アクセス禁止信号INH_#＝０であれば、投機アクセスが禁止されているアドレスのエントリではないと判定され、TLBヒットと判定される（S62のNO）。この場合、L1データキャッシュ制御部は、TLBによるアドレス変換を行い変換後の物理アドレスPAを取得し（S63）、L1データキャッシュメモリに対する制御に推移する（S70）。
【０１１４】
（２）全エントリで仮想アドレスVAが不一致の場合（VAM=0、S61のNO）、通常のTLBミスと判定される。この場合、メモリアクセス命令の仮想アドレスVAと一致する仮想アドレスVAを持つエントリがないので、投機アクセス禁止信号INH_#の判定は無意味となる。そこで、L1データキャッシュ制御部のL1TLB実行制御部３３は、L2キャッシュにTLBデータを要求するデータ要求を発行し（S67）、L2キャッシュから応答されたTLBデータでL1TLBを更新し（S68）、メモリアクセス命令をメモリアクセスキューに差し戻す（S69）。その後、メモリアクセス命令は再度L1データキャッシュ制御部のパイプラインに投入され、L1TLBヒット判定される（S61のYES,S62のNO）。
【０１１５】
L1データキャッシュでTLBヒットした後、図１８で、L1データキャッシュヒット判定回路３０が、L1データキャッシュメモリのタグ情報を読み出し、データキャッシュヒット判定を行う（S71）。データキャッシュヒットと判定されると（S71のYES）、L1データキャッシュ実行制御部３２が、L1データキャッシュメモリからデータを読み出し、データ応答する（S80）。これにより、エントリの実行処理が終了し（S81）、そのエントリはバリッドビットVを無効にされ、メモリアクセスキューから解放される（S82）。
【０１１６】
一方、データキャッシュミスと判定されると（S71のNO）、L1データキャッシュ実行制御部３２は、L2キャッシュへのデータ要求を発行し（S76）、L2キャッシュから読み出したデータ（アクセス先データ）でL1データキャッシュメモリ３４を更新する（S77）。そして、一旦、エントリをメモリアクセスキューに差し戻す（S78）。この場合、再度エントリがメモリアクセスキューから投入されると、L1データキャッシュメモリでデータキャッシュヒットし（S71のYES）、L1データキャッシュメモリからデータを読み出してデータ応答し（S80）、処理を終了する（S81）。
【０１１７】
L1データキャッシュのメモリアクセス命令の実行処理の別の例として、L1データキャッシュのメモリアクセスキューのエントリに、L1TLBミスフラグL1TLB_MISSを記憶せず、L1データキャッシュで特定アドレス向け投機アクセス禁止によるTLBミスをしても、L1TLBミスフラグを有効にして、その後メモリアクセスキュー内にエントリを滞留させる制御を行わないようにしてもよい。但し、この場合は、特定アドレスの投機メモリアクセスによるTLBミスをしたメモリアクセス命令がメモリアクセスキューから再投入されて、同様のTLBミスを繰り返す場合がある。
【０１１８】
以上説明したとおり、本実施の形態によれば、分岐命令が分岐未確定中に投機実行されるメモリアクセス命令のうち、投機アクセスが禁止される特定アドレスのメモリアクセス命令か否かを、L1TLBヒット判定で判定する。そして、特定アドレスの投機アクセス命令の場合は、L1TLBによるアドレス変換を実行せず、投機アクセス命令の実行を中断（アボート）し、メモリアクセスキューに差し戻す。これにより、図１で説明した特権メモリ領域M0に対する投機実行のロード命令LOAD1の実行を禁止して、プロセッサのセキュリティが脆弱になることを防止する。
【０１１９】
但し、投機実行されるメモリアクセス命令でも、投機アクセスが禁止される特定アドレス向けでない場合は、通常通り、メモリアクセス命令の仮想アドレスがL1TLBのいずれかのエントリの仮想アドレスと一致する場合はTLBヒットと判定し、L1TLBの据えてのエントリの仮想アドレスと不一致の場合はTLBミスと判定する。TLBヒットであれば、L1データキャッシュメモリのキャッシュ判定を行う。TLBミスであれば、L2キャッシュにTLBデータを要求し、取得したTLBデータでL1TLBを更新する。
【０１２０】
したがって、投機実行されるメモリアクセス命令のうち、プロセッサのセキュリティを脆弱化する可能性のある命令は投機実行を禁止し、脆弱化する可能性のない命令は通常通り投機実行を許可する。その結果、投機実行によるプロセッサの処理の効率化の低下を最小限に抑えて、セキュリティの脆弱化を防止することができる。
【符号の説明】
【０１２１】
I_DEC：命令デコーダ
RSA：主記憶オペランドアドレス生成用リザベーションステーション
RSBR：分岐命令用リザベーションステーション
L1D$：L1データキャッシュユニット
L1D$_CNT：L1データキャッシュ制御部
３０：L1データキャッシュヒット判定回路
３１：L1TLBヒット判定回路
３２：L1データキャッシュ実行制御部
３３：L1TLB実行制御部
３４：L1データキャッシュメモリ
３５：L1TLB
L2$：L2キャッシュユニット
３６：L2キャッシュメモリ
L2$_CNT：L2キャッシュ制御部
MA_I：メモリアクセス命令
BR_IID：分岐命令の命令識別子
SP_ACC：投機フラグ
V：バリッドビット
RSA_QUE：RSAの発行キュー
MA_QUE：L1キャッシュユニットのメモリアクセスキュー
ENTRY：エントリ
INH_SP_ACC：投機アクセス禁止フラグ
MTCH：仮想アドレス一致回路
VAM_0：仮想アドレスマッチ信号
VAM：全エントリ仮想アドレスマッチ信号
AND1：投機アクセス禁止検出回路
INH_0：投機アクセス禁止信号
TLB_HIT_#：TLBヒット信号
VA：仮想アドレス
PA：物理アドレス
【図１】
2019212128.tif 000003
【図２】
2019212128.tif 000004
【図３】
2019212128.tif 000005
【図４】
2019212128.tif 000006
【図５】
2019212128.tif 000007
【図６】
2019212128.tif 000008
【図７】
2019212128.tif 000009
【図８】
2019212128.tif 000010
【図９】
2019212128.tif 000011
【図１０】
2019212128.tif 000012
【図１１】
2019212128.tif 000013
【図１２】
2019212128.tif 000014
【図１３】
2019212128.tif 000015
【図１４】
2019212128.tif 000016
【図１５】
2019212128.tif 000017
【図１６】
2019212128.tif 000018
【図１７】
2019212128.tif 000019
【図１８】
2019212128.tif 000020