CPUID
Achtung!
Dieser Artikel wird gerade generalüberholt. Bitte nimm keine Änderungen an diesem Artikel vor! ~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.
Inhaltsverzeichnis
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: <asm> 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! </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 zum Beispiel den Vendor-ID-String, also den Herstellernamen, auszulesen, ruft man CPUID mit der Funktionsnummer 0x00000000 auf.
<asm>
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
</asm>
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 Vendor-ID in den Registern EBX, EDX und ECX(in dieser Reihenfolge) an.
Achtung!
Der String ist nicht nullterminiert!
EAX
| Bit | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Höchste, unterstützte Standard-Funktion | |||||||||||||||||||||||||||||||
EBX
| Bit | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Bytes 0 - 3 des Vendor-ID-Strings | |||||||||||||||||||||||||||||||
ECX
| Bit | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Bytes 8 - 11 des Vendor-ID-Strings | |||||||||||||||||||||||||||||||
EDX
| Bit | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Bytes 4 - 7 des Vendor ID-Strings | |||||||||||||||||||||||||||||||
Vendor-ID-Strings
| 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
| Bits | Funktion |
|---|---|
| 31 - 28 | Reserviert |
| 27 - 20 | Erweiterte Familie |
| 19 - 16 | Erweitertes Modell |
| 15 - 14 | Reserviert |
| 13 - 12 | Prozessortyp |
| 11 - 8 | Familienkennzeichen / Familiencode |
| 7 - 4 | Model |
| 4 - 0 | Stepping |
EBX
| Bits | Funktion |
|---|---|
| 31 - 24 | APIC ID |
| 23 - 16 | Count |
| 15 - 8 | Chunks |
| 7 - 0 | Brand ID |
- APIC ID ist nur gültig wenn das APIC-Flag gesetzt ist.
- Count ist die Anzahl der logischen Prozessoren und ist nur mit gesetztem 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 CFLUSH-Flag.
ECX
Dieses Register gibt erweiterte Informationen über den Prozessor:
| 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.
| Bit | Funktion |
|---|---|
| 31 - 30 | 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 | 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 | 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 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)