| 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 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" | ||
| − | == | + | === EAX = 0x00000001 === |
| − | + | Das Ergebnis der diser Funktion ist folgendes: | |
| − | + | ==== EAX ==== | |
| − | |||
| − | |||
{| {{Prettytable}} | {| {{Prettytable}} | ||
| − | ! | + | ! 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 ==== | |
{| {{Prettytable}} | {| {{Prettytable}} | ||
| − | ! | + | ! Bits || Funktion |
|- | |- | ||
| − | | 31 - 24 || [[APIC]] | + | | 31 - 24 || [[APIC|APIC ID]] |
|- | |- | ||
| − | | 23 - 16 || | + | | 23 - 16 || Count |
|- | |- | ||
| − | | 15 - 8 || | + | | 15 - 8 || Chunks |
|- | |- | ||
| − | | 7 - 0 || Brand ID | + | | 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 ==== | ||
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 - Featureflags ==== | |
| − | Dies sind die Featureflags. Wenn ein Bit | + | 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 | + | | 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. ( | + | | 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 | + | | 9 || Der Prozessor beinhaltet ein [[Local APIC]] |
|- | |- | ||
| − | | 8 || Der Prozessor unterstützt | + | | 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- | + | | 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 | ||
|} | |} | ||
| − | === | + | |
| + | === 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 === |
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 ==== | |
Reserviert | Reserviert | ||
| − | + | ==== EBX ==== | |
Reserviert | Reserviert | ||
| − | + | ==== ECX ==== | |
| − | Die | + | Die Bits 31 bis 0 der Prozessor-ID sind darin hinterlegt. |
| − | ''' Funktioniert nur bei | + | '''Funktioniert nur bei Prozessoren, bei denen das entsprechende ''[[#EDX_-_Featureflags|Featureflag(Bit 18)]]'' gesetzt ist.''' |
| − | + | ==== EDX ==== | |
Die Bytes 63 bis 32 der Prozessor-ID sind darin hinterlegt. | Die Bytes 63 bis 32 der Prozessor-ID sind darin hinterlegt. | ||
| − | '' | + | ''(siehe oben)'' |
| − | == | + | == Erweiterte Funktionen == |
| − | Es gibt | + | 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 == | ||