| Zeile 23: | Zeile 23: | ||
== Wie man CPUID benutzt == | == 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. | + | 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: | Aussehen kann das zum Beispiel so: | ||
| Zeile 29: | Zeile 29: | ||
pushfd ; Sichere Flags | pushfd ; Sichere Flags | ||
pushfd ; Sichere Flags | pushfd ; Sichere Flags | ||
| − | pop ecx ; Lade Flags in | + | pop ecx ; Lade Flags in ECX |
mov eax, ecx ; Schiebe Flags in EAX | mov eax, ecx ; Schiebe Flags in EAX | ||
xor eax, 0x200000 ; Vertausche das ID-Flag | xor eax, 0x200000 ; Vertausche das ID-Flag | ||
| Zeile 40: | Zeile 40: | ||
xor eax, ecx ; Vergleiche EAX und ECX | xor eax, ecx ; Vergleiche EAX und ECX | ||
popfd ; Stelle Original Flags wieder her | popfd ; Stelle Original Flags wieder her | ||
| − | je cpuid_unsupported ; EAX und ECX sind gleich, CPUID wird nicht | + | je cpuid_unsupported ; EAX und ECX sind gleich, CPUID wird nicht unterstützt! |
jmp cpu_supported ; EAX und ECX sind verschieden, CPUID wird unterstützt! | jmp cpu_supported ; EAX und ECX sind verschieden, CPUID wird unterstützt! | ||
</asm> | </asm> | ||
| − | Um den CPUID-Befehl auszuführen, verwendet man einfach den | + | Um den CPUID-Befehl auszuführen, verwendet man einfach den Assemblerbefehl '''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. | Um zum Beispiel den Vendor-ID-String, also den Herstellernamen, auszulesen, ruft man CPUID mit der Funktionsnummer 0x00000000 auf. | ||
| Zeile 51: | Zeile 51: | ||
cpuid ; Der Vendor-ID-String befindet sich nun in (in dieser Reihenfolge), EBX, EDX, ECX | cpuid ; Der Vendor-ID-String befindet sich nun in (in dieser Reihenfolge), EBX, EDX, ECX | ||
</asm> | </asm> | ||
| − | Ein '''AMD'''-Prozessor hätte jetzt folgende | + | Ein '''AMD'''-Prozessor hätte jetzt folgende Registerwerte: '''EBX'''="'''Auth'''", '''EDX'''="'''enti'''", '''ECX'''="'''cAMD'''"<br> |
| − | Ein '''Intel'''-Prozessor hätte jetzt folgende | + | Ein '''Intel'''-Prozessor hätte jetzt folgende Registerwerte: '''EBX'''="'''Genu'''", '''EDX'''="'''ineI'''", '''ECX'''="'''ntel'''" |
| − | = | + | = Standardfunktionen = |
| − | Die | + | Die Standardfunktionsnummern beginnen bei 0. Die größtmögliche Funktionsnummer, die von der jeweiligen CPU unterstützt wird, befindet sich nach dem Aufruf von Funktion 0 im ''EAX''-Register. |
| − | Die | + | Die Standardfunktionen sind nicht herstellerspezifisch, sondern sollen für alle CPUs gleich sein. |
== Funktion 0x0000_0000 == | == 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) | + | CPUID-Funktion Nr. 0x00 gibt die 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) zurück. |
{{Achtung|Text= Der String ist nicht nullterminiert!}} | {{Achtung|Text= Der String ist nicht nullterminiert!}} | ||
| − | ==== EAX - Höchste | + | ==== EAX - Höchste Standardfunktion ==== |
{| {{prettytable32bit|size="30pt"}} | {| {{prettytable32bit|size="30pt"}} | ||
| − | {{cs|32}}Höchste | + | {{cs|32}}Höchste unterstützte Standardfunktion |
|} | |} | ||
| Zeile 140: | Zeile 140: | ||
{{cs|8}} [[APIC|APIC ID]] | {{cs|8}} [[APIC|APIC ID]] | ||
{{cs|8}} Anzahl logischer Prozessoren | {{cs|8}} Anzahl logischer Prozessoren | ||
| − | {{cs|8}} CLFLUSH Size | + | {{cs|8}} CLFLUSH-Size |
{{cs|8}} Brand ID | {{cs|8}} Brand ID | ||
|} | |} | ||
{{Achtung|Text='''APIC ID''' ist nur gültig wenn das '''[[#EDX_-_Featureflags|APIC-Flag]]''' gesetzt ist.<br/> | {{Achtung|Text='''APIC ID''' ist nur gültig wenn das '''[[#EDX_-_Featureflags|APIC-Flag]]''' gesetzt ist.<br/> | ||
Die Anzahl der logischen Prozessoren ist nur bei gesetztem '''[[#EDX_-_Featureflags|Hyper-Threading-Flag]]''' gültig.<br/> | Die Anzahl der logischen Prozessoren ist nur bei gesetztem '''[[#EDX_-_Featureflags|Hyper-Threading-Flag]]''' gültig.<br/> | ||
| − | '''CLFLUSH Size''' gibt die Größe einer Cache line in 8 Byte Blöcken an. Das Feld ist nur gültig in Verbindung mit einem gesetzten '''[[#EDX_-_Featureflags|CFLUSH-Flag]]'''. | + | '''CLFLUSH-Size''' gibt die Größe einer Cache line in 8-Byte-Blöcken an. Das Feld ist nur gültig in Verbindung mit einem gesetzten '''[[#EDX_-_Featureflags|CFLUSH-Flag]]'''. |
}} | }} | ||
==== ECX - Featureflags ==== | ==== ECX - Featureflags ==== | ||
| − | Dies sind die Featureflags. Wenn ein Bit gesetzt(=1) ist, dann wird das entsprechende Feature unterstützt. | + | Dies sind die Featureflags. Wenn ein Bit gesetzt (=1) ist, dann wird das entsprechende Feature unterstützt. |
{| {{prettytable32bit|size="30pt"}} | {| {{prettytable32bit|size="30pt"}} | ||
| Zeile 251: | Zeile 251: | ||
|- | |- | ||
{{csh|1}} 7 | {{csh|1}} 7 | ||
| − | {{csintell|1}} Unterstützt Enhanced Intel SpeedStep und implementiert das '''IA32_PERF_STS''' Register und das '''IA32_PERF_CTL''' Register | + | {{csintell|1}} Unterstützt Enhanced Intel SpeedStep und implementiert das '''IA32_PERF_STS'''-Register und das '''IA32_PERF_CTL'''-Register |
|- | |- | ||
{{csh|1}} 6 | {{csh|1}} 6 | ||
| Zeile 260: | Zeile 260: | ||
|- | |- | ||
{{csh|1}} 4 | {{csh|1}} 4 | ||
| − | {{csintell|1}} Unterstützt die Erweiterungen des Debug Speicher Features um durch CPL qualifizierten Branch Message Speicher zu nutzen | + | {{csintell|1}} Unterstützt die Erweiterungen des Debug-Speicher-Features um durch CPL qualifizierten Branch-Message-Speicher zu nutzen |
|- | |- | ||
{{csh|1}} 3 | {{csh|1}} 3 | ||
| Zeile 266: | Zeile 266: | ||
|- | |- | ||
{{csh|1}} 2 | {{csh|1}} 2 | ||
| − | {{csintell|1}} Kann den Verlauf der 64-Bit Branch in/von Adressen in einen Buffer schreiben | + | {{csintell|1}} Kann den Verlauf der 64-Bit-Branch in/von Adressen in einen Buffer schreiben |
|- | |- | ||
{{csh|1}} 1 | {{csh|1}} 1 | ||
| Zeile 276: | Zeile 276: | ||
==== EDX - Featureflags ==== | ==== EDX - Featureflags ==== | ||
| − | Dies sind die Featureflags. Wenn ein Bit gesetzt(=1) ist, dann wird das entsprechende Feature unterstützt. | + | Dies sind die Featureflags. Wenn ein Bit gesetzt (=1) ist, dann wird das entsprechende Feature unterstützt. |
{| {{prettytable32bit|size="30pt"}} | {| {{prettytable32bit|size="30pt"}} | ||
| Zeile 348: | Zeile 348: | ||
|- | |- | ||
{{csh|1}} 21 | {{csh|1}} 21 | ||
| − | {{csintell|1}} Kann | + | {{csintell|1}} Kann Debuginformationen in im Hauptspeicher vorhandene Buffer schreiben |
|- | |- | ||
{{csh|1}} 20 | {{csh|1}} 20 | ||
| Zeile 354: | Zeile 354: | ||
|- | |- | ||
{{csh|1}} 19 | {{csh|1}} 19 | ||
| − | {{csl|1}} Unterstützt den '''CLFLUSH''' Befehl | + | {{csl|1}} Unterstützt den '''CLFLUSH'''-Befehl |
|- | |- | ||
{{csh|1}} 18 | {{csh|1}} 18 | ||
| Zeile 366: | Zeile 366: | ||
|- | |- | ||
{{csh|1}} 15 | {{csh|1}} 15 | ||
| − | {{csl|1}} Unterstützt den '''CMOVcc''' Befehl, mit dem | + | {{csl|1}} Unterstützt den '''CMOVcc''' Befehl, mit dem bedingte Verschiebungen vorgenommen werden können |
|- | |- | ||
{{csh|1}} 14 | {{csh|1}} 14 | ||
| − | {{csl|1}} Unterstützt die Machine-Check Architektur (Besonders das '''MTRR_CAP'''-Register) | + | {{csl|1}} Unterstützt die Machine-Check-Architektur (Besonders das '''MTRR_CAP'''-Register) |
|- | |- | ||
{{csh|1}} 13 | {{csh|1}} 13 | ||
| Zeile 378: | Zeile 378: | ||
|- | |- | ||
{{csh|1}} 11 | {{csh|1}} 11 | ||
| − | {{csl|1}} Unterstützt schnelle [[ | + | {{csl|1}} Unterstützt schnelle [[Syscall|Syscalls]] durch die Befehle '''SYSENTER''' und '''SYSEXIT''' |
|- | |- | ||
{{csh|1}} 10 | {{csh|1}} 10 | ||
| Zeile 415: | Zeile 415: | ||
== EAX = 0x00000002 == | == EAX = 0x00000002 == | ||
| − | Wenn in EAX statt | + | Wenn in EAX statt null zwei steht, dann werden bei Intelprozessoren |
Informationen über den Cache und die TLB-Deskriptoren ausgegeben. | Informationen über den Cache und die TLB-Deskriptoren ausgegeben. | ||
== EAX = 0x00000003 == | == EAX = 0x00000003 == | ||
| − | Wenn in EAX statt | + | Wenn in EAX statt null drei steht, wird bei Intelprozessoren |
stattdessen folgendes ausgegeben: | stattdessen folgendes ausgegeben: | ||
==== EAX ==== | ==== EAX ==== | ||
| Zeile 432: | Zeile 432: | ||
= Erweiterte Funktionen = | = Erweiterte Funktionen = | ||
| − | Es gibt Funktionen, die | + | Es gibt Funktionen, die herstellerspezifisch sind, d.h. sie 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: | Erweiterte Funktionen von Intel: | ||