타임스탬프 카운터
Time Stamp Counter
타임 스탬프 카운터(TSC)는 펜티엄 이후 모든 x86 프로세서에 존재하는 64비트 레지스터다.재설정 이후 CPU 사이클 수를 카운트한다.지시RDTSC
EDX에서 TSC 반환:EAX. x86-64 모드에서는RDTSC
또한 RAX와 RDX의 상위 32비트를 지운다.opcode는0F 31
.[1]Cyrix6x86과 같은 Pentium 경쟁자는 항상 TSC를 보유하지는 않았으며, 이를 고려할 수도 있다.RDTSC
불법 교육Cyrix는 MII에 타임스탬프 카운터를 포함시켰다.
사용하다
타임 스탬프 카운터는 한 프로그램에서 CPU 타이밍 정보를 얻을 수 있는 탁월한 고해상도 저오버헤드 방식이었다.멀티코어/하이퍼 스레드 CPU, 다중 CPU가 장착된 시스템 및 최대 절전 운영 체제의 출현으로 TSC는 정확한 결과를 제공할 수 없다. 단, 틱 속도 및 모든 코어(프로세서)의 시간 유지 레지스터에 동일한 값이 있는지 여부 등 가능한 결함을 수정하기 위해 많은 주의를 기울이지 않는 한, TSC에 의존할 수 없다.단일 마더보드에 있는 여러 CPU의 타임스탬프 카운터가 동기화될 가능성은 없다.따라서, 프로그램은 오직 하나의 특정한 CPU에서 실행되도록 제한해야만 신뢰할 수 있는 결과를 얻을 수 있다. 그렇게 해도, CPU 속도는 OS나 BIOS에 의해 취해진 절전 조치 때문에 변할 수도 있고, 시스템이 동면되었다가 나중에 재개되어 TSC를 재설정할 수도 있다.이러한 후자의 경우, 관련성을 유지하기 위해 프로그램은 주기적으로 카운터를 다시 보정해야 한다.
TSC에 의존하면 다른 프로세서가 유사한 기능을 가지고 있지 않을 수 있기 때문에 휴대성도 감소한다.최신 Intel 프로세서에는 고정 속도 TSC(FreeB에서 kern.timecounter.invariant_tsc sysctl로 식별됨)가 포함되어 있음SD 또는 "에 의한constant_tsc
"Linux's의 깃발/proc/cpuinfo
이러한 프로세서에서 TSC는 터보 또는 절전 상태로 인한 실제 CPU 클록 주파수와 상관없이 프로세서의 공칭 주파수에서 체크 표시를 한다.따라서 TSC 틱스는 경과한 CPU 클럭 사이클 수가 아니라 시간의 흐름을 계산하고 있다.
윈도우즈 플랫폼에서 마이크로소프트는 정확히 이러한 이유로 고해상도 타이밍에 TSC를 사용하는 대신 윈도우즈 API를 제공하는 것을 강력히 반대한다. QueryPerformanceCounter
그리고QueryPerformanceFrequency
.[2] POSIX 시스템에서는 프로그램의 값을 읽음으로써 유사한 기능을 얻을 수 있다.CLOCK_MONOTONIC_RAW
을 사용하여 시계를 맞추다clock_gettime
기능을 [3]발휘하다
펜티엄 프로를 시작으로 인텔 프로세서는 순서가 맞지 않는 실행을 연습해 왔으며, 여기서 반드시 프로그램에 나타나는 순서대로 지시를 수행할 필요는 없다.이로 인해 프로세서가 실행될 수 있음RDTSC
단순한 프로그램이 예상하는 것보다 일찍, 오해의 소지가 있는 주기 카운트를 생성한다.[4]프로그래머는 CPUID와 같은 직렬화 명령을 삽입하여 프로그램을 계속 진행하기 전에 모든 선행지시를 강제로 완료하도록 함으로써 이 문제를 해결할 수 있다.그RDTSCP
가르침은 의 변형이다.RDTSC
명령 스트림의 부분 직렬화를 특징으로 하지만 직렬화로 간주해서는 안 된다.
다양한 프로세서에서 구현
Intel 프로세서 제품군은 시간 스탬프 카운터를 다르게 증가:[5]
- 펜티엄 M 프로세서(패밀리 [06H], 모델 [09H, 0DH]), 펜티엄 4 프로세서, Intel Xeon 프로세서(패밀리 [0FH]), 모델 [00H, 01H 또는 02H], P6 패밀리 프로세서의 경우: 내부 프로세서 클럭 사이클마다 타임 스탬프 카운터 증가.내부 프로세서 클럭 사이클은 현재 코어 클럭 대 버스 클럭 비율에 의해 결정된다.Intel SpeedStep 기술 전환은 프로세서 클럭에도 영향을 미칠 수 있다.
- For Pentium 4 processors, Intel Xeon processors (family [0FH], models [03H and higher]); for Intel Core Solo and Intel Core Duo processors (family [06H], model [0EH]); for the Intel Xeon processor 5100 series and Intel Core 2 Duo processors (family [06H], model [0FH]); for Intel Core 2 and Intel Xeon processors (family [06H], display_model [17H]);Intel Atom 프로세서(패밀리 [06H], display_model [1CH]): 시간 스탬프 카운터는 일정한 속도로 증가한다.이 속도는 프로세서의 최대 코어-클록 대 버스-클록 비율에 의해 설정되거나 프로세서가 부팅되는 최대 해결 주파수로 설정될 수 있다.분해된 최대 주파수는 프로세서의 최대 정규화된 주파수와 다를 수 있다.
특정 프로세서 구성에 따라 동작이 결정된다.일정한 TSC 동작은 각 클럭 틱의 지속시간을 균일하게 보장하며 프로세서 코어가 주파수를 변경하더라도 월 클럭 타이머로 TSC를 사용할 수 있게 한다.이것은 모든 후기 인텔 프로세서에 대한 아키텍처 동작이다.
K8 코어까지의 AMD 프로세서는 항상 클럭 사이클마다 타임 스탬프 카운터를 증가시켰다.[6]따라서, 전력 관리 기능은 초당 증가 횟수를 변경할 수 있었고, 값이 동일한 시스템의 서로 다른 코어 또는 프로세서 간에 동기화되지 않을 수 있었다.윈도우즈의 경우 AMD는 여러 코어 CPU의 카운터를 주기적으로 동기화하는 유틸리티를[7] 제공한다.패밀리 10h(바르셀로나/페넘) 이후 AMD 칩은 일정한 TSC를 특징으로, 하이퍼트랜스포트 속도나 최고 P 상태로 구동할 수 있다.CPUID 비트(Fn8000_0007:EDX_8
)은 이것을 광고한다; 인텔-CPU는 또한 그 비트에 불변 TSC를 보고한다.
운영 체제 사용
운영체제는 사용과 사용하지 않는 방법을 제공할 수 있다.RDTSC
관리자 제어 하에 시간 유지에 대한 지침예를 들어 Linux 커널의 일부 버전에서는 seccompon 샌드박스 모드가 실행 중지됨RDTSC
.[8] 를 사용하여 비활성화할 수도 있다.PR_SET_TSC
에 대해 논하다prctl()
시스템 [9]호출
캐시 측면 채널 공격 활용에 사용
타임 스탬프 카운터는 멜트다운 및 스펙터 보안 취약성에 악용될 수 있는 지시사항을 정확하게 타임아웃하는 데 사용할 수 있다.[10][11]그러나 이러한 유형의 공격에 취약한 ARM 프로세서의 경우와 마찬가지로 이 기능을 사용할 수 없는 경우에는 다른 카운터나 타이머를 사용할 수 있다.
기타 아키텍처
다른 프로세서들도 CPU 클럭 사이클을 카운트하는 레지스터를 가지고 있지만 이름은 다르다.예를 들어, AVR32에서는 PCCNT(Performance Clock Counter) 레지스터라고 부른다.SPARC V9는TICK
등록하다PowerPC는 64비트 제공TBR
등록하다
ARMv7[12] 및 ARMv8[13] 아키텍처는 일정한 주파수에서 계수되는 일반 카운터를 제공한다.ARMv7은 카운터를 읽고 쓸 수 있는 사이클 카운터 레지스터(CCNT지침)를 제공하지만 명령은 특권이다.[14]
참고 항목
- 고정밀 이벤트 타이머(HPET)
참조
- ^ Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2B: Instruction Set Reference, M-Z (PDF). p. 545.
- ^ Game Timing and Multicore Processors. pp. 251–252.
- ^ "clock_getres, clock_gettime, clock_settime - clock and timer functions".
- ^ "Using the RDTSC Instruction for Performance Monitoring" (PDF).
- ^ "Volume 3A, Chapter 16". Intel 64 and IA-32 Architectures Software Developer's Manual.
- ^ "Volume 3". AMD64 Architecture Programmer's Manual.
- ^ "AMD Dual-Core Optimizer".
- ^ "cr0 blog: Time-stamp counter disabling oddities in the Linux kernel". May 2009.
- ^ Linux Programmer's Manual – System Calls –
- ^ "meltdown.c".
- ^ "spectre.c".
- ^ "ARMv7 reference manual".
- ^ "ARMv8 reference manual".
- ^ "Cycle Counter Register (CCNT)". ARM Ltd. Retrieved March 5, 2021.
외부 링크
- cycle.h - 많은 CPU 및 컴파일러에서 고해상도 타이머를 읽기 위한 C 코드.
- [1] - x86 기계의 타이머를 읽기 위한 매우 간단한 C 코드.이것은 64비트 값을 두 개의 32비트 정수로 읽고 그것들을 결합시킨다 - 하나의 64비트 정수를 사용하는 것도 또 다른 선택이다.[clarification needed]
- AMD 프로세서에서 TSC 드리프트를 사용하는 AMD 엔지니어