
タイムスタンプカウンタ(TSC )は、 Pentium以降のすべてのx86プロセッサに搭載されている64ビットレジスタです。リセット以降のCPUサイクル数をカウントします。命令は、EDX:EAXにTSCを返します。x86-64モードでは、RAXとRDXの上位32ビットもクリアします。オペコードはです。[1] Cyrix 6x86などのPentiumの競合製品にはTSCが搭載されていなかったため、不正な命令とみなされることがあります。CyrixはMIIにタイムスタンプカウンタを搭載していました。
RDTSCRDTSC0F 31 RDTSC
使用
タイムスタンプ カウンターは、かつてはプログラムが CPU タイミング情報を取得するための高解像度でオーバーヘッドの少ない方法でした。しかし、マルチコア/ハイパースレッドCPU、複数の CPUを搭載したシステム、休止状態の オペレーティング システムの出現により、ティック レートやすべてのコア (プロセッサ) のタイムキーピング レジスタの値が同一であるかどうかなど、起こりうる欠陥を慎重に修正しない限り、TSC は正確な結果を提供するとは期待できません。単一のマザーボード上の複数の CPU のタイムスタンプ カウンターが同期される保証はありません。したがって、プログラムは特定の CPU での実行に限定することによってのみ、信頼できる結果を得ることができます。それでも、OS またはBIOSによる省電力対策によって CPU 速度が変わったり、システムが休止状態にされてから再開されて TSC がリセットされたりすることがあります。後者の場合、関連性を保つには、プログラムはカウンターを定期的に再調整する必要があります。
TSC に依存すると、他のプロセッサに同様の機能がない可能性があるため、移植性も低下します。最近の Intel プロセッサには、一定レートの TSC (FreeBSD では kern.timecounter.invariant_tsc sysctl で識別され、constant_tscLinux では " " フラグで識別されます/proc/cpuinfo) が含まれています。これらのプロセッサでは、ターボまたは省電力状態による実際の CPU クロック周波数に関係なく、TSC はプロセッサの公称周波数で刻みます。したがって、TSC 刻みは経過した CPU クロック サイクルの数ではなく、時間の経過をカウントします。
Windows プラットフォームでは、まさにこれらの理由から、Microsoft は高解像度のタイミングで TSC を使用することを強く推奨しておらず、代わりにWindows API QueryPerformanceCounterとQueryPerformanceFrequency(システムに不変 TSC がある場合、つまり TSC の周波数が現在のコアの周波数に応じて変化しない場合は、それ自体が RDTSCP を使用します) を提供しています。[2] Linuxシステムでは、プログラムは関数CLOCK_MONOTONIC_RAWを使用してクロックの値を読み取ることで同様の機能を取得できますclock_gettime。[3]
Pentium Pro以降、Intel プロセッサはアウトオブオーダー実行を採用しており、命令は必ずしもプログラムに現れる順序で実行されるわけではありません。これにより、プロセッサがRDTSC単純なプログラムが予想するよりも早く実行され、誤解を招くサイクルカウントが生成される可能性があります。[4]プログラマーは、 CPUID などのシリアル化命令を挿入して、プログラムを続行する前にすべての先行命令を完了させることでこの問題を解決できます。このRDTSCP命令は、命令ストリームの部分的なシリアル化を特徴とする のバリアントですRDTSCが、シリアル化とは見なされません。
さまざまなプロセッサへの実装
Intelプロセッサファミリーはタイムスタンプカウンタを異なる方法で増加させる: [5]
- Pentium Mプロセッサ (ファミリ [06H]、モデル [09H、0DH])、Pentium 4 プロセッサ、Intel Xeonプロセッサ (ファミリ [0FH]、モデル [00H、01H、または 02H])、および P6 ファミリ プロセッサの場合: タイムスタンプ カウンタは、内部プロセッサ クロック サイクルごとに増加します。内部プロセッサ クロック サイクルは、現在のコア クロックとバス クロックの比率によって決まります。Intel SpeedStep テクノロジーの移行もプロセッサ クロックに影響を与える可能性があります。
- Pentium 4プロセッサ、Intel Xeon プロセッサ (ファミリ [0FH]、モデル [03H 以上])、Intel Core SoloおよびIntel Core Duoプロセッサ (ファミリ [06H]、モデル [0EH])、Intel Xeon プロセッサ 5100 シリーズおよびIntel Core 2 Duoプロセッサ (ファミリ [06H]、モデル [0FH])、Intel Core 2 および Intel Xeon プロセッサ (ファミリ [06H]、ディスプレイ モデル [17H])、Intel Atomプロセッサ (ファミリ [06H]、ディスプレイ モデル [1CH]) の場合: タイムスタンプ カウンタは一定の速度で増加します。この速度は、プロセッサの最大コア クロック対バス クロック比によって設定することも、プロセッサが起動される最大解決周波数によって設定することもできます。最大解決周波数は、プロセッサの最大認定周波数とは異なる場合があります。
特定のプロセッサ構成によって動作が決まります。TSC の動作が一定であれば、各クロック ティックの期間が均一になり、プロセッサ コアの周波数が変わっても TSC をウォールクロック タイマーとして使用できます。これは、以降のすべての Intel プロセッサのアーキテクチャ上の動作です。
K8コアまでのAMDプロセッサは、クロックサイクルごとに常にタイムスタンプカウンタを増分していました。[6]そのため、電源管理機能によって1秒あたりの増分数を変更でき、同じシステム内の異なるコアまたはプロセッサ間で値が同期されなくなる可能性がありました。Windowsの場合、AMDは複数のコアCPUのカウンタを定期的に同期するためのユーティリティ[7]を提供しています。ファミリ10h(Barcelona/Phenom)以降、AMDチップは一定のTSCを備えており、HyperTransport速度または最高のP状態のいずれかで駆動できます。CPUIDビット( )はFn8000_0007:EDX_8これを通知します。Intel-CPUもそのビットで不変のTSCを報告します。
オペレーティングシステムの使用
オペレーティングシステムは、管理者の制御下で、時間管理のために命令を使用する方法と使用しない方法の両方を提供する場合がありますRDTSC。たとえば、Linuxカーネルの一部のバージョンでは、seccompサンドボックスモードは無効になりますRDTSC。[8]PR_SET_TSCまた、システムコールの引数 を使用して無効にすることもできますprctl()。[9]
キャッシュサイドチャネル攻撃を悪用する使用
タイムスタンプカウンタは命令の正確な時間を計測するために使用できますが、これはセキュリティ上の脆弱性であるメルトダウンやスペクターで悪用される可能性があります。[10] [11]ただし、これが利用できない場合は、この種の攻撃に対して脆弱なARMプロセッサの場合のように、他のカウンタやタイマーを使用できます。
その他のアーキテクチャ
他のプロセッサにも CPU クロック サイクルをカウントするレジスタがありますが、名前が異なります。たとえば、AVR32では、これはパフォーマンス クロック カウンタ (PCCNT) レジスタと呼ばれます。SPARC V9はこのTICKレジスタを提供します。PowerPCは64 ビットTBRレジスタを提供します。
ARMv7 [12]およびARMv8-A [13]アーキテクチャは、一定の周波数でカウントする汎用カウンタを提供します。ARMv7 は、CCNTカウンタの読み取りと書き込みを行うサイクルカウンタレジスタ(命令)を提供しますが、この命令は特権命令です。[14]
参照
- 高精度イベントタイマー(HPET)
参考文献
- ^ Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル 第 2B 巻: 命令セットリファレンス、MZ (PDF)。p. 545。
- ^ ゲームタイミングとマルチコアプロセッサ。pp. 251–252。
- ^ "clock_getres、clock_gettime、clock_settime - クロックおよびタイマー関数"。
- ^ 「パフォーマンス監視のための RDTSC 命令の使用」(PDF)。
- ^ 「第 3A 巻、第 16 章」。Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル。
- ^ 「第3巻」。AMD64アーキテクチャプログラマーズマニュアル。
- ^ 「AMD デュアルコア オプティマイザー」。
- ^ 「cr0 ブログ: Linux カーネルのタイムスタンプ カウンターによる異常の無効化」 2009 年 5 月。
- ^ – Linuxプログラマーズマニュアル– システムコール
- ^ "meltdown.c"。
- ^ "spectre.c"。
- ^ 「ARMv7 リファレンス マニュアル」。
- ^ 「ARMv8リファレンスマニュアル」。
- ^ 「サイクル カウンター レジスタ (CCNT)」。ARM Ltd. 2021 年3 月 5 日閲覧。
外部リンク
- cycle.h -多くの CPU およびコンパイラーで高解像度タイマーを読み取るためのCコード。
- AMD のエンジニアが AMD プロセッサの TSC ドリフトについて語る
