Cpuid (identificare cpu)

Deoarece arhitectura Intel evoluează odată cu adăugarea de noi generații și modele de procesoare (8086, 8088, Intel286, Intel386, Intel486, procesoare Pentium, Pentium procesoare overdrive, procesoare Pentium cu tehnologia MMX, Pentium procesor OverDrive cu tehnologia MMX, Pentium Pro procesoare, precum: Pentium II, Pentium II Xeon Pentium II Overdrive, Intel Celeron Mobile Intel Celeron, Pentium III, Mobile Intel Pentium III - M, Pentium III Xeon Pentium 4. Mobile Intel Pentium 4 - M, Intel Xeon și Intel Xeon MP), este important astfel încât Intel furnizează mijloacele prin care software-ul poate identifica caracteristicile fiecărui procesor. Acest mecanism de identificare a evoluat în combinație cu arhitectura Intel după cum urmează:

Evoluția procedurii de identificare a procesorului a fost necesară deoarece, pe măsură ce arhitectura Intel se răspândește, piața IT trebuie să fie pregătită să ajusteze funcționalitatea procesorului pe fundalul multor generații și modele cu caracteristici diferite. Se așteaptă ca această tendință să se răspândească la generațiile ulterioare de procesoare, inovarea în arhitectura instrucțiunilor Intel CPUID este extinsă. Având în vedere punctele forte ale instrucțiunii CPUID, dezvoltatorii pot crea aplicații și instrumente care pot fi utilizate împreună, în ciuda diversității bogate a generațiilor de procesoare Intel în trecut, prezent și viitor. [1]

Verificarea posibilității executării instrucțiunilor CPUID

Familia de procesoare Intel486 și procesoarele ulterioare furnizează o metodă directă pentru a determina dacă arhitectura internă a procesorului CPUID acceptă instrucțiunile. Această metodă utilizează un steag special ID localizat în 21 de biți din registrul EFLAGS. Dacă programul poate modifica valoarea acestui steag, procesorul suportă instrucțiunea CPUID, altfel nu. Acest bit este ilustrat mai jos.

Cpuid (identificare cpu)

Fig.1. 21 de biți în diferite tipuri de procesoare

Rezultatul instrucțiunii CPUID

Cpuid (identificare cpu)

Fig.2 Rezultatele execuției instrucțiunilor CPUID

Instrucțiunea CPUID acceptă două seturi de funcții. Primul set de funcții returnează informațiile de bază despre procesor. Folosind al doilea set, puteți obține mai multe informații despre procesor. Figura 2 ilustrează ce informații de bază despre procesor pot fi obținute și unde sunt stocate. Ieșirea instrucțiunii CPUID depinde în totalitate de conținutul registrului EAX. Aceasta înseamnă că, prin plasarea valori diferite în EAX registru, apoi executarea instrucțiunilor din CPUID, instrucțiune CPUID îndeplinește o funcție în funcție de valoarea care a fost plasat în registrul EAX (vezi. Tabelul 1). Pentru a determina funcțiile maxime registru valoarea de intrare EAX și CPUID admisibile care returnează informații de bază despre procesor, programul trebuie să seteze parametrul de registru EAX la zero, și apoi să execute instrucțiuni CPUID în felul următor:

După executarea instrucțiunii CPUID, valoarea returnată va fi prezentă în registrul EAX. Utilizați întotdeauna o valoare EAX mai mare sau egală cu zero și mai mică sau egală cu valoarea maximă EAX admisibilă.

Pentru a determina valoarea de intrare maximă admisibilă a registrelor EAX și a funcțiilor CPUID care returnează informații suplimentare, programul trebuie să stabilească valoarea parametrului registrului EAX egal cu 80000000h și apoi să execute instrucțiunea CPUID după cum urmează:

După executarea instrucțiunii CPUID, valoarea returnată va fi în registrul EAX. Utilizați întotdeauna EAX parametru valoare registru, care este mai mare sau egal cu 80000000h și mai mică sau egală cu EAX valoarea maximă admisă. În zilele noastre și viitorul IA-32 procesor 31 în biți registru EAX este șters atunci când este executat CPUID parametrul de intrare mai mare decât valoarea maximă pentru orice set de funcții, și atunci când funcțiile extinse nu sunt acceptate. Toate celelalte valori returnate de biți procesor ca răspuns la instrucțiunea CPUID cu o valoare în EAX adecvată pentru acest procesor mai sunt unice pentru acest model și nu este recomandat să le schimbe.

Codul producătorului

În plus față de returnarea valorii maxime admise în registrul EAX, ID-ul producătorului Intel poate fi, de asemenea, verificat în același timp. Dacă registrul EAX conține zero la intrare, instrucțiunea CPUID returnează și identificatorul producătorului în registrele EBX, EDX și ECX (a se vedea figura 2). Aceste registre conțin șirul ASCII: GenuineIntel.

În timp ce orice simulator de arhitectură Intel poate suporta instrucțiunea CPUID, niciunul dintre ei nu poate pretinde că este o parte autentică a Intel. Astfel, prezența șirului GenuineIntel este o garanție că instrucțiunea CPUID și identificatorul sunt implementate în conformitate cu documentul care conține descrierea procesoarelor Intel și instrucțiunile CPUID. Dacă o astfel de linie nu apare după executarea instrucțiunii, nu se bazează pe informațiile din acest document pentru a interpreta informațiile returnate de instrucțiunea CPUID.

Tabelul 1. Informații returnate prin instrucțiunea CPUID

Valoarea inițială a EAX

A furnizat informații despre procesor

EAX, EBX, ECX, EDX Continuarea liniei de brand

Semnarea identificării procesului

Începând cu familia de procesoare Intel486, registrul EDX conține semnătura de identificare a procesorului care apare acolo după resetare (a se vedea Figura 3). Semnătura de identificare a procesorului este de 32 de biți. Semnătura procesorului este formată din 8 câmpuri de biți diferite. Câmpurile gri sunt biti rezervate și trebuie stocate în cache. Restul de 6 câmpuri formează semnătura de identificare a procesorului.

Fig.3 Registrul EDX după resetare

  • Biți 20 prin 27. Mai multe informații despre familie, este utilizat în combinație cu o familie de cod de bază definit între 8 și 11 biți pentru a indica dacă procesorul aparține Intel386, Intel486, Pentium, Pentium Pro sau Pentium 4 familii.
  • Biti 16-19. Informațiile suplimentare despre model, utilizate împreună cu numărul de model definit între biții 4 și 7, sunt utilizați pentru a identifica modelul procesorului din familie. ID-ul în biți de la 0 la 3 indică numărul de revizie al acelui model.
  • Biti de la 12 la 13 informații despre tipul de procesor, indică dacă procesorul este procesorul original, OEM, OverDrive sau dual (Dual). Valorile de tip procesor returnate în biții 12 și 13 din registrul EAX sunt prezentate în Tabelul 2.
  • Bits 8 - 11. Codul principal al familiei procesoarelor
  • Bits 4 până la 7. model de familie de procesoare
  • Numărul de revizuiri de la 0 la 3. Numărul de revizie al modelului

Tabelul 2. Tipurile de procesoare (biți 12 și 13)

Steaguri și caracteristici

Când registrul EAX conține o valoare de 1, instrucțiunea CPUID (în plus față de încărcarea semnăturii procesorului din registrul EAX) încarcă registrele EDX și ECX cu valorile semnelor. Valorile de pavilion (atunci când Flag = 1) indică ce funcții suportă procesorul. Pentru a afla ce funcții suportă procesorul, consultați ghidul dezvoltatorului, utilizatorii sau altă documentație adecvată pentru procesor.

Dimensiunea cache, formatul și informațiile TLB

Când registrul EAX conține o valoare de 2, instrucțiunea CPUID încarcă registrele EAX, EBX, ECX și EDX cu descriptori care indică memoria cache a procesorului și caracteristicile TLB. Ultimii 8 biți ai registrului EAX (AL) conțin o valoare care indică de câte ori ar trebui executată instrucțiunea CPUID pentru a obține o imagine completă a sistemului de caching al procesorului. De exemplu, un procesor Pentium 4 returnează 1 în ultimii 8 biți ai registrului EAX pentru a indica că instrucțiunea CPUID trebuie executată o singură dată (cu EAX = 2) pentru a obține o imagine completă a configurației procesorului.

Restul EAX registru, registre EBX, ECX, și EDX și descriptori de cache conțin TLB. Tabelul 3 arată că atunci când bitul 31 din acest registru este zero, acest registru conține descriptori valide pe 8 biți. Pentru a decoda descriptori muta secvențial de la cel mai semnificativ bit al registrului până la baitul cel mai puțin semnificativ al registrului. Presupunând că 31 de biți este 0, atunci registrul conține cache valid sau descriptori TLB în biți 24 până la 31, 16 până la 23, 8-15 și 0 la 7. Programul trebuie să compare valoarea din bitul final descriptor domenii cu valori, decodifică descriptorul, și, astfel, determină cache-ul și performanța procesorului TLB.

Tabelul 3. Formatele descriptorilor

Rezervat pentru utilizare ulterioară

Descriptorii care indică un parametru de tabel pentru a determina caracteristicile cache-ului. Indică NULL dacă conține 0

Procesor Număr de serie

Numărul de serie al procesorului extinde conceptul de identificare a procesorului. Numărul de serie al procesorului este un număr pe 96 de biți accesibil prin instrucțiunea CPUID. Acesta poate fi folosit de aplicații pentru a identifica procesorul.

Numărul de serie al CPU

Pentru a determina dacă funcția de detectare a numărului serial al procesorului este acceptată, programul trebuie să seteze valoarea parametrului registrului EAX la 1 și apoi să execute instrucțiunea CPUID după cum urmează:

După executarea instrucțiunii CPUID, registrele ECX și EDX conțin caracteristici și steaguri. Dacă pavilionul PSN (biți 18 al registrului EDX) este egal cu 1, numărul de serie al procesorului este acceptat și activat. La 0, este oprit sau nu este suportat.

Generarea unui număr de serie pe 96 de biți

Numărul de serie al procesorului pe 96 de biți este o combinație de trei obiecte pe 32 de biți. Pentru a accesa biți mai vechi pe 32 de biți, programul ar trebui să seteze parametrul registrului EAX la 1 și apoi să execute instrucțiunile după cum se arată mai jos:

După ce este executat, registrul EAX conține semnătura de identificare a procesorului. Acesta include cei mai mari biți pe 32 de biți ai numărului serial al procesorului. Valoarea în EAX trebuie reținută până când se colectează restul de 64 de biți din numărul de serie.

Pentru a le accesa, programul ar trebui să stabilească parametrul registrului EAX la 3 și apoi să execute instrucțiunea CPUID:

După executarea instrucțiunii CPUID, registrul EDX conține o medie de 32 de biți, iar registrul ECX conține cel mai puțin semnificativ 32 de biți din numărul de serie. După aceasta, programul poate conecta semnătura de identificare stocată, EDX și ECX, apoi returnează întregul număr de serie pe 96 de biți al procesorului. [2]

Numărul care ajută la identificarea procesorului

Începând cu procesoarele Pentium 3, conceptul de identificare a procesorului a fost extins prin adăugarea unui număr special de identificare. Este un număr pe 8 biți accesibil prin instrucțiunea CPUID. Poate fi folosit de aplicații pentru a facilita identificarea procesorului.

Procesoarele care au acest număr îl returnează în biții 0 până la 7 în registrul EBX atunci când CPUID-ul este executat cu valoarea de pornire a unui registru EAX. Procesoarele care nu acceptă acest număr returnează o valoare zero în aceleași biți ale registrului EBX.

Șir de identificare

Această linie este o nouă extensie a instrucțiunii CPUID, implementată în unele procesoare. Folosind-o, aceste procesoare vor returna acest șir de identificare în codarea ASCII și frecvența maximă de operare prin instrucțiunea CPUID. Când instrucțiunea este executată cu setul de valori ale registrului EAX specificat în Tabelul 4, procesorul va returna acest șir în registrele cu scop general. [3]

Tabelul 4. Caracteristicile șirului de identificare al procesorului

Introduceți EAX

EAX, EBX, ECX, EDX conțin un șir ASCII

Secvența identificării procesorului

Pentru a identifica procesorul folosind instrucțiunea CPUID, programul trebuie să urmeze următoarea secvență:

  1. Pasul 1. Determinați dacă instrucțiunea CPUID este acceptată prin modificarea pictogramei ID din registrul EFLAGS. Dacă nu o puteți schimba, atunci nu este acceptată.
  2. Pasul 2. Completați instrucțiunea cu valoarea în EAX 80000000h. Trebuie să faceți acest lucru pentru a afla dacă șirul de identificare este acceptat. Dacă această funcție returnează o valoare mai mare de 80000000h, șirul de identificare este acceptat și programul trebuie să utilizeze funcții cu 80000002h la 80000004h pentru identificare ulterioară.
  3. Pasul 3. Dacă șirul de identificare nu este acceptat, executați un CPUID cu o valoare de 1 în registrul EAX. Această funcție va returna o semnătură de identificare în registrul EAX și un număr care ajută la identificarea biților 0 până la 7 din registrul EBX. Dacă acestea conțin o valoare diferită de 0, atunci numărul este suportat. În acest caz, programul trebuie să scaneze lista de numere pentru identificare.
  4. Pasul 4. Dacă numărul nu este acceptat, programul utilizează semnătura de identificare împreună cu mânerele cache pentru identificare.