{{Achtung|Text= Dieser Artikel wird gerade generalüberholt. Bitte nimm keine Änderungen an diesem Artikel vor! ~[[Benutzer:SHyx0rmZ|SHyx0rmZ]] 10:55, 6. Aug. 2009 (CEST)}}
Der '''CPUID'''-Befehl liefert, sofern er denn von der CPU unterstützt wird, Informationen zu zahlreichen Fähigkeiten der CPU, wie zum Beispiel den Herstellernamen, die Modellnummer oder die Größe des Caches.
== Wie man CPUID benutzt ==
Bevor man munter versucht, mit dem CPUID Befehl Informationen auszulesen, sollte man ersteinmal prüfen, ob die CPU den Befehl überhaupt unterstützt. Dazu testet man, ob das ID-Flag gesetzt und gelöscht werden kann.
Aussehen kann das zum Beispiel so:
pushfd ; Sichere Flags
pushfd ; Sichere Flags
pop ecx ; Lade Flags in EXC
mov eax, ecx ; Schiebe Flags in EAX
xor eax, 0x200000 ; Vertausche das ID-Flag
push eax ; Sichere neue Flags
popfd ; Lade neue Flags in EFLAGS
; Wenn CPUID unterstützt wird, wird das geänderte ID-Flag übernommen
; Ansonsten wird bleibt das alte ID-Flag bestehen
pushfd ; Sichere Flags
pop eax ; Lade Flags in EAX
xor eax, ecx ; Vergleiche EAX und ECX
popfd ; Stelle Original Flags wieder her
je cpuid_unsupported ; EAX und ECX sind gleich, CPUID wird nicht unterstütz!
jmp cpu_supported ; EAX und ECX sind verschieden, CPUID wird unterstützt!
Um den CPUID-Befehl auszuführen, verwendet man einfach den Assembler-Befehl '''cpuid'''. Die Funktionsnummer der CPUID-Funktion wird dabei im '''EAX'''-Register übergeben. Die Rückgabewerte werden in den Registern '''EAX''', '''EBX''', '''EDX''' und '''ECX''' abgelegt.
Um zum Beispiel den Vendor-ID-String, also den Herstellernamen, auszulesen, ruft man CPUID mit der Funktionsnummer 0x00000000 auf.
mov eax, 0x00000000 ; xor eax, eax bewirkt das selbe und ist schneller
cpuid ; Der Vendor-ID-String befindet sich nun in (in dieser Reihenfolge), EBX, EDX, ECX
Ein '''AMD'''-Prozessor hätte jetzt folgende Register Werte: '''EBX'''="'''Auth'''", '''EDX'''="'''enti'''", '''ECX'''="'''cAMD'''"
Ein '''Intel'''-Prozessor hätte jetzt folgende Register Werte: '''EBX'''="'''Genu'''", '''EDX'''="'''ineI'''", '''ECX'''="'''ntel'''"
== Standard Funktionen ==
Die Standard Funktionsnummern beginnen bei 0. Der größtmögliche Funktionsnummer, die von der jeweiligen CPU unterstützt wird befindet sich nach dem Aufruf von ''Function 0'' im ''EAX''-Register.
Die Standard Funktionen sind nicht Hersteller spezifisch, sondern sollen für alle CPUs gleich sein.
=== EAX = 0x00000000 ===
CPUID-Funktion Nr. 0x00 gibt wie bereits genannt die größte vom Prozessor unterstützte Funktionsnummer im ''EAX''-Register und die Vendor-ID in den Registern ''EBX'', ''EDX'' und ''ECX''(in dieser Reihenfolge) an. '''Achtung: Der String ist nicht nullterminiert!'''
==== Vendor-ID der einzelnen Hersteller ====
* AMD: "AuthenticAMD"
* Intel: "GenuineIntel"
* VIA: "CentaurHauls"
* Transmeta: "GenuineTMx86"
* Cyrix: "CyrixInstead"
* Centaur: "CentaurHauls"
* NexGen: "NexGenDriven"
* UMC: "UMC UMC UMC "
* SiS: "SiS SiS SiS "
* NSC: "Geode by NSC"
* Rise: "RiseRiseRise"
=== EAX = 0x00000001 ===
Das Ergebnis dieser Funktion ist folgendes:
==== EAX ====
{| {{Prettytable}}
! Bits || Funktion
|-
| 31 - 28 || bgcolor="#bbb" | Reserviert
|-
| 27 - 20 || Erweiterte Familie
|-
| 19 - 16 || Erweitertes Modell
|-
| 15 - 14 || bgcolor="#bbb" | Reserviert
|-
| 13 - 12 || Prozessortyp
|-
| 11 - 8 || Familienkennzeichen / Familiencode
|-
| 7 - 4 || Model
|-
| 4 - 0 || Stepping
|}
==== EBX ====
{| {{Prettytable}}
! Bits || Funktion
|-
| 31 - 24 || [[APIC|APIC ID]]
|-
| 23 - 16 || Count
|-
| 15 - 8 || Chunks
|-
| 7 - 0 || Brand ID
|}
*''APIC ID'' ist nur gültig wenn das ''[[#EDX_-_Featureflags|APIC-Flag]]'' gesetzt ist.
*''Count'' ist die Anzahl der logischen Prozessoren und ist nur mit gesetztem ''[[#EDX_-_Featureflags|Hyper-Threading-Flag]]'' gültig.
*''Chunks'' gibt die Größe einer Cache line in 8 Byte Blocken an. Das Feld ist ebenfalls nur gültig in Verbindung mit einem gesetzten ''[[#EDX_-_Featureflags|CFLUSH-Flag]]''.
==== ECX ====
Dieses Register gibt erweiterte Informationen über den Prozessor:
{| {{Prettytable}}
! Bits || Funktion
|-
| 9 || Verfügbarkeit von SSSE3
|-
| 5 || Verfügbarkeit von Virtual Machine Extensions (VMX)
|-
| 3 || Die Befehle MONITOR und MWAIT sind verfügbar
|-
| 0 || Verfügbarkeit von SSE3
|}
==== EDX - Featureflags ====
Dies sind die Featureflags. Wenn ein Bit gesetzt(=1) ist, dann wird das entsprechende Feature unterstützt.
{| {{Prettytable}}
! Bit || Funktion
|-
| 31 - 30 || bgcolor="#bbb" | Reserviert
|-
| 29 || Wenn eins, dann wird das Thermal Monitor unterstützt
|-
| 28 || Der Prozessor unterstützt Hyper-Threading.
|-
| 27 || Der Prozessor unterstützt Self-Snoop
|-
| 26 || Der Prozessor kann SSE2
|-
| 25 || Der Prozessor kann SSE
|-
| 24 || Der Prozessor unterstützt FXSAVE und FXSTOR, womit er einen Floatzusammenhang(?) speichern und wiederherstellen kann
|-
| 23 || Der Prozessor kann MMX
|-
| 22 || Die Temperatur und der Prozessortakt kann durch eine Software verändert und überwacht werden
|-
| 21 || Der Prozessor hat die Fähigkeit, die Entwicklung eines Ablegers in eine Adresse zu schreiben
|-
| 20 || bgcolor="#bbb" | Reserviert
|-
| 19 || Der Prozessor kann CSFLUSH
|-
| 18 || Der 12-Byte ProzessorID ist aktiviert und vorhanden
|-
| 17 || Der Prozessor kann im Protected Mode mehr als 4 GByte adressieren. (PSE)
|-
| 16 || Der Prozessor unterstützt die Page Attribute Table
|-
| 15 || Der Prozessor untersützt CMOVcc, und wenn Bit 0 gesetzt ist, dann kann er FCMOVCC und FCOMI
|-
| 14 || Der Prozessor unterstützt die Machine Check Architecture und MCG_CAP Register
|-
| 13 || Der Prozessor unterstützt die Page Entry Table, die Page Directory Table und das TLB muss nicht erneuert werden
|-
| 12 || Der Prozessor unterstützt die Memory Type Range Register, speziell das MTRR_CAP Register
|-
| 11 || Der Prozessor unterstützt die Fast System Call Befehle, den SYSENTER Befehl und SYSEXIT Befehl
|-
| 10 || bgcolor="#bbb" | Reserviert
|-
| 9 || Der Prozessor beinhaltet ein [[Local APIC]]
|-
| 8 || Der Prozessor unterstützt den CMPXCHG8 Befehl
|-
| 7 || Der Prozessor unterstützt die Machine Check Exception
|-
| 6 || Der Prozessor unterstützt Physical Adress Extension
|-
| 5 || Der Prozessor unterstützt die Model Specific Register, den RDMSR Befehl und den WRMSR Befehl
|-
| 4 || Der Prozessor unterstützt den RDTSC Befehl, zudem den CR4.TSD-Bit für Rechtekontrolle
|-
| 3 || Der Prozessor unterstützt 4-MByte-Pages
|-
| 2 || Der Prozessor unterstützt I/O-Breakpoints, das CR4.DE Bit und die DR4 und DR5 Register
|-
| 1 || Der Prozessor unterstützt Erweiterungen für den Virtual-8086-Modus
|-
| 0 || Der Prozessor unterstützt die Intel857-Gleitkommeoperationen
|}
=== EAX = 0x00000002 ===
Wenn in EAX statt Null Zwei steht, dann werden bei Intelprozessoren
Informationen über den Cache und die TLB-Deskriptoren ausgegeben.
=== EAX = 0x00000003 ===
Wenn in EAX statt Null Drei steht, wird bei Intelprozessoren
stattdessen folgendes ausgegeben:
==== EAX ====
Reserviert
==== EBX ====
Reserviert
==== ECX ====
Die Bits 31 bis 0 der Prozessor-ID sind darin hinterlegt.
'''Funktioniert nur bei Prozessoren, bei denen das entsprechende ''[[#EDX_-_Featureflags|Featureflag(Bit 18)]]'' gesetzt ist.'''
==== EDX ====
Die Bits 63 bis 32 der Prozessor-ID sind darin hinterlegt.
''(siehe oben)''
== Erweiterte Funktionen ==
Es gibt Funktionen, die Hersteller spezifisch sind, d.h. sieh gelten nur nur für Intel- bzw. nur für AMD Prozessoren. Solche Befehle sollte man nicht ausführen, wenn man nicht weiß von welchem Hersteller die CPU ist! Zum Beispiel sollten CPUID-Befehle, die nur für Intel-CPUs gelten, nicht auf einer AMD-CPU ausgeführt werden. Diese Funktionen beginnen bei 0x80000000.
Erweiterte Funktionen von Intel:
=== EAX = 0x80000000 ===
==== EAX ====
Enthält maximale erweiterte Funktionsnummer.
==== EBX ====
Reserviert
==== ECX ====
Reserviert
==== EDX ====
Reserviert
=== EAX = 0x80000001 ===
==== EAX ====
Reserviert
==== EBX ====
Reserviert
==== ECX ====
Reserviert
==== EDX ====
Wenn Bit 29 gesetzt, dann ist Intel64-Technologie verfügbar
=== EAX = 0x80000002 ===
==== EAX ====
Eingebrannter String
==== EBX ====
Eingebrannter String (Fortsetzung)
==== ECX ====
Eingebrannter String (Fortsetzung)
==== EDX ====
Eingebrannter String (Fortsetzung)
=== EAX = 0x80000003 ===
==== EAX ====
Eingebrannter String (Fortsetzung)
==== EBX ====
Eingebrannter String (Fortsetzung)
==== ECX ====
Eingebrannter String (Fortsetzung)
==== EDX ====
Eingebrannter String (Fortsetzung)
=== EAX = 0x80000004 ===
==== EAX ====
Eingebrannter String (Fortsetzung)
==== EBX ====
Eingebrannter String (Fortsetzung)
==== ECX ====
Eingebrannter String (Fortsetzung)
==== EDX ====
Eingebrannter String (Fortsetzung)
== Siehe auch ==
* [http://wiki.osdev.org/CPUID Englischer Artikel über den CPUID-Befehl]
* [http://sandpile.org/ia32/cpuid.htm Englische Doku von CPUID; mit AMD/INTEL und anderen Prozessoren]
* [http://support.intel.com/Assets/PDF/appnote/241618.pdf Intels CPUID-Spezifikation]
* [http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25481.pdf AMDs CPUID-Spezifikation]
[[Category:Glossar]]
[[Category:x86]]
[[Category:x86-Befehle]]