miniatura|423x423px|Un registre d'arrencada de Linux que mostra l'ús de TSC com a font de rellotge del sistema El comptador de marca de temps (TSC) és un registre de 64 bits present a tots els processadors x86 des del Pentium. Compta el nombre de cicles de CPU des del seu reinici. La instrucció RDTSC retorna el TSC a EDX:EAX. En el mode x86-64, RDTSC també esborra els 32 bits superiors de RAX i RDX. El seu codi d'operació és 0F 31 Els competidors de Pentium, com el Cyrix 6x86, no sempre tenien un TSC i poden considerar RDTSC una instrucció il·legal. Cyrix va incloure un comptador de marca de temps a la seva MII.

Ús El comptador de marca de temps va ser una manera d'alta resolució i baixa despesa perquè un programa obtingués informació de temps de la CPU. Amb l'arribada de les CPU multinucli/hiperfil, els sistemes amb diverses CPU i els sistemes operatius en hibernació, no es pot confiar en el TSC per proporcionar resultats precisos, tret que es tingui molta cura per corregir els possibles defectes: la velocitat de tic i si tots els nuclis (processadors) tenen valors idèntics als seus registres de control de temps. No hi ha cap garantia que els comptadors de marca de temps de diverses CPU d'una sola placa base estiguin sincronitzats. Per tant, un programa només pot obtenir resultats fiables limitant-se a executar-se en una CPU específica. Fins i tot així, la velocitat de la CPU pot canviar a causa de les mesures d'estalvi d'energia preses pel sistema operatiu o la BIOS, o el sistema pot hibernar i reprendre's més tard, reiniciant el TSC. En aquests últims casos, per mantenir-se rellevant, el programa ha de recalibrar el comptador periòdicament.

Confiar en el TSC també redueix la portabilitat, ja que altres processadors poden no tenir una característica similar. Els processadors Intel recents inclouen un TSC de velocitat constant (identificat pel sistema kern.timecounter.invariant_tsc a FreeBSD o pel senyalador " constant_tsc " a /proc/cpuinfo de Linux). Amb aquests processadors, el TSC funciona a la freqüència nominal del processador, independentment de la freqüència de rellotge real de la CPU a causa dels estats turbo o d'estalvi d'energia. Per tant, els ticks TSC compten el pas del temps, no el nombre de cicles de rellotge de la CPU transcorreguts.

A les plataformes Windows, Microsoft desaconsella fermament utilitzar el TSC per a la sincronització d'alta resolució exactament per aquestes raons, proporcionant en canvi les API de Windows QueryPerformanceCounter i QueryPerformanceFrequency (que utilitza RDTSCP si el sistema té un TSC invariant, és a dir, la freqüència del TSC no varia segons la freqüència del nucli actual). En sistemes Linux, un programa pot obtenir una funció similar llegint el valor del rellotge CLOCK_MONOTONIC_RAW utilitzant la funció clock_gettime.

A partir del Pentium Pro, els processadors Intel han practicat l'execució fora d'ordre, on les instruccions no s'executen necessàriament en l'ordre en què apareixen al programa. Això pot fer que el processador executi RDTSC abans del que espera un programa simple, produint un recompte de cicles enganyós. El programador pot resoldre aquest problema inserint una instrucció de serialització, com ara CPUID, per forçar que totes les instruccions precedents es completin abans de permetre que el programa continuï. La instrucció RDTSCP és una variant d' RDTSC que presenta una serialització parcial del flux d'instruccions, però no s'ha de considerar com a serialitzadora.

Implementació en diversos processadors Les famílies de processadors Intel incrementen el comptador de marca de temps de manera diferent:

Per a processadors Pentium M (família [06H], models [09H, 0DH]); per a processadors Pentium 4, processadors Intel Xeon (família [0FH], models [00H, 01H o 02H]); i per a processadors de la família P6: el comptador de marca de temps s'incrementa amb cada cicle de rellotge intern del processador. El cicle de rellotge del processador intern es determina per la relació actual entre el rellotge del nucli i el rellotge del bus. Les transicions a la tecnologia Intel SpeedStep també poden afectar el rellotge del processador. Per a processadors Pentium 4, processadors Intel Xeon (família [0FH], models [03H i superiors]); per a processadors Intel Core Solo i Intel Core Duo (família [06H], model [0EH]); per a processadors Intel Xeon sèrie 5100 i processadors Intel Core 2 Duo (família [06H], model [0FH]); per a processadors Intel Core 2 i Intel Xeon (família [06H], model_de_pantalla [17H]); per a processadors Intel Atom (família [06H], model_de_pantalla [1CH]): el comptador de marca de temps s'incrementa a una velocitat constant. Aquesta velocitat es pot establir mitjançant la relació màxima entre el rellotge del nucli i el rellotge del bus del processador o es pot establir mitjançant la freqüència màxima resolta a la qual s'inicia el processador. La freqüència màxima resolta pot ser diferent de la freqüència màxima qualificada del processador.

La configuració específica del processador en determina el comportament. El comportament constant del TSC garanteix que la durada de cada tic de rellotge sigui uniforme i permet utilitzar el TSC com a temporitzador de rellotge de paret fins i tot si el nucli del processador canvia de freqüència. Aquest és el comportament arquitectònic de tots els processadors Intel posteriors.

Els processadors AMD fins al nucli K8 sempre incrementaven el comptador de marca de temps cada cicle de rellotge. Així, les funcions de gestió d'energia podien canviar el nombre d'increments per segon i els valors podien desincronitzar-se entre diferents nuclis o processadors del mateix sistema. Per a Windows, AMD proporciona una utilitat per sincronitzar periòdicament els comptadors en CPU de diversos nuclis. Des de la família 10h (Barcelona/Phenom), els xips AMD presenten un TSC constant, que pot ser impulsat per la velocitat HyperTransport o per l'estat P més alt. Un bit CPUID ( Fn8000_0007:EDX_8 ) anuncia això; les CPU Intel també informen del seu TSC invariant en aquest bit.

Ús del sistema operatiu Un sistema operatiu pot proporcionar mètodes que utilitzen i no utilitzen la instrucció RDTSC per al control del temps, sota el control de l'administrador. Per exemple, en algunes versions del nucli de Linux, el mode de sandbox de seccomp desactiva RDTSC. També es pot desactivar mitjançant l'argument PR_SET_TSC a la crida al sistema prctl().

Ús en l'explotació d'atacs de canal lateral de memòria cau El comptador de marca de temps es pot utilitzar per cronometrar instruccions amb precisió, cosa que es pot explotar en les vulnerabilitats de seguretat Meltdown i Spectre. Tanmateix, si això no està disponible, es poden utilitzar altres comptadors o temporitzadors, com és el cas dels processadors ARM vulnerables a aquest tipus d'atac.

Altres arquitectures Altres processadors també tenen registres que compten els cicles de rellotge de la CPU, però amb noms diferents. Per exemple, a l'AVR32, s'anomena registre del comptador de rellotge de rendiment (PCCNT). SPARC V9 proporciona el registre TICK. PowerPC proporciona el registre TBR de 64 bits.

ARMv7 proporciona un registre de comptador de cicles CCNT com a part de la seva "Unitat de monitorització del rendiment", i instruccions per llegir i escriure el comptador, però el comptador està desactivat per defecte (per estalviar energia) i les instruccions són privilegiades. Es pot habilitar l'accés en mode d'usuari. Les arquitectures ARMv7 i ARMv8-A proporcionen un comptador genèric que compta a una freqüència constant, però aquesta freqüència sol ser com a màxim 50. MHz.

Referències

Categoria:Microprocessadors d'Intel