CPUID — Änderungen 3650 → 3916

Zeile 2: Zeile 2:
  
 
== Wie man CPUID benutzt ==
 
== Wie man CPUID benutzt ==
−
Um den CPUID-Befehl auszuführen, verwendet man einfach den Assembler-Befehl "CPUID". Die nötigen Parameter werden dabei im Register EAX angegeben.
+
Um den CPUID-Befehl auszuführen, verwendet man einfach den Assembler-Befehl "CPUID". Die nötigen Parameter(Funktionsnummer) werden dabei im Register EAX angegeben. Die Rückgabewerte werden in den Registern ''EAX'', ''EBX'', ''EDX'' und ''ECX'' abgelegt.
−
Um zum Beispiel den Vendor-ID-String, also den Herstellernamen, zu bekommen, ruft man CPUID mit dem Parameter 0x0 in EAX auf.
 
−
<pre>
 
−
mov eax, 0x0
 
−
cpuid
 
−
</pre>
 
  
−
Natürlich gibt der CPUID-Befehl auch ein Ergebnis zurück. In diesem Fall gibt er einen String zurück, dessen ASCII-Werte in EBX, EDX und ECX liegen. Wenn man den Inhalt dieser drei Register (in dieser Reihenfolge!) hintereinander in den Speicher schreibt, erhält man einen String, die Vendor-ID. Jeder Hersteller hat eigene Vendor-ID. <b>Achtung: Der String ist nicht nullterminiert!</b>
+
Um zum Beispiel den Vendor-ID-String, also den Herstellernamen, zu bekommen, ruft man CPUID mit der Funktionsnummer 0x00 auf.
−
=== Vendor-ID der einzelnen Hersteller ===
+
<asm>
 +
mov eax, 0x00
 +
cpuid
 +
</asm>
 +
Ein AMD-Prozessor hätte jetzt folgende Register Werte: EBX="'''Auth'''", EDX="'''enti'''", ECX="'''cAMD'''"
 +
 
 +
== Standard Funktionen ==
 +
Die Standard Funktionsnummern beginnen bei 0. Der größt mögliche Funktionsnummer, die von der jeweiligen CPU unterstützt wird befindet sich nach dem aufrufen 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. '''Auchtung: Der String ist nicht nullterminiert!'''
 +
==== Vendor-ID der einzelnen Hersteller ====
 
* AMD: "AuthenticAMD"
 
* AMD: "AuthenticAMD"
 
* Intel: "GenuineIntel"
 
* Intel: "GenuineIntel"
Zeile 23: Zeile 30:
 
* Rise: "RiseRiseRise"
 
* Rise: "RiseRiseRise"
  
−
== Spezifische CPUID-Befehle==
+
=== EAX = 0x00000001 ===
−
=== Intelbefehle ===
+
Das Ergebnis der diser Funktion ist folgendes:  
−
==== EAX-Inhalt ist eins ====
+
==== EAX ====
−
Wenn im EAX statt Null eine Eins steht, dann wird bei Intelprozessoren stattdessen folgendes ausgegeben:
 
−
===== EAX =====
 
 
{| {{Prettytable}}
 
{| {{Prettytable}}
−
! Byte || Funktion   
+
! Bits || Funktion   
 
|-
 
|-
−
| 31 - 28 || Reserviert
+
| 31 - 28 || bgcolor="#bbb" | Reserviert
 
|-
 
|-
 
| 27 - 20 || Erweiterte Familie
 
| 27 - 20 || Erweiterte Familie
Zeile 37: Zeile 42:
 
| 19 - 16 || Erweitertes Modell
 
| 19 - 16 || Erweitertes Modell
 
|-
 
|-
−
| 15 - 14 || Reserviert
+
| 15 - 14 || bgcolor="#bbb" | Reserviert
 
|-
 
|-
 
| 13 - 12 || Prozessortyp
 
| 13 - 12 || Prozessortyp
Zeile 47: Zeile 52:
 
| 4 - 0 || Stepping
 
| 4 - 0 || Stepping
 
|}
 
|}
−
===== EBX =====
+
==== EBX ====
 
{| {{Prettytable}}
 
{| {{Prettytable}}
−
! Byte || Funktion   
+
! Bits || Funktion   
 
|-
 
|-
−
| 31 - 24 || [[APIC]] ID (Reserviert)
+
| 31 - 24 || [[APIC|APIC ID]]
 
|-
 
|-
−
| 23 - 16 || Zähler(?) (Reserviert)
+
| 23 - 16 || Count
 
|-
 
|-
−
| 15 - 8 || Stücke/Einheiten(?) (Reserviert)
+
| 15 - 8 || Chunks
 
|-
 
|-
−
| 7 - 0 || Brand ID (Reserviert)
+
| 7 - 0 || Brand ID
 
|}
 
|}
−
===== ECX =====
+
*''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&nbsp;Byte Blocken an. Das Feld ist ebenfalls nur gültig in Verbindung mit einem gesetzten ''[[#EDX_-_Featureflags|CFLUSH-Flag]]''.
 +
==== ECX ====
 
Hier soll ein Bytearray sein, es wird aber nicht empfohlen, daraus zu lesen. Dieses Feld ist ein kommendes Feature. Es zählt also zu den reservierten Feldern.
 
Hier soll ein Bytearray sein, es wird aber nicht empfohlen, daraus zu lesen. Dieses Feld ist ein kommendes Feature. Es zählt also zu den reservierten Feldern.
−
===== EDX =====
+
==== EDX - Featureflags ====
−
Dies sind die Featureflags. Wenn ein Bit eins, wird das entsprechende Feature unterstüzt.
+
Dies sind die Featureflags. Wenn ein Bit gesetzt(=1) ist, dann wird das entsprechende Feature unterstützt.
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Bit  || Funktion   
 
! Bit  || Funktion   
 
|-
 
|-
−
| 31 - 30 || Reserviert
+
| 31 - 30 || bgcolor="#bbb" | Reserviert
 
|-
 
|-
 
| 29 || Wenn eins, dann wird das Thermal Monitor unterstützt
 
| 29 || Wenn eins, dann wird das Thermal Monitor unterstützt
 
|-
 
|-
−
| 28 || Der Prozessor könnte Hyper-Threading. Wenn in EBX ein Wert größer als 1 ist, dann wird Hyper-Threading unterstützt
+
| 28 || Der Prozessor unterstützt Hyper-Threading.
 
|-
 
|-
 
| 27 || Der Prozessor unterstützt Self-Snoop
 
| 27 || Der Prozessor unterstützt Self-Snoop
Zeile 86: Zeile 94:
 
| 21 || Der Prozessor hat die Fähigkeit, die Entwicklung eines Ablegers in eine Adresse zu schreiben
 
| 21 || Der Prozessor hat die Fähigkeit, die Entwicklung eines Ablegers in eine Adresse zu schreiben
 
|-
 
|-
−
| 20 || Reserviert
+
| 20 || bgcolor="#bbb" | Reserviert
 
|-
 
|-
 
| 19 || Der Prozessor kann CSFLUSH
 
| 19 || Der Prozessor kann CSFLUSH
Zeile 92: Zeile 100:
 
| 18 || Der 12-Byte ProzessorID ist aktiviert und vorhanden
 
| 18 || Der 12-Byte ProzessorID ist aktiviert und vorhanden
 
|-
 
|-
−
| 17 || Der Prozessor kann im Protected Mode mehr als 4 GByte adressieren. (PAE?)
+
| 17 || Der Prozessor kann im Protected Mode mehr als 4 GByte adressieren. (PSE)
 
|-
 
|-
 
| 16 || Der Prozessor unterstützt die Page Attribute Table
 
| 16 || Der Prozessor unterstützt die Page Attribute Table
Zeile 106: Zeile 114:
 
| 11 || Der Prozessor unterstützt die Fast System Call Befehle, den SYSENTER Befehl und SYSEXIT Befehl
 
| 11 || Der Prozessor unterstützt die Fast System Call Befehle, den SYSENTER Befehl und SYSEXIT Befehl
 
|-
 
|-
−
| 10 || Reserviert
+
| 10 || bgcolor="#bbb" | Reserviert
 
|-
 
|-
−
| 9 || Der Prozessor beinhaltet ein per Softwareansprechbaren [[Local APIC]]
+
| 9 || Der Prozessor beinhaltet ein [[Local APIC]]
 
|-
 
|-
−
| 8 || Der Prozessor unterstützt das Vergleichen und Verändern von 8-Byte-Befehlen
+
| 8 || Der Prozessor unterstützt den CMPXCHG8 Befehl
 
|-
 
|-
 
| 7 || Der Prozessor unterstützt die Machine Check Exception
 
| 7 || Der Prozessor unterstützt die Machine Check Exception
Zeile 120: Zeile 128:
 
| 4 || Der Prozessor unterstützt den RDTSC Befehl, zudem den CR4.TSD-Bit für Rechtekontrolle
 
| 4 || Der Prozessor unterstützt den RDTSC Befehl, zudem den CR4.TSD-Bit für Rechtekontrolle
 
|-
 
|-
−
| 3 || Der Prozessor unterstützt 4-Byte-Pages
+
| 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
 
| 2 || Der Prozessor unterstützt I/O-Breakpoints, das CR4.DE Bit und die DR4 und DR5 Register
Zeile 128: Zeile 136:
 
| 0 || Der Prozessor unterstützt die Intel857-Gleitkommeoperationen
 
| 0 || Der Prozessor unterstützt die Intel857-Gleitkommeoperationen
 
|}
 
|}
−
==== Wenn EAX 2 ist ====
+
 
 +
=== 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.
−
==== Wenn EAX 3 ist ====
+
=== 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 ====
 
Reserviert
 
Reserviert
−
===== EBX =====
+
==== EBX ====
 
Reserviert
 
Reserviert
−
===== ECX =====
+
==== ECX ====
−
Die Bytes 31 bis 0 der Prozessor-ID sind darin hinterlegt.
+
Die Bits 31 bis 0 der Prozessor-ID sind darin hinterlegt.
−
''' Funktioniert nur bei Intelprozessoren, wo das im Featureflag steht. (Tabelle siehe oben) '''
+
'''Funktioniert nur bei Prozessoren, bei denen das entsprechende ''[[#EDX_-_Featureflags|Featureflag(Bit 18)]]'' gesetzt ist.'''
−
===== EDX =====
+
==== EDX ====
 
Die Bytes 63 bis 32 der Prozessor-ID sind darin hinterlegt.
 
Die Bytes 63 bis 32 der Prozessor-ID sind darin hinterlegt.
−
''' Funktioniert nur bei Intelprozessoren, wo das im Featureflag steht. (Tabelle siehe oben) '''
+
''(siehe oben)''
  
−
== Hinweise ==
+
== Erweiterte Funktionen ==
−
Es gibt Befehle, die nur für Intel bzw. AMD Prozessoren verfügbar sind. 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.
+
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.
  
 
== Siehe auch ==
 
== Siehe auch ==