{{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 Funktion 0 im ''EAX''-Register. Die Standard Funktionen sind nicht Hersteller spezifisch, sondern sollen für alle CPUs gleich sein. == Funktion 0x0000_0000 == CPUID-Funktion Nr. 0x00 gibt höchste vom Prozessor unterstützte Funktionsnummer im '''EAX'''-Register und die [[CPUID#Vendor-ID-Strings|Vendor-ID]] in den Registern '''EBX''', '''EDX''' und '''ECX'''(in dieser Reihenfolge) an. {{Achtung|Text= Der String ist nicht nullterminiert!}} ====EAX==== {| {{prettytable32bit|size="30pt"}} | colspan="32" align="center" | Höchste, unterstützte Standard-Funktion |} ====EBX==== {| {{prettytable32bit|size="30pt"}} | colspan="32" align="center" | Bytes 0 - 3 des Vendor-ID-Strings |} ====ECX==== {| {{prettytable32bit|size="30pt"}} | colspan="32" align="center" | Bytes 8 - 11 des Vendor-ID-Strings |} ====EDX==== {| {{prettytable32bit|size="30pt"}} | colspan="32" align="center" | Bytes 4 - 7 des Vendor ID-Strings |} ==== Vendor-ID-Strings ==== {| {{prettytable}} ! Vendor-ID-String ! Hersteller |- | "AuthenticAMD" | AMD |- | "CentaurHauls" | Centaur |- | "CyrixInstead" | Cyrix |- | "GenuineIntel" | Intel |- | "NexGenDriven" | NexGen |- | "Geode by NSC" | National Semiconductor |- | "RiseRiseRise" | Rise |- | "SiS SiS SiS " | SiS |- | "GenuineTMx86" | Transmeta |- | "UMC UMC UMC " | UMC |- | "VIA VIA VIA " | VIA |} === 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]]