Rdtsc
Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od
verze recenzované 29. prosince 2019; kontroly vyžadují
5 úprav .
rdtsc ( Read Time Stamp Counter ) je instrukce assembleru pro platformy x86 a x86_64, která čte čítač TSC ( Time Stamp Counter ) a vrací 64bitový počet hodinových cyklů v registrech EDX: EAX od posledního resetu procesoru .
rdtsc je podporován na procesorech Pentium (a kompatibilních) a novějších. Operační kód : 0F 31 [1] .
rdtscp [2] je podporován od Intel Nehalem a AMD Family 0x0F [3] . Operační kód: 0F 01 F9 [4] .
Použití
rdtsc se nejčastěji používá:
- měřit čas;
- pro přesné měření časových intervalů včetně optimalizace (měření času potřebného k provedení konkrétních instrukcí nebo jejich sady);
- pro účely ochrany proti ladění; [5] [6]
- jako zdroj entropie pro generátory pseudonáhodných čísel . [7]
Výhody
Ve srovnání s rozhraními API poskytovanými operačním systémem, jako je WINAPI::QueryPerformanceCounter() nebo gettimeofday() instrukce rdtsc/rdtscp mohou poskytnout následující výhody:
- Lepší přesnost, zejména pro architektury a starší operační systémy, které nemají plnou podporu HPET . Takové operační systémy používají systémový časovač s nízkou přesností (někdy až slice plánovače, OsTimeSlice, v řádu jednotek nebo desítek milisekund).
- Menší režie: instrukce rdtsc/rdtscp se provádějí v přibližně tuctu hodinových cyklů, což je mnohem rychlejší než systémová volání.
- Na většině systémů nevyžadujte přepnutí do privilegovaného režimu Ring0 nebo hypervizoru (pokud je příkaz v OS povolen).
Problémy s používáním
- Měly by existovat programové režimy, které tento příkaz nevyžadují, protože RDTSC / RDTSCP může být potenciálně nedostupné nebo zakázáno pro použití na koncovém systému, kde bude aplikace používána:
- na velmi starých procesorech (například 80486 ) nebo na systémech, které plně neimplementují architekturu x86.
- instrukci lze potenciálně změnit na privilegovanou instrukci (3. bit v řídicím registru CR4 nastavuje operační systém) a její použití bude mít za následek vyvolání výjimky v programu.
- instrukce může být zachycena virtualizačními systémy, její použití povede k hypercall.
- Úsporný režim může ovlivnit počet hodin:
- Při dynamické změně frekvence procesorem (snížení a zvýšení frekvence v technologiích SpeedStep, Turbo Boost, Cool&Quiet a podobných) se změní rychlost čítače TSC.
- Uvedení procesoru do režimu hlubokého spánku C3 zastaví čítač TSC na starších procesorech.
- V moderních procesorech Intel ( Nehalem a novější) a AMD (pravděpodobně od K10 Barcelona/Phenom) je čítač TSC nezávislý na použití technologií pro úsporu energie a zvyšuje se konstantní frekvencí, bez ohledu na to, na jaké frekvenci procesor běží a zda běžel nebo byl ve stavu spánku. Takový čítač se nazývá invariantní ( invariant TSC ).
- Přesné měření nemusí být možné při jediném provedení měřeného fragmentu instrukcí kvůli vlivu mezipaměti procesoru při přístupu do paměti. Tradičně se řeší opakovaným měřením fragmentu programu nebo opakováním měřeného fragmentu ve smyčce.
- RDTSC lze doobjednat s naměřenými instrukcemi na procesorech Out-of-Order. Změna pořadí lze zakázat přidáním příkazů pro serializaci (např. CLD/CLC pro modely Pentium P5, P54 [8] nebo cpuid pro novější modely) nebo pomocí RDTSCP.
- Měření krátké doby trvání fragmentů může být nestabilní ve vícejádrových a víceprocesorových systémech nebo při použití HyperThreading kvůli vzájemnému ovlivňování ostatních vláken a zatížení sdílených procesorových jednotek.
- Čítače TSC mohou být ve vzácných případech nesynchronizované na některých vícejádrových nebo víceprocesorových systémech, zejména:
- Při inicializaci procesorů.
- Na dřívějších vícejádrových systémech je možné, že se čítače nesynchronizují kvůli nesprávné inicializaci procesorů některými BIOSy. Opraveno aktualizací systému BIOS nebo aktualizací operačního systému. Existují programy pro kontrolu této chyby. [9]
- Operační systém může přepínat vlákno mezi různými jádry, která mají nesynchronizované čítače. Na aplikační úrovni můžete sledovat skutečnost změny jádra na vícejádrových systémech pomocí instrukce RDTSCP, která, fungující podobně jako RDTSC, navíc vrací číslo logického procesoru v registru ECX.
K vyřešení mnoha problémů se doporučuje opravit vlákno na konkrétním procesoru ( afinita cpu ) a zakázat technologie automatické změny frekvence (technologie úspory energie a dynamické změny výkonu).
Poznámky
- ↑ Intel® 64 and IA-32 Architectures Software Developer's Manual . — Sv. 2 (Odkaz na sadu instrukcí). - S. 4-301.
- ↑ Serializační verze instrukce rdtsc, která také čte IA32_TSC_AUX MSR, která často ukládá číslo jádra.
- ↑ rdtscp . Získáno 1. listopadu 2011. Archivováno z originálu 2. ledna 2012. (neurčitý)
- ↑ Intel® 64 and IA-32 Architectures Software Developer's Manual . — Sv. 2 (Odkaz na sadu instrukcí). - S. 4-303.
- ↑ Windows Anti-Debug Reference | Komunita Symantec Connect . Datum přístupu: 30. prosince 2011. Archivováno z originálu 14. ledna 2012. (neurčitý)
- ↑ Snímek 58 Anti-Debugging založený na načasování Archivováno 4. března 2012.
- ↑ Tom St. Denis, Simon Johnson, Kryptografie pro vývojáře Archivováno 9. října 2021 na Wayback Machine .
- ↑ Jak optimalizovat pro rodinu mikroprocesorů Pentium Archivováno 6. ledna 2012 na Wayback Machine // 1996-2000 Agner Fog. Kapitola "30. Rychlost testování“, archivováno 19. listopadu 2011.
- ↑ Afinita k ICE . Získáno 19. října 2011. Archivováno z originálu 7. září 2011. (neurčitý)
Odkazy