(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-10-27
(45)【発行日】2023-11-07
(54)【発明の名称】トレースデータの取扱い
(51)【国際特許分類】
G06F 11/07 20060101AFI20231030BHJP
G06F 11/34 20060101ALI20231030BHJP
G06F 11/30 20060101ALI20231030BHJP
【FI】
G06F11/07 151
G06F11/34 180
G06F11/30 140H
G06F11/07 140H
【外国語出願】
(21)【出願番号】P 2020116776
(22)【出願日】2020-07-07
【審査請求日】2022-03-16
(32)【優先日】2019-07-10
(33)【優先権主張国・地域又は機関】GB
(73)【特許権者】
【識別番号】520161964
【氏名又は名称】シーメンス インダストリー ソフトウェア インコーポレイテッド
(74)【代理人】
【識別番号】100114890
【氏名又は名称】アインゼル・フェリックス=ラインハルト
(74)【代理人】
【識別番号】100098501
【氏名又は名称】森田 拓
(74)【代理人】
【識別番号】100116403
【氏名又は名称】前川 純一
(74)【代理人】
【識別番号】100134315
【氏名又は名称】永島 秀郎
(74)【代理人】
【識別番号】100135633
【氏名又は名称】二宮 浩康
(74)【代理人】
【識別番号】100162880
【氏名又は名称】上島 類
(72)【発明者】
【氏名】ロバートソン・イアン
【審査官】安藤 一道
(56)【参考文献】
【文献】米国特許第06973563(US,B1)
【文献】特開昭63-200234(JP,A)
【文献】特開昭62-296232(JP,A)
【文献】LIU, Chen et al.,Leveraging microarchitectural side channel information to efficiently enhance program control flow integrity,2014 International Conference on Hardware/Software Codesign and System Synthesis (CODES+ISSS),2014年10月12日,pp. 1-9
(58)【調査した分野】(Int.Cl.,DB名)
G06F 11/07
G06F 11/34
G06F 11/30
(57)【特許請求の範囲】
【請求項1】
プロセッサ(1)によって実行されるプログラムのフローを監視するプロセッサ監査ユニット(3)であって、前記監査ユニット(3)は、前記プログラムのフローにおけるジャンプの後に前記プログラムのフローがリターンすると予想されるロケーションを表す1セットの値を保存するように適合されており、
前記ユニット(3)は、
下記の1つ以上から前記プログラムのフローを推定することができ、
i)前記プロセッサが命令を要求する
メモリ(2)内のロケーション;
ii)前記プロセッサ(1)を前記メモリ(2)に接続するバス(5)を介して前記プロセッサ(1)へと通過する命令の内容;
iii)前記プロセッサ(1)が命令を実行したとき、前記プロセッサ(1)が前記監査ユニット(3)に直接報告すること;
第1モードにおいて、前記プログラムのフローにおけるジャンプを検出したとき、前記プログラムのフローが前記ジャンプからリターンすると予想されるロケーションを表すロケーション値を保存することができ、
第2モードにおいて、前記プログラムのフローにおけるジャンプを検出したとき、前記プログラムのフローが前記ジャンプからリターンすると予想されるロケーションを表すロケーション値と関連付けられたカウンタをインクリメントできる、
プロセッサ監査ユニット。
【請求項2】
前記ユニット(3)は、前記第1モードにおいて動作することにより、所定の数以下の数のロケーション値を同時に保存するように構成されている、請求項1に記載のプロセッサ監査ユニット。
【請求項3】
前記ユニット(3)は、前記プログラムのフローにおいて、前記第1モードの動作によってロケーション値が保存されたジャンプまたは前記第2モードの動作によってカウンタがインクリメントされたジャンプに対応するリターンを検出したとき、
(i)前記プログラムのフローがリターンした実際のロケーションと、(ii)前記ロケーション値のそれぞれによって示されるとおり、プログラムのフローがリターンすると予想されていたロケーションとを比較し、
これらのロケーションが一致しないという判断に応答して、前記実際のリターンロケーションの表示のログを取るように、または、離れた場所にいる使用者に前記実際のリターンロケーションを報告するように構成されている、
請求項1または2に記載のプロセッサ監査ユニット。
【請求項4】
前記ユニット(3)は、順序付きのロケーション値のセットを保存するように構成されている、請求項1から3のいずれか一項に記載のプロセッサ監査ユニット。
【請求項5】
前記ユニット(3)は、前記プログラムのフローにおいて、前記プログラムのフローが第1のロケーションにリターンすると予想されている第1のジャンプを検出したとき、最後に保存されたロケーション値が前記第1のロケーションを示している場合、前記第1モードで動作し、それ以外の場合、前記最後に保存されたロケーションと関連付けられたカウンタが最大でないときは、第2モードで動作して前記カウンタをインクリメントするように構成されている、請求項4に記載のプロセッサ監査ユニット。
【請求項6】
前記第1のジャンプは回帰ジャンプである、請求項5に記載のプロセッサ監査ユニット。
【請求項7】
前記監査ユニット(3)は、各ロケーション値をそれぞれ保存する複数のストア(80)と、ポインタ(82)とにアクセス可能であり、前記監査ユニット(3)は、前記ポインタ(82)に前記ロケーション値のうちの1つを指定させることによって、カウンタ(81)と当該ロケーション値を関連付けるように構成されている、請求項1から6のいずれか一項に記載のプロセッサ監査ユニット。
【請求項8】
前記監査ユニット(3)は、各ロケーション値をそれぞれ保存する複数のストア(80)と、前記ストア(80)よりも少ない数の複数のカウンタ(81)と、各カウンタ(81)につき1つ設けられた複数のポインタ(82)とにアクセス可能であり、前記監査ユニット(3)は、カウンタ(81)に対応するポインタ(82)に前記ロケーション値のうちの1つを指定させることによって、前記カウンタ(81)と当該ロケーション値を関連付けるように構成されている、請求項7に記載のプロセッサ監査ユニット。
【請求項9】
前記監査ユニット(3)は、2つの連続するストア(80)が同一のロケーション値を保存しているとき、これらのロケーション値と関連付けられたカウンタ(81)を、ビット単位で組み合わされた1つのカウンタとして扱うように構成されている、請求項2に従属する請求項8に記載のプロセッサ監査ユニット。
【請求項10】
前記監査ユニット(3)は、各ロケーション値をそれぞれ保存する複数のストア(80)にアクセス可能であり、前記ストア(80)のそれぞれと関連付けられたカウンタ(81)が設けられている、請求項1から7のいずれか一項に記載のプロセッサ監査ユニット。
【請求項11】
前記監査ユニット(3)は、2つの連続するストア(80)が同一のロケーション値を保存しているとき、これらのロケーション値と関連付けられたカウンタ(81)を、ビット単位で組み合わされた1つのカウンタとして扱うように構成されている、請求項2に従属する請求項10に記載プロセッサ監査ユニット。
【請求項12】
前記ジャンプまたは前記ジャンプのそれぞれは、サブルーチンコールによるものである、請求項1から11のいずれか一項に記載のプロセッサ監査ユニット。
【請求項13】
プロセッサ(1)によって実行されるプログラムのフローを監視するプロセッサ監査ユニット(3)を動作させる方法であって、前記監査ユニット(3)は、前記プログラムのフローにおけるジャンプの後に前記プログラムのフローがリターンすると予想されるロケーションを表す1セットの値を保存するように適合されており、
前記方法は、
下記の1つ以上から前記プログラムのフローを推定するステップと、
i)前記プロセッサが命令を要求する
メモリ(2)内のロケーション;
ii)前記プロセッサ(1)を前記メモリ(2)に接続するバス(5)を介して前記プロセッサ(1)へと通過する命令の内容;
iii)前記プロセッサ(1)が命令を実行したとき、前記プロセッサ(1)が前記監査ユニット(3)に直接報告すること;
第1モードにおいて、前記プログラムのフローにおけるジャンプを検出したとき、前記プログラムのフローが前記ジャンプからリターンすると予想されるロケーションを表すロケーション値を保存するステップと、
第2モードにおいて、前記プログラムのフローにおけるジャンプを検出したとき、前記プログラムのフローが前記ジャンプからリターンすると予想されるロケーションを表すロケーション値と関連付けられたカウンタをインクリメントするステップと、
を含む、方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、トレースデータの取扱い(例えば、トレースデータの保存、伝達または解釈)に関する。
【背景技術】
【0002】
従来、プロセッサにより実行されるプログラムはメモリに保存されている。プログラムは多数の個別の命令から構成される。各命令は特定のメモリロケーションで開始される。プログラムの通常動作時には、プログラムは、1つの命令から次の命令へと、メモリに保存された順番で進む。あるいは、プログラムは、第1の命令から、当該第1の命令の直ぐ後にはない他の命令へと進むことができる。これはジャンプと呼ばれる。ジャンプが発生する最も一般的な状況は、プログラムが新たなサブルーチンに入るとき又はサブルーチンから戻るときである。
【0003】
監査機能またはエンコーダを用いてプロセッサの動作を監査することが知られている。この監査機能は、プロセッサの動作を追跡し、これらの動作を記録して分析のために他のエンティティに報告することができる。監査機能により収集されるデータは、プロセッサ上で動作するプログラムのデバッグを補助するため、または安全性もしくはセキュリティ上の理由のためにプロセッサの不正確もしくは異常な動作の監視を行うために用いることができる。収集されるデータには、プログラムが実行した命令の順序を示すデータが含まれていてもよい。これはトレースデータとして知られている。
【0004】
プロセッサが高速で動作しているとき、監査機能は、大量のデータを高速で収集することができる。監査機能により収集されているデータを簡易化して、効率的に保存または送信できるようにすることが望ましい。例えば、監査機能が、プログラムにより実行された全ての命令のログを取る場合、大量のデータが関わることになる。
【0005】
監査機能により収集されるデータを簡易化する1つの方法としては、プログラムのフローが、1つの命令から次の命令へとメモリに保存された順番で進み、サブルーチンへのジャンプに続いて、ジャンプ後の命令にリターンすると仮定することである。これに伴う問題は、ジャンプがその後の命令にリターンしない場合が存在するという点である。例を挙げると、エラーハンドラがトリガされたとき、または、コンパイラがプログラムのフローにおいて低レベルの最適化を実行したときである。したがって、プログラムのフローについてログを取得または報告する際、ジャンプについての情報を収集することが望ましい。
【0006】
1つの単純なアプローチとしては、監査機能に、ログを取得または報告したコールの数を記録させることである。エンコーダは、コールを報告する都度カウントをインクリメントし、リターンが生じるとカウンタをデクリメントする。リターンが生じたときにカウンタがゼロでない場合、ログを取得または報告した情報が、リターンアドレスの推定を可能とするために十分なものとなっていると仮定することができる。カウンタはオーバーフローまたはアンダーフローしないように抑制される。このスキームは実装が容易であり、多数のネストされたコールを記録することができる。短所としては、このスキームは、プログラムが常に予想アドレスに戻ることに依拠しているという点である。これは限られたセットのプログラムにのみ該当し、他のプログラムについては、サブルーチンがスタックにおいてリターンアドレスを変更する状況、つまり、プログラムが、デコーダが予想する場所にリターンしない状況が存在する。
【0007】
代替的に、ジャンプについて収集された情報は、最も通常の挙動として、プログラムが1つのロケーション(“X”)からサブルーチンにジャンプし、その後、プログラムが当該サブルーチンからリターンしたとき、この同じロケーションXの直ぐ後にある命令にリターンするものとして扱うことができる。リターンロケーションは、プログラムがジャンプを行うときに保存することができる。プログラムがサブルーチンからリターンするとき、リターンが生じた実際のアドレスを確認することができる。このアドレスが、保存されたロケーションと同じであれば、通常の挙動とみなしてプログラムの挙動を再構築できるので、データのログを取る必要はない。そうでない場合、リターンロケーションのログを取るか、このロケーションを報告する。
【0008】
このアプローチに関する問題は、プログラムが、多数のネストされたレベルのジャンプまたはサブルーチンコールを実行する場合、監査機能は、全ての予想リターンアドレスを保存するために大容量のメモリを必要とするという点である。これが起こる場合の例としては、プログラムが回帰アルゴリズムを実行する場合である。監査機能は、利用可能なメモリを超過したときにジャンプのログを取得または報告することもできるが、これは費用が高くなるか、非効率となり得る。
【発明の概要】
【発明が解決しようとする課題】
【0009】
トレースデータを取扱う代替的な方法が必要とされている。
【課題を解決するための手段】
【0010】
1つの態様によると、プロセッサによって実行されるプログラムのフローを監視するプロセッサ監査ユニットであって、前記監査ユニットは、前記プログラムのフローにおけるジャンプの後に前記プログラムのフローがリターンすると予想されるロケーションを表す1セットの値を保存するように適合されており、前記ユニットは、第1モードにおいて、前記プログラムのフローにおけるジャンプを検出したとき、前記プログラムのフローが前記ジャンプからリターンすると予想されるロケーションを表すロケーション値を保存することができ、かつ、第2モードにおいて、前記プログラムのフローにおけるジャンプを検出したとき、前記プログラムのフローが前記ジャンプからリターンすると予想されるロケーションを表すロケーション値と関連付けられたカウンタをインクリメントできる、プロセッサ監査ユニットが提供される。
【0011】
第2の態様によると、プロセッサによって実行されるプログラムのフローを監視するためにプロセッサ監査ユニットを動作させる方法であって、前記監査ユニットは、前記プログラムのフローにおけるジャンプの後に前記プログラムのフローがリターンすると予想されるロケーションを表す1セットの値を保存するように適合されており、前記方法は、第1モードにおいて、前記プログラムのフローにおけるジャンプを検出したとき、前記プログラムのフローが前記ジャンプからリターンすると予想されるロケーションを表すロケーション値を保存することと、第2モードにおいて、前記プログラムのフローにおけるジャンプを検出したとき、前記プログラムのフローが前記ジャンプからリターンすると予想されるロケーションを表すロケーション値と関連付けられたカウンタをインクリメントすることとを含む方法が提供される。
【0012】
前記ユニットは、前記第1モードにおいて動作することにより、所定の数以下の数のロケーション値を同時に保存するように構成されていてもよい。いずれか1つの前記ロケーション値をそれぞれ保持する所定の数のメモリスロットが予め割り当てられていてもよい。
【0013】
前記ユニットは、前記プログラムのフローにおいて、前記第1モードの動作によってロケーション値が保存されたジャンプまたは前記第2モードの動作によってカウンタがインクリメントされたジャンプに対応するリターンを検出したとき、(i)前記プログラムのフローがリターンした実際のロケーションと、(ii)前記ロケーション値のそれぞれによって示されるとおり、プログラムのフローがリターンすると予想されていたロケーションとを比較し、これらのロケーションが一致しないという判断に応答して、前記実際のリターンロケーションの表示のログを取るように、または、離れた場所にいる使用者に前記実際のリターンロケーションを報告するように構成されていてもよい。
【0014】
前記ユニットは、順序付きのロケーション値のセットを保存するように構成されていてもよい。
【0015】
前記ユニットは、前記プログラムのフローにおいて、前記プログラムのフローが第1のロケーションにリターンすると予想されている第1のジャンプを検出したとき、最後に保存されたロケーション値が前記第1のロケーションを示している場合、前記第1モードで動作し、それ以外の場合、前記最後に保存されたロケーションと関連付けられたカウンタが最大(full)でないときは、第2モードで動作して前記カウンタをインクリメントするように構成されていてもよい。
【0016】
前記第1のジャンプは回帰ジャンプであってもよい。
【0017】
前記監査ユニットは、各ロケーション値をそれぞれ保存する複数のストアと、ポインタとにアクセス可能であってもよい。前記監査ユニットは、前記ポインタに前記ロケーション値のうちの1つを指定させることによって、カウンタと当該ロケーション値を関連付けるように構成されていてもよい。
【0018】
前記監査ユニットは、各ロケーション値をそれぞれ保存する複数のストアと、前記ストアよりも少ない数の複数のカウンタと、各カウンタにつき1つ設けられた複数のポインタとにアクセス可能であってもよい。前記監査ユニットは、カウンタに対応するポインタに前記ロケーション値のうちの1つを指定させることによって、前記カウンタと当該ロケーション値を関連付けるように構成されていてもよい。
【0019】
前記監査ユニットは、2つの連続するストアが同一のロケーション値を保存しているとき、これらのロケーション値と関連付けられたカウンタを、ビット単位で組み合わされた1つのカウンタとして扱うように構成されていてもよい。
【0020】
前記監査ユニットは、各ロケーション値をそれぞれ保存する複数のストアにアクセス可能であってもよい。前記ストアのそれぞれと関連付けられたカウンタが設けられていてもよい。
【0021】
前記監査ユニットは、2つの連続するストアが同一のロケーション値を保存しているとき、これらのロケーション値と関連付けられたカウンタを、ビット単位で組み合わされた1つのカウンタとして扱うように構成されていてもよい。
【0022】
前記ジャンプまたは前記ジャンプのそれぞれは、サブルーチンコールによるものであってもよい。
【0023】
第3の態様によると、プロセッサによって実行されるプログラムのフローを監視するプロセッサ監査ユニットであって、前記監査ユニットは、前記プログラムのフローにおけるジャンプの後に前記プログラムのフローがリターンすると予想されるロケーションを表す1セットの値を保存するように適合されており、前記ユニットは、前記プログラムのフローを監視し、プログラムのフローにおいてサブルーチンコールと関連付けられたジャンプを検出し、かつ、そうしたジャンプを検出したことに応答して、前記プログラムのフローが前記ジャンプからリターンすると予想される予想リターンアドレスの表示を保存するように構成されており、前記ユニットは、i)前記予想リターンアドレスを表すロケーション値を保存することを含む第1の機構と、ii)前記予想リターンアドレスを表すロケーション値であって、それよりも前に保存されたロケーション値と関連付けられたカウンタをインクリメントすることを含む第2の機構との両方によって、前記表示を保存することができるプロセッサ監査ユニットが提供される。
【0024】
第4の態様によると、プロセッサによって実行される前記プログラムのフローを監視するプロセッサ監査ユニットを動作させる方法であって、前記監査ユニットは、前記プログラムのフローにおけるジャンプの後に前記プログラムのフローがリターンすると予想されるロケーションを表す1セットの値を保存するように適合されており、前記方法は、前記プログラムのフローを監視し、プログラムのフローにおいてサブルーチンコールと関連付けられたジャンプを検出することと、そうしたジャンプを検出したことに応答して、異なる時点において、i)前記予想リターンアドレスを表すロケーション値を保存することを含む第1の機構と、ii)前記予想リターンアドレスを表すロケーション値であって、それよりも前に保存されたロケーション値と関連付けられたカウンタをインクリメントすることを含む第2の機構との両方によって、前記プログラムのフローが前記ジャンプからリターンすると予想される予想リターンアドレスの表示を保存することと、を含む方法が提供される。
【0025】
前記監査ユニットは、連続的なジャンプ動作を表す順序付きのロケーション値のセットを保存するように構成されていてもよい。前記監査ユニットは、順序において前記最後に保存されたロケーション値が前記予想リターンアドレスを表していない場合、前記第1の機構を採用し、順序において前記最後に保存されたロケーション値が前記予想リターンアドレスを表している場合、前記第1の機構を採用するように構成されていてもよい。
【0026】
前記カウンタは、当該カウンタが取り得る所定の最大値を有していてもよい。前記ユニットは、前記カウンタにおいて所定の数量以下の数量を保存するように構成されていてもよい。前記監査ユニットは、順序において前記最後に保存されたロケーション値が、前記予想リターンアドレスを表し、かつ、前記ロケーション値と関連付けられた前記カウンタが前記所定の最大値となっている場合、前記第1の機構を採用するように構成されていてもよい。
【0027】
前記ユニットは、任意の1回において、カウンタを1つのロケーション値のみと関連付けるように構成されていてもよい。
【0028】
前記ユニットは、前記ロケーション値のうち、前記カウンタが関連付けられたロケーション値を示すデータを保存するように構成されていてもよい。
【0029】
前記ユニットは、各ロケーション値とそれぞれ関連付けられた複数のカウンタを記録するように構成されていてもよい。
【0030】
前記ユニットは、2つの連続するロケーション値が同一の予想リターンアドレスを表し、各前記ロケーション値がそれぞれ対応付けられたカウンタを有する場合、前記カウンタを表すビットを、バイナリ形式で値を集合的に表すものとして扱うように構成されていてもよい。
【0031】
前記ユニットは、サブルーチンからのリターンであって、実際のリターンアドレスへのリターンを検出したとき、前記実際のリターンアドレスが、順序において前記最後に保存されているロケーション値によって示される前記予想リターンアドレスと一致するか判断し、これらのアドレスが一致しない場合は、そのイベントのログを取得またはそのイベントを報告し、当該ロケーション値と関連付けられたカウンタであって、インクリメントされた値を有するカウンタが存在する場合は、このカウンタをデクリメントし、このカウンタが存在しない場合は、前記ロケーション値を削除するように構成されていてもよい。
【0032】
前記監査ユニットは、前記プロセッサから、当該プロセッサが実行する前記命令の前記アドレスの表示を取得することによってプログラムのフローを監視してもよい。
【0033】
以下において、添付の図面に言及しつつ、本発明を例示的に説明する。
【図面の簡単な説明】
【0034】
【
図1】データ処理システムのアーキテクチャの図である。
【発明を実施するための形態】
【0035】
図1には、データ処理システムが示されている。このシステムは、プロセッサ1と、メモリ2と、監査ユニット3と、分析ステーション4とを備える。メモリ2は、データバス5によりプロセッサ1に接続されている。また、監査ユニット3も前記データバスに接続されている。監査ユニット3は、前記プロセッサと前記メモリとの間の通信を観察できるような方法で前記データバスに接続されている。前記監査ユニットは、プロセッサにより実行されるプログラムのフローを監視する。前記監査ユニットは、このフローの表示を保存し、例えば、デバッグや、安全性またはセキュリティ上の目的のために分析を行うことができる分析ステーション4に、前記フローの表示を送信することができる。
【0036】
着目すべきであるのは、前記監査ユニットが、ジャンプが生じたときのプログラムのフローを示す情報を保存または送信するデータ形式である。一実施形態では、前記監査ユニットは、ジャンプが生じた命令のロケーションの表示と、その命令からジャンプが生じた連続回数を示すことができるカウンタとを保存する。
【0037】
前記プロセッサは、デフォルトの順序に従ってデフォルトで命令を実行する。通常、このデフォルトの順序は、メモリ内のロケーションの昇順で命令を実行するようにされている。「ジャンプ」という用語は、プログラムのフローにおける変更であって、所与の命令が実行された後、実行される次の命令が、デフォルトの順序において当該所与の命令の後にある次の命令以外の命令となるような変更を指している。典型的には、ジャンプは、実行順序の変更をコマンドする命令によってトリガされる。このような動作をトリガするために利用可能な命令は、動作環境に依存するものの、ジャンプ命およびブランチ命令を含んでいてもよい。ジャンプは、命令の実行以外のイベントによってトリガされてもよく、例えば、割り込みファイアリングまたは発生した例外によりトリガされてもよい。
【0038】
より詳細には、プロセッサ1は、論理ユニット10と、レジスタ11と、スタックメモリ12とを備える。前記プロセッサは、算術論理ユニットおよび/または乗算ユニットなどといった、様々な目的のために適合された複数の論理ユニットを備えていてもよい。前記レジスタは、プロセッサに対してローカルでデータを保存する。スタックメモリは、論理ユニットによって現在実行されているサブルーチンが完了したときに、プログラムのフローが戻る(revert)べきロケーションの順序付きリストを保存している。スタックメモリは、監査ユニット3とも、使用するメモリとも別体である。
【0039】
メモリ2は、多数のメモリロケーション20を含み、各メモリロケーションにデータを保存することができる。各メモリロケーションは、そのメモリロケーションにアクセスすることができるアドレスによって指定される。前記プロセッサは、バス5を通じて、特定のメモリロケーションのデータに対する要求を送信することができる。メモリ2は、そうした要求に応答して、当該ロケーションにおけるメモリ2の内容を、バスを通じて返送するように適合されている。
【0040】
動作時において、前記プロセッサは、前記メモリから開始ロケーションの命令を取得し、その命令を実行することで開始する。その後、前記プロセッサは、プログラムの実行が終了するまで、さらなる命令を順に取得する。各ステージにおいて、前記プロセッサのデフォルト挙動は、次の命令を順序通りに前記メモリから取得するように構成されている。当該次の命令が保存されているロケーションは、前回の命令のロケーションおよび前回の命令の長さによって異なる。本明細書では、各命令が1つのメモリロケーションを占有するものと仮定しているが、命令はより大きいものであってもよく、1つのシステムにおける様々なサイズのものであってもよい。前記プロセッサは、メモリ内において次の命令をフェッチすべき場所を記録するプログラムカウンタ13を備える。前記プロセッサは、命令の実行前にメモリから命令を取得し、一時的にこれらの命令を前記プロセッサにローカルで保存することによって、メモリからの命令をプリフェッチしてもよい。この構成については、下記でより詳細に説明する。
【0041】
前記監査ユニットは、フィルタリングユニット30と、フィルタメモリ31と、データキャッシュまたはログ32とを有する。フィルタメモリ31は、ユーザが検出を所望するイベントの種類を示す1セットのフィルタ規則を保存している。フィルタリングユニット30は、バス5を通じてトランザクションを観察する。トランザクションがフィルタ規則と一致する場合、前記フィルタリングユニットは、キャッシュ32における当該トランザクションについての情報のログを取得またはリンク6を通じて分析ステーション4へと当該トランザクションについてのデータを送信するといった動作を行う。また、監査ユニットは、キャッシュ32においてローカルでデータのログを取得し、その後、当該データを分析ステーションへと送信することも可能である。
【0042】
図2には、
図1のシステムにおけるプログラムのフローの例が示されている。プロセッサ1は、メモリロケーションAにおいて開始されるプログラムの実行を開始し、命令Bに到達するまでメモリ2内の連続的な命令を順序通り実行し続ける。命令Bは、メモリロケーションCにおいて開始されるサブルーチン70を呼び出す。その後、前記プロセッサは、スタック12にBのロケーションを保存する。続いて、前記プロセッサは、Dにおけるサブルーチン70の最後の命令に到達するまで、Cから始まる命令を実行する。その後、前記プロセッサは、スタックにおける(ロケーションBの)最後のエントリを読み出し、当該エントリを前記スタックから削除し、当該エントリによって示されたロケーションの直ぐ後の命令から実行を再開する。
図2では、これは命令Eである。次に、前記プロセッサは、命令Fで終了するメインルーチン71の実行を完了させる。ネストされたサブルーチンが呼び出される場合、各サブルーチンが呼び出される際に、それぞれに対するリターンアドレスが前記スタックに追加され、サブルーチンが終了する際に前記スタックから削除される。これにより、前記プロセッサは、サブルーチンのコールの複数の層に対するリターンアドレスを記録することができる。サブルーチンをコールすること自体により、プログラムが反復を行う場合、前記スタックにおける連続的なエントリは同一のアドレスを示してもよい。
【0043】
図3には、監査ユニットのメモリ33におけるデータ構造が示されている。メモリ33は、ログメモリ32と一体化されていてもよいが、例えばより早いアクセス速度を可能とするために、別体であってもよい。
図3に示されたデータ構造の目的は、比較的効率的な方法でプログラムのフローのログを取得または分析ステーション4に送信できるように、プログラムのフローを追跡することである。このデータ構造は、複数のアドレスビン( address bin)80と、カウンタビン81と、カウンタポインタビン82とを有する。このデータ構造を用いる監査ユニットの動作については、以下で説明する。
【0044】
監査ユニットのフィルタリングユニット30は、バス5を通じてトラフィックを監視する。フィルタリングユニットがフィルタ規則に従って検出を行うように構成されていてもよい1つの種類のトラフィックとしては、前記プロセッサにより実行されるプログラムのフロー(つまり、プロセッサが実行するための命令を取得するメモリ内の一連のロケーション)が挙げられる。この情報は、デバッグのために、またはプログラムのフローが正確であり、(例えば、プロセッサに対し、誤ったメモリロケーションにおける命令を実行するように命令されたことにより)破損していないことを検証するために有益である。
図1の例では、監査ユニットは、下記の1つ以上からプログラムのフローを推定することができる。
i)プロセッサが命令を要求するメモリ2内のロケーション。これらのロケーションからのデータに対する要求は、前記プロセッサからメモリへとバス5上を通過する際に、監査ユニットによって観察されてもよい。
ii)メモリからバス5を介してプロセッサへと通過する命令の内容。監査ユニットは、プログラムのフローは、通常、1つの命令から次の命令へとメモリ内の順序で進むと仮定してもよいが、このメモリからプロセッサへと送られるジャンプ命令を観察したときには、ジャンプ命令で特定されたロケーションまでプログラムのフローがジャンプすると推定してもよく、監査ユニットがリターン命令を観察したときには、当該サブルーチンへのジャンプが生じたロケーションの直ぐ後のロケーションまでプログラムのフローがジャンプすると推定してもよい。
iii)プロセッサが命令を実行したとき、プロセッサは監査ユニットに直接報告することができる。この報告は、命令が下げられた(retired)とき(つまり、遂行されたとき)に行ってもよい。
【0045】
図1において、監査ユニットはデータバス5に接続された状態で示されている。他の実施形態では、監査ユニットは、プロセッサの状態を直接検出できるように(例えば、監査ユニットがプログラムカウンタ13および/またはスタック12の内容を検出できるように)、プロセッサと密接に接続されていてもよい。これにより、監査ユニットは、最終的に実行されない可能性があるプリフェッチされた命令を考慮することができる。
【0046】
動作中、アドレスビン80は所定の順番で使用される。アドレスビンは当初は空である。下記の例外の場合、監査ユニットが、プログラムのフローにおける(特に、サブルーチンコールによる)ジャンプを検出すると、当該ジャンプが生じたアドレスの表示を、次の利用可能なアドレスビンに保存する。ジャンプがサブルーチンコールによるものであるということは、そのジャンプを生じさせた命令の性質またはプログラム内におけるジャンプの状況によって判断することができ、または、プロセッサは、サブルーチンコールがなされたということを監査機能に報告してもよい。前記表示は、任意の適切な形式とすることができる。例えば、ジャンプが生じたアドレス;またはその直ぐ後の命令のアドレスであって、リターンが予想されているアドレス;または所定のアルゴリズムに従ってリターンアドレスを推定することができる他のデータであってもよい。サブルーチンがネストされたとき、連続的なビンのそれぞれに順番に入力が行われてもよい。監査ユニットがサブルーチンからのリターンを検出したとき、監査ユニットは、このリターンがデータを含む最も上位のアドレスビン80の内容によって示されるリターンアドレスへのものであるかどうかを確認する。規約(convention)として、ビンが、ジャンプが生じたアドレスを含む場合、上記示されるリターンアドレスは、ビンに含まれるアドレスの直ぐ後のアドレスとなる。監査ユニットは、このジャンプの直ぐ後に続いて実行される命令が、示されたものであるかどうかを確認する。示されたものである場合、プログラムのフローは正常であり、必要があれば容易に推定することができるので、監査ユニットは、ログの取得または報告を行わない。実際のリターンアドレスがビンに示されたものではない場合、監査ユニットは、このプログラムのフローを後で再構築できるようにするために、キャッシュ32中の実際のリターンアドレスのログを取り、かつ/または、この実際のリターンアドレスを遠隔の分析ユニット4に報告する。監査ユニットは、この実際のリターンアドレスがどのリターンと関連しているのか判断できるように、それぞれのビン80の数または(ビン80の順序における)ランクのログを取り、かつ/またはこれを報告してもよい。その後、監査ユニットは、データを含む最も上位のアドレスビン80の内容を消去する。
【0047】
プログラム実行中の任意の時点において、または実行が何らかの理由で(例えば、バグにより)中断された場合、アドレスビンの内容について、監査ユニットによりログを取得または調査するか、または分析のために分析ステーション4に送信することができる。
【0048】
効率のためには、アドレスビン80の数が比較的少ないことが好ましい。例えば、アドレスビンを4個以下、またはアドレスビンを8個以下、またはアドレスビンを16個以下とすることができる。プログラムのフローが多数のレベルのネストされたサブルーチンを入力した場合、ネストされたジャンプの数が、利用可能なアドレスビンに明白に保存できる数よりも大きくなることがある。これを軽減するために2つのステップを取ることができる。
【0049】
まず、リターンアドレスを保存するためのアドレスビンが残っていないときにジャンプが行われた場合、順序が最も下位のビンのアドレスを破棄し、他のアドレスビンの内容を順に下げて、順序が最も上位のビンを空けることができる。その後、現在のジャンプと関連付けられたリターンアドレスを、順序が最も上位のビンに保存することができる。これにより、システムは、常に、N個の最も内側のサブルーチンコールのリターンアドレスへのアクセスを有する。ここで、Nはアドレスビンの数である。代替的に、ジャンプの詳細についてのログをメモリ32に残し、かつ/またはジャンプの詳細を分析ステーション4に報告してもよい。
【0050】
次に、ジャンプが行われ、予想リターンアドレスが前回のジャンプのリターンアドレスと同一である場合には、ビン81,82を用いることができる。この状況は、プログラムが回帰を実行するときに最も生じやすい。ジャンプが行われ、リターンアドレスが前回のジャンプと同一である場合には、監査ユニットは以下のステップを取る。
1.監査ユニットは、ポインタ82を確認することにより、ビン81,82が既に他のアドレスビンに使用されているかどうか確認する。考え得る状況としては以下の通りである。
可能性i)ポインタ82が空である(例えば、-1を示している)。これは、ビン81,82が使用中ではないということを示す。この場合、監査ユニットは、前回のジャンプに対するリターンアドレスの表示を保存しているアドレスビン80を特定するようにポインタ82の設定を行い、現在のジャンプはそのリターンアドレスを有するジャンプの1回目の繰り返しであることを示すためにカウンタ81を1に設定する。
可能性ii)ポインタ82が、前回のジャンプに対するリターンアドレスの表示を保存しているアドレスビン80を特定しており、当該アドレスビンが、現在使用されている最も上位のビンである。この場合、監査ユニットは、そのリターンアドレスを有する追加のジャンプが行われたことを示すためにカウンタ81をインクリメントする。カウンタが最大である場合、監査ユニットは下記の可能性iii)のように動作を続ける。
可能性iii)ポインタ82が、前回のジャンプに対するリターンアドレスとは異なるリターンアドレスを保存しているアドレスビンを特定しているか、または、そのアドレスビンが現在使用されている最も上位のビンではないか、または、上記ii)のようにカウンタが最大ではない。この場合、監査ユニットは、次の利用可能なビンのリターンアドレスの表示を保存するか、または、利用可能なビンがない場合には、前段落に記載される手順を用いてもよい。
【0051】
前段落に記載のプロセスの結果として、監査ユニットは、カウンタ81の範囲内で複数の回帰レベルを効率的に保存することができ、また、アドレスビン80の範囲(extent)内で複数の非回帰ジャンプを効率的に保存することができる。
【0052】
監査ユニットは、ジャンプからのリターンを検出したとき、そのリターンアドレスは、占有されている最も上位のアドレスビンに特定されているものであると推定する。監査ユニットは、ポインタ82が設定されているかどうかを確認し、設定されている場合には、そのビンを特定しているかどうかを確認する。ポインタが設定されていない場合、または設定されているものの上記アドレスビンを特定していない場合、監査ユニットはこのアドレスビンの内容を消去する。これに該当せず、ポインタが設定されており、かつ上記ビンを特定している場合には、監査ユニットはカウンタ81をデクリメントする。これによりカウンタがゼロになった場合、監査ユニットは、カウンタ81、ポインタ82および占有されている最も上位のアドレスビンの内容を消去する。これにより、監査ユニットは、プログラムのフローの現在の状態を示すために、
図3に示されるデータ構造を維持することができる。監査ユニットは、
図3のデータ構造により示される予想リターンアドレスに対して実際のリターンアドレスを確認し、不一致があれば上記の方法でログの取得および/または報告を行う。
【0053】
カウンタ81は、幾つかの方法で実装することができる。
図3の構成に代わる1つの構成において、複数のカウンタが設けられており、各カウンタが、それぞれ同一のリターンアドレスを有する複数の連続的なジャンプを示すものであってもよい。このアプローチにより、複数のネストされたレベルの回帰のログを効率的に取得することができる。1つの構成において、このようなカウンタの数はアドレスビンの数よりも少なくてもよい。このとき、各カウンタは、それぞれのカウンタがいずれのアドレスビンと関連付けられているかを示すために用いられるポインタと関連付けてもよい。他の構成では、各アドレスビンにつき1つのカウンタを設けてもよい。このとき、ポインタを省略してもよい。これにより、ビンを指定するカウンタと関連付けられているポインタによって、またはカウンタがビンと内在的に関連付けられているかどうかの暗示によって、任意のカウンタをビンと関連付けることができる。複数のカウンタに対してメモリが割り当てられている場合、これらのメモリ領域は、別個に動作させてもよいし、または、これらのカウンタのうちの1つのカウンタの範囲を増大させるために論理的に組み合わせてもよい。これを行うことができる幾つかの例を以下に示す。
1.カウンタが最大である場合につき上述したように、更なるアドレスビンが利用可能である場合、そのビンに、前のビンと同一のリターンアドレス識別子を入力することができる。これらのビンの両方とカウンタを関連付けることができる場合、これらのカウンタは、効率的に相加的に使用されている。
2.上記の状況が生じた場合、つまり、2つの連続するアドレスビンが同一のリターンアドレスを特定する場合、これらのビンと関連付けられたカウンタは、両カウンタからのビットを用いる1つのカウンタとして扱うことができる。1つのカウンタが、全体的なカウンタ合計におけるより上位のビットを表し、1つのカウンタが、カウンタ合計におけるより下位のビットを表すことができる。組み合わされた1つのカウンタは適宜インクリメントおよびデクリメントすることができる。両カウンタに用いられるポインタは、同一のアドレスビンを参照することができ、または同一のリターンアドレス識別子を含む2つの連続するアドレスビンを参照することができる。1つのカウンタに保持できる数量までカウンタがデクリメントされたとき、これらのビンのうちの上位のビンを空にして、そのカウンタを開放することができる。
【0054】
図1では、監査ユニットはプロセッサの外部に示されている。実際には、監査ユニットは任意の適切なロケーションに配置することができる。このロケーションは、プロセッサ内とすることができ、例えば、プロセッサのメモリインターフェースとすることができる。これにより、プロセッサの動作を効率的に監視することができる。また、プロセッサと共通の半導体基板上とすることもできる。これにより、プロセッサのユーザは、プロセッサが正確に監視されていることを確認することができる。
【0055】
プロセッサは、それぞれ別個のプログラムスレッドを実装できる複数のコアまたは論理ユニットを有していてもよい。この場合、監査ユニットは、例えば、
図3に示される形式の二重化保存論理を用いて各スレッドのフローを独立に追跡してもよい。
【0056】
本願の出願人は、本明細書に記載の各個別の構成を独立に、および2つ以上の構成の組み合わせを、それらの構成または構成の組み合わせが、当業者の技術常識に照らして全体として本明細書に基づいて実施可能である範囲で、それらの構成または構成の組み合わせが本明細書に開示されたいずれかの課題を解決するかどうかにかかわらず、また、請求の範囲を限定することなく開示している。本発明の態様は、そうした構成または構成の組み合わせのいずれからなるものであってもよい。上記の説明から、本発明の範囲内で様々な変更を施すことができるということが当業者にとって明白であろう。