Zeitstempelzähler – Wikipedia

before-content-x4

Das Zeitstempelzähler ((TSC) ist ein 64-Bit-Register, das seit dem Pentium auf allen x86-Prozessoren vorhanden ist. Es zählt die Anzahl der Zyklen seit dem Zurücksetzen. Die Anleitung RDTSC Gibt die TSC in EDX: EAX zurück. Im x86-64-Modus RDTSC löscht auch die höheren 32 Bit von RAX und RDX. Sein Opcode ist 0F 31.[1]Pentium-Konkurrenten wie der Cyrix 6×86 hatten nicht immer einen TSC und könnten dies in Betracht ziehen RDTSC eine illegale Anweisung. Cyrix hat einen Zeitstempelzähler in sein MII aufgenommen.

Der Zeitstempelzähler war einst eine hervorragende hochauflösende Methode mit geringem Overhead für ein Programm, um Informationen zum CPU-Timing abzurufen. Mit dem Aufkommen von Multi-Core- / Hyper-Threaded-CPUs, Systemen mit mehreren CPUs und Betriebssystemen im Ruhezustand kann man sich nicht darauf verlassen, dass die TSC genaue Ergebnisse liefert – es sei denn, es wird große Sorgfalt darauf verwendet, die möglichen Fehler zu korrigieren: Tick-Rate und ob Alle Kerne (Prozessoren) haben identische Werte in ihren Zeitregistern. Es gibt kein Versprechen, dass die Zeitstempelzähler mehrerer CPUs auf einem einzelnen Motherboard synchronisiert werden. Daher kann ein Programm nur dann zuverlässige Ergebnisse erzielen, wenn es sich auf die Ausführung auf einer bestimmten CPU beschränkt. Selbst dann kann sich die CPU-Geschwindigkeit aufgrund von Energiesparmaßnahmen ändern, die vom Betriebssystem oder BIOS ergriffen werden, oder das System kann in den Ruhezustand versetzt und später wieder aufgenommen werden, wodurch der TSC zurückgesetzt wird. In letzteren Fällen muss das Programm den Zähler regelmäßig neu kalibrieren, um relevant zu bleiben.

Das Verlassen auf die TSC verringert auch die Portabilität, da andere Prozessoren möglicherweise keine ähnliche Funktion haben. Neuere Intel-Prozessoren enthalten eine TSC mit konstanter Rate (identifiziert durch das System kern.timecounter.invariant_tsc auf FreeBSD oder durch das “constant_tsc“Flag in Linux /proc/cpuinfo). Bei diesen Prozessoren tickt der TSC mit der Nennfrequenz des Prozessors, unabhängig von der tatsächlichen CPU-Taktfrequenz aufgrund von Turbo- oder Energiesparzuständen. Daher zählen TSC-Ticks den Zeitablauf und nicht die Anzahl der verstrichenen CPU-Taktzyklen.

Auf Windows-Plattformen rät Microsoft aus genau diesen Gründen dringend davon ab, die TSC für hochauflösendes Timing zu verwenden, und stellt stattdessen die Windows-APIs bereit QueryPerformanceCounter und QueryPerformanceFrequency.[2] Auf POSIX-Systemen kann ein Programm eine ähnliche Funktion erhalten, indem es den Wert von liest CLOCK_MONOTONIC_RAW Uhr mit der clock_gettime Funktion.[3]

Beginnend mit dem Pentium Pro haben Intel-Prozessoren die Ausführung außerhalb der Reihenfolge geübt, bei der Anweisungen nicht unbedingt in der Reihenfolge ausgeführt werden, in der sie im Programm angezeigt werden. Dies kann dazu führen, dass der Prozessor ausgeführt wird RDTSC früher als ein einfaches Programm erwartet, was zu einer irreführenden Zykluszählung führt.[4] Der Programmierer kann dieses Problem lösen, indem er einen Serialisierungsbefehl wie z. B. die CPUID einfügt, um zu erzwingen, dass jeder vorhergehende Befehl abgeschlossen wird, bevor das Programm fortgesetzt werden kann, oder indem er den Befehl verwendet RDTSCP Anweisung, die eine serialisierende Variante der RDTSC Anweisung.

Implementierung in verschiedenen Prozessoren[edit]

Intel-Prozessorfamilien erhöhen den Zeitstempelzähler unterschiedlich:[5]

  • Für Pentium M-Prozessoren (Familie [06H]Modelle [09H, 0DH]); für Pentium 4-Prozessoren Intel Xeon-Prozessoren (Familie) [0FH]Modelle [00H, 01H, or 02H]); und für Prozessoren der P6-Familie: Der Zeitstempelzähler erhöht sich mit jedem internen Prozessortaktzyklus. Der interne Prozessortaktzyklus wird durch das aktuelle Verhältnis von Kerntakt zu Bustakt bestimmt. Übergänge der Intel SpeedStep-Technologie können sich auch auf die Prozessortaktung auswirken.
  • Für Pentium 4-Prozessoren Intel Xeon-Prozessoren (Familie) [0FH]Modelle [03H and higher]); für Intel Core Solo und Intel Core Duo Prozessoren (Familie [06H]Modell [0EH]); für den Intel Xeon Prozessor der Serie 5100 und die Intel Core 2 Duo Prozessoren (Familie) [06H]Modell [0FH]); für Intel Core 2 und Intel Xeon Prozessoren (Familie [06H], display_model [17H]); für Intel Atom Prozessoren (Familie [06H], display_model [1CH]): Der Zeitstempelzähler erhöht sich mit einer konstanten Rate. Diese Rate kann durch das maximale Verhältnis von Kerntakt zu Bustakt des Prozessors oder durch die maximal aufgelöste Frequenz eingestellt werden, mit der der Prozessor gestartet wird. Die maximal aufgelöste Frequenz kann von der maximal qualifizierten Frequenz des Prozessors abweichen.

Die spezifische Prozessorkonfiguration bestimmt das Verhalten. Das konstante TSC-Verhalten stellt sicher, dass die Dauer jedes Taktticks gleichmäßig ist, und ermöglicht die Verwendung des TSC als Wandtakt-Timer, selbst wenn der Prozessorkern die Frequenz ändert. Dies ist das Architekturverhalten aller späteren Intel-Prozessoren.

AMD-Prozessoren bis zum K8-Kern haben den Zeitstempelzähler bei jedem Taktzyklus immer erhöht.[6] Auf diese Weise konnten Energieverwaltungsfunktionen die Anzahl der Inkremente pro Sekunde ändern und die Werte zwischen verschiedenen Kernen oder Prozessoren im selben System nicht mehr synchronisieren. Für Windows bietet AMD ein Dienstprogramm[7] um die Zähler auf mehreren Kern-CPUs regelmäßig zu synchronisieren. Seit der Familie 10h (Barcelona / Phenom) verfügen AMD-Chips über eine konstante TSC, die entweder durch die HyperTransport-Geschwindigkeit oder den höchsten P-Zustand gesteuert werden kann. Ein CPUID-Bit (Fn8000_0007:EDX_8) wirbt dafür; Intel-CPUs melden auch ihre invariante TSC für dieses Bit.

Verwendung des Betriebssystems[edit]

Ein Betriebssystem kann Methoden bereitstellen, die das verwenden und nicht verwenden RDTSC Anleitung zur Zeitmessung unter Administratorkontrolle. In einigen Versionen des Linux-Kernels wird beispielsweise der Seccomp-Sandbox-Modus deaktiviert RDTSC.[8] Es kann auch mit dem deaktiviert werden PR_SET_TSC Argument zum prctl() Systemaufruf.[9]

Verwendung beim Ausnutzen von Cache-Seitenkanalangriffen[edit]

Der Zeitstempelzähler kann verwendet werden, um Anweisungen genau zu zeitigen, die bei den Sicherheitslücken Meltdown und Spectre ausgenutzt werden können[10][11]. Wenn dies jedoch nicht verfügbar ist, können andere Zähler oder Timer verwendet werden, wie dies bei ARM-Prozessoren der Fall ist, die für diese Art von Angriff anfällig sind.

Andere Architekturen[edit]

Andere Prozessoren haben ebenfalls Register, die CPU-Taktzyklen zählen, jedoch unterschiedliche Namen haben. Auf dem AVR32 wird es beispielsweise als PCCNT-Register (Performance Clock Counter) bezeichnet. SPARC V9 bietet die
TICK registrieren. ARMv7[12] und ARMv8[13] Architekturen stellen einen generischen Zähler bereit, der mit einer konstanten Frequenz zählt. PowerPC bietet das 64-Bit TBR registrieren.

Siehe auch[edit]

Verweise[edit]

Externe Links[edit]

after-content-x4