TSC(Time Stamp Counter)の取得と設定 - 備忘録

TSC(Time Stamp Counter)の取得と設定 - 備忘録

仕事でちょっと調べることになったのでメモしておく。

モデル固有レジスタ(MSR)

IA-32 インテル® アーキテクチャ ソフトウェア・デベロッパーズ・ マニュアル 下巻:システム・プログラミング・ガイドには以下のように記載されています。(P.832)

レジスタアドレス
(10進)
レジスタ
(フィールド)
モデル利用 共有 ビット説明
0x10H (16) IA32_TIME_STAMP_ COUNTER (63:0) 0, 1, 2, 3 独自 タイムスタンプ・カウンタ。15.7. 節「タイムスタンプ・カウンタ」を参照のこと。タイムスタンプ・カウント値。(R/W) 現在のタイムスタンプ・カウント値を返す。 全64ビットが読み取り可能だが、書き込みできるのは下位32ビットだけである。下位32ビットに書き込みを行なうときは、上位32ビットがクリアされる。

msr-toolsを取得してコンパイルする

  1. kernel.orgからmsr-toolsを取得する。
  2. コンパイルする
    # tar zxf msr-tools-1.1.2.tar.gz && cd msr-tools-1.1.2
    # make
    gcc -Wall -g -O2 -fomit-frame-pointer -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64  -o wrmsr wrmsr.c
    gcc -Wall -g -O2 -fomit-frame-pointer -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64  -o rdmsr rdmsr.c
  3. rdmsr,wrmsrコマンドのできあがり
    # ls -lart
    total 68
    -rwxrwxr-x. 1 1026 1026   231 Oct 10  2001 MAKEDEV-cpuid-msr
    -rw-rw-r--. 1 1026 1026  2719 Jul 21  2004 wrmsr.c
    -rw-rw-r--. 1 1026 1026   104 Jul 21  2004 version.h
    -rw-rw-r--. 1 1026 1026  7105 Jul 21  2004 rdmsr.c
    -rw-rw-r--. 1 1026 1026  1030 Jul 21  2004 Makefile
    dr-xr-x---. 4 root root  4096 Jan  5 03:23 ..
    -rwxr-xr-x. 1 root root 14013 Jan  5 03:24 wrmsr   <--コレと...
    drwxrwxr-x. 2 1026 1026  4096 Jan  5 03:24 .
    -rwxr-xr-x. 1 root root 19370 Jan  5 03:24 rdmsr   <--コレね

MSRからTSCの値を取得する

rdmsrコマンドでMSRからTSCの値を取得する

  • この例ではCPU0(-p0)からTSC(0x10h)の値を取得する
    # ./rdmsr -u -p0 0x10h
    10781437437367

MSRにTSCの値を設定する

wrmsコマンドでMSRにTSCの値をセットする

  • この例ではTSCを0に設定する
# ./wrmsr -p0 0x10h 0

じゃ、休み明けから再現テストしようかな。

参考資料