Rdtsc
Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den
version , der blev gennemgået den 29. december 2019; checks kræver
5 redigeringer .
rdtsc ( Read Time Stamp Counter ) er en assembler - instruktion til x86- og x86_64-platforme , der læser TSC ( Time Stamp Counter )-tælleren og returnerer 64-bit antallet af clock-cyklusser i EDX: EAX- registrene siden sidste processornulstilling .
rdtsc er understøttet på Pentium (og kompatible) og nyere processorer. Opcode : 0F 31 [1] .
rdtscp [2] er blevet understøttet siden Intel Nehalem og AMD Family 0x0F [3] . Opcode: 0F 01 F9 [4] .
Brug
rdtsc er mest brugt:
Fordele
Sammenlignet med operativsystem- leverede API'er som WINAPI::QueryPerformanceCounter() eller gettimeofday() kan rdtsc/rdtscp-instruktioner give følgende fordele:
- Bedre nøjagtighed, især for arkitekturer og ældre operativsystemer, der ikke har fuld HPET- understøttelse . Sådanne operativsystemer bruger en systemtimer med lav nøjagtighed (nogle gange op til et planlægningsudsnit, OsTimeSlice, i størrelsesordenen enheder eller titusinder af millisekunder).
- Mindre overhead: rdtsc/rdtscp-instruktioner udføres i omkring et dusin clock-cyklusser, hvilket er meget hurtigere end systemkald.
- Kræver ikke skift til Ring0 privilegeret tilstand eller hypervisor på de fleste systemer (hvis kommandoen er tilladt på OS).
Brugsproblemer
- Der bør være programtilstande, der ikke kræver denne kommando, da RDTSC / RDTSCP potentielt kan være utilgængelige eller forbudte til brug på slutsystemet, hvor applikationen skal bruges:
- på meget gamle processorer (f.eks. 80486 ) eller på systemer, der ikke fuldt ud implementerer x86-arkitekturen.
- instruktionen kan potentielt omdannes til en privilegeret instruktion (den 3. bit i CR4 kontrolregisteret indstilles af operativsystemet), og dens brug vil resultere i, at en undtagelse bliver smidt i programmet.
- instruktionen kan opsnappes af virtualiseringssystemer, dens brug vil føre til et hyperkald.
- Strømsparetilstanden kan påvirke antallet af ur:
- Når frekvensen ændres dynamisk af processoren (reducerer og øger frekvensen i SpeedStep, Turbo Boost, Cool&Quiet og lignende teknologier), ændres hastigheden på TSC-tælleren.
- Sætte en processor i dyb dvaletilstand C3 stopper TSC-tælleren på ældre processorer.
- I moderne Intel-processorer ( Nehalem og nyere) og AMD (formodentlig siden K10 Barcelona/Phenom) er TSC-tælleren uafhængig af brugen af strømbesparende teknologier og stiger med en konstant frekvens, uanset hvilken frekvens processoren kører på og om den kørte eller var i søvntilstand. En sådan tæller kaldes invariant ( invariant TSC ).
- Nøjagtige målinger er muligvis ikke mulige med en enkelt udførelse af det målte fragment af instruktioner på grund af påvirkningen af processorcaches, når der tilgås hukommelse. Det løses traditionelt ved gentagne gange at måle et programfragment eller ved at gentage det målte fragment i en loop.
- RDTSC kan genbestilles med afmålte instruktioner på Out-of-Order processorer. Genbestilling kan deaktiveres ved at tilføje serialiseringskommandoer (f.eks. CLD/CLC for Pentium - modeller P5, P54 [8] eller cpuid for nyere modeller) eller ved at bruge RDTSCP.
- Kort fragmentvarighedsmålinger kan være ustabile i multi-core og multi-processor systemer, eller ved brug af HyperThreading på grund af gensidig påvirkning fra andre tråde og belastningen på delte processorenheder.
- TSC-tællerne kan i sjældne tilfælde være ude af synkronisering på nogle multi-core eller multi-processor systemer, især:
- Ved initialisering af processorer.
- Det er muligt for tællere at blive ude af synkronisering på tidlige multi-core-systemer på grund af forkert initialisering af processorer af nogle BIOS'er. Rettet ved at opdatere BIOS eller opdatere operativsystemet. Der er programmer til at kontrollere for denne fejl. [9]
- Operativsystemet kan skifte tråd mellem forskellige kerner, der har ikke-synkroniserede tællere. På applikationsniveau kan du spore kendsgerningen om en kerneændring på multi-core-systemer ved hjælp af RDTSCP-instruktionen, som, der fungerer på samme måde som RDTSC, desuden returnerer nummeret på den logiske processor i ECX-registeret.
For at løse mange problemer anbefales det at rette tråden på en specifik processor ( cpu-affinitet ) og deaktivere automatiske frekvensændringsteknologier (strømbesparende teknologier og dynamiske ydelsesændringer).
Noter
- ↑ Softwareudviklermanual til Intel® 64 og IA-32 Architectures . — Bd. 2 (Instruktionssæt-reference). - S. 4-301.
- ↑ En serialiseringsversion af rdtsc-instruktionen, der også læser IA32_TSC_AUX MSR, som ofte gemmer kernenummeret.
- ↑ rdtscp . Hentet 1. november 2011. Arkiveret fra originalen 2. januar 2012. (ubestemt)
- ↑ Softwareudviklermanual til Intel® 64 og IA-32 Architectures . — Bd. 2 (Instruktionssæt-reference). - S. 4-303.
- ↑ Windows Anti-Debug Reference | Symantec Connect-fællesskabet . Dato for adgang: 30. december 2011. Arkiveret fra originalen 14. januar 2012. (ubestemt)
- ↑ Slide 58 Timing Based Anti-Debugging Arkiveret 4. marts 2012.
- ↑ Tom St. Denis, Simon Johnson, Kryptografi for udviklere Arkiveret 9. oktober 2021 på Wayback Machine .
- ↑ Sådan optimeres til Pentium-familien af mikroprocessorer Arkiveret 6. januar 2012 på Wayback Machine // 1996-2000 af Agner Fog. Kapitel "30. Test hastighed", arkiveret 19. november 2011.
- ↑ ICE Affinitet . Hentet 19. oktober 2011. Arkiveret fra originalen 7. september 2011. (ubestemt)
Links