TSC 是時間戳記計數器的縮寫,它是 Pentium 相容處理器中的一個計數器,它記錄自啟動以來處理器消耗的刻度數。在每個時鐘到來時,該計數器自動加一。
因為 TSC 隨著處理器周期速率的變化而變化,所以它提供了非常高的精確度。它經常被用來分析和檢測代碼。TSC 的值可以通過 rdtsc 指令來讀取。TSC 的節拍還可以轉換為秒,轉換方法是將其除以 CPU 的時脈速率(可以從核心變數 cpu_khz 擷取)。
在 include/asm-i386/Msr.h (核心版本:2.6.23)裡可以看到一個函數:
static
inline
unsigned
long
long
native_read_tsc(
void)
{
unsigned
long
longval;
asm
volatile("rdtsc":
"=A" (val));
return
val;
}
這個函數正是使用 rdtsc 指令讀取 TSC 的值,並將其存放在 %eax 和 %edx (=A)中,然後再存往 val 變數中。long long 類型為 64 位元。
在使用者態,也可以利用此函數來列印其值:
#include <stdio.h>
unsigned
long longnative_read_tsc(void)
{
unsigned
long longval;
asm volatile("rdtsc":
"=A" (val));
return
val;
}
int
main()
{
unsigned
long longval;
unsigned
long longval2;
val =native_read_tsc();
sleep(1);
val2 =native_read_tsc();
printf ("%lld\n", (val2-val)/1000000);
return (0);
}
運行輸出:
$ ./rdtsc
CPU Mhz: 2327
從上面可以看到當前 CPU 的頻率是 2.33G 。這個值也可以通過 /proc/cpuinfo 檔案看到,比如我這裡:
cpu MHz : 1596.000
為什麼這裡的 CPU 只有 1.6G 了呢?原因是我的主板在 BIOS 裡開啟了“英特爾CPU頻率動態調節”功能。