CPUID — Änderungen 5242 → 5244

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 EXC
+
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 unterstütz!
+
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 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 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 Register Werte: '''EBX'''="'''Auth'''", '''EDX'''="'''enti'''", '''ECX'''="'''cAMD'''"<br>
+
Ein '''AMD'''-Prozessor hätte jetzt folgende Registerwerte: '''EBX'''="'''Auth'''", '''EDX'''="'''enti'''", '''ECX'''="'''cAMD'''"<br>
−
Ein '''Intel'''-Prozessor hätte jetzt folgende Register Werte: '''EBX'''="'''Genu'''", '''EDX'''="'''ineI'''", '''ECX'''="'''ntel'''"
+
Ein '''Intel'''-Prozessor hätte jetzt folgende Registerwerte: '''EBX'''="'''Genu'''", '''EDX'''="'''ineI'''", '''ECX'''="'''ntel'''"
  
−
= Standard Funktionen =
+
= Standardfunktionen =
−
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 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 Standard Funktionen sind nicht Hersteller spezifisch, sondern sollen für alle CPUs gleich sein.  
+
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) an.  
+
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 Standard-Funktion ====
+
==== EAX - Höchste Standardfunktion ====
 
{| {{prettytable32bit|size="30pt"}}
 
{| {{prettytable32bit|size="30pt"}}
−
{{cs|32}}Höchste, unterstützte Standard-Funktion
+
{{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 Debug Informationen in im Hauptspeicher präsente Buffer schreiben
+
{{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 Bedingte Verschiebungen vorgenommen werden können
+
{{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 [[Systemcall|Systemcalls]] durch die Befehle '''SYSENTER''' und '''SYSEXIT'''
+
{{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 Null Zwei steht, dann werden bei Intelprozessoren
+
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 Null Drei steht, wird bei Intelprozessoren
+
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 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.
+
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: