CPU-ID - CPUID

In der x86- Architektur ist der CPUID- Befehl (identifiziert durch einen CPUID Opcode ) ein Prozessor-Zusatzbefehl (sein Name leitet sich von CPU IDentification ab), der es Software ermöglicht, Details des Prozessors zu entdecken. Es wurde 1993 von Intel mit der Einführung der Pentium- und SL-enhanced 486- Prozessoren eingeführt.

Anhand der kann ein Programm den CPUIDProzessortyp ermitteln und feststellen, ob Features wie MMX / SSE implementiert sind.

Geschichte

Bevor der CPUIDBefehl allgemein verfügbar war , schrieben Programmierer esoterischen Maschinencode, der geringfügige Unterschiede im CPU-Verhalten ausnutzte, um die Prozessormarke und das Modell zu bestimmen. Mit der Einführung des 80386-Prozessors zeigte EDX beim Zurücksetzen die Revision an, aber diese war nur nach dem Zurücksetzen lesbar und es gab keine Standardmethode für Anwendungen, den Wert zu lesen.

Außerhalb der x86-Familie müssen Entwickler meist immer noch esoterische Prozesse (mit Instruktions-Timing oder CPU-Fehler-Triggern) verwenden, um die vorhandenen Variationen im CPU-Design zu bestimmen.

In der Motorola 680x0-Familie – die nie einen CPUID-Befehl hatte – erforderten bestimmte spezifische Befehle erhöhte Privilegien. Diese könnten verwendet werden, um verschiedene Mitglieder der CPU-Familie zu unterscheiden. Im Motorola 68010 wurde der Befehl MOVE von SR privilegiert. Diese bemerkenswerte Änderung des Befehls (und der Zustandsmaschine) ermöglichte es dem 68010, die Virtualisierungsanforderungen von Popek und Goldberg zu erfüllen . Da der 68000 einen unprivilegierten MOVE von SR bot, konnten die 2 verschiedenen CPUs durch einen ausgelösten CPU-Fehlerzustand unterschieden werden.

Während der CPUIDBefehl spezifisch für die x86-Architektur ist, stellen andere Architekturen (wie ARM) oft On-Chip-Register bereit, die auf vorgeschriebene Weise gelesen werden können, um die gleichen Arten von Informationen zu erhalten, die durch den x86-CPUID-Befehl bereitgestellt werden.

Aufruf der CPUID

Der CPUIDOpcode ist 0Fh, A2h(als zwei Bytes oder A20Fhals einzelnes word).

In Assembler benötigt der CPUIDBefehl keine Parameter, da CPUIDimplizit das EAX-Register verwendet wird, um die Hauptkategorie der zurückgegebenen Informationen zu bestimmen. In der neueren Terminologie von Intel wird dies als CPUID-Blatt bezeichnet. CPUIDsollte zuerst mit aufgerufen werden EAX = 0, da dies im EAX-Register den höchsten EAX-Aufrufparameter (Blatt) speichert, den die CPU implementiert.

Um erweiterte Funktionsinformationen zu erhalten, CPUIDsollte das höchstwertige Bit von EAX gesetzt werden. Um den höchsten Parameter für den Aufruf der erweiterten Funktion zu bestimmen, rufen Sie CPUIDmit auf EAX = 80000000h.

CPUID-Blätter größer als 3, aber weniger als 80000000 sind nur zugänglich, wenn die modellspezifischen Register IA32_MISC_ENABLE.BOOT_NT4 [Bit 22] = 0 haben (was standardmäßig so ist). Wie der Name vermuten lässt, starteten Windows NT 4.0 bis SP6 nicht richtig, es sei denn, dieses Bit wurde gesetzt, aber spätere Versionen von Windows benötigen es nicht, so dass davon ausgegangen werden kann, dass Basic Blätter größer als 4 auf aktuellen Windows-Systemen sichtbar sind. Ab Juli 2014 gelten grundsätzlich gültige Urlaube bis 14 Uhr, aber die von einigen Urlauben zurückgegebenen Informationen werden nicht in öffentlich zugänglichen Dokumenten veröffentlicht, dh sie sind "reserviert".

Einige der kürzlich hinzugefügten Blätter haben auch Unterblätter, die über das ECX-Register ausgewählt werden, bevor CPUID aufgerufen wird.

EAX =0: Höchster Funktionsparameter und Hersteller-ID

Dies gibt die Hersteller-ID-Zeichenfolge der CPU zurück – eine zwölfstellige ASCII- Zeichenfolge, die in EBX, EDX, ECX (in dieser Reihenfolge) gespeichert ist. Der höchste grundlegende Aufrufparameter (der größte Wert, auf den EAX vor dem Aufrufen gesetzt werden kann CPUID) wird in EAX zurückgegeben.

Hier ist eine Liste der Prozessoren und der höchsten implementierten Funktion.

Höchster Funktionsparameter
Prozessoren Basic Erweitert
Früher Intel 486 CPUID nicht implementiert
Später Intel 486 und Pentium 0x01 Nicht implementiert
Pentium Pro , Pentium II und Celeron 0x02 Nicht implementiert
Pentium III 0x03 Nicht implementiert
Pentium 4 0x02 0x8000 0004
Xeon 0x02 0x8000 0004
Pentium M 0x02 0x8000 0004
Pentium 4 mit Hyper-Threading 0x05 0x8000 0008
Pentium D (8xx) 0x05 0x8000 0008
Pentium D (9xx) 0x06 0x8000 0008
Kernduo 0x0A 0x8000 0008
Core 2 Duo 0x0A 0x8000 0008
Xeon 3000 , 5100, 5200, 5300, 5400 ( 5000er Serie ) 0x0A 0x8000 0008
Core 2 Duo 8000-Serie 0x0D 0x8000 0008
Xeon 5200, 5400-Serie 0x0A 0x8000 0008
Atom 0x0A 0x8000 0008
Nehalem- basierte Prozessoren 0x0B 0x8000 0008
Ivy Bridge- basierte Prozessoren 0x0D 0x8000 0008
Skylake- basierte Prozessoren (Proc Base & Max Freq; Bus Ref. Freq) 0x16 0x8000 0008
Hauptblatt der System-On-Chip- Herstellerattributenumeration 0x17 0x8000 0008

Die folgenden sind bekannte Prozessorhersteller-ID-Strings:

Die folgenden ID-Strings werden von Open-Source- Soft-CPU-Kernen verwendet :

  • "MiSTer AO486" – ao486-CPU
  • "GenuineIntel" – v586-Kern (dies ist identisch mit dem Intel ID-String)

Die folgenden sind bekannte ID-Strings von virtuellen Maschinen:

Bei einem GenuineIntel-Prozessor sind die in EBX zurückgegebenen Werte beispielsweise 0x756e6547, EDX ist 0x49656e69 und ECX ist 0x6c65746e. Der folgende Code ist in GNU Assembler für die x86-64- Architektur geschrieben und zeigt den Hersteller-ID-String sowie den höchsten Aufrufparameter an, den die CPU implementiert.

	.data

s0:	.asciz	"CPUID: %x\n"
s1:	.asciz	"Largest basic function number implemented: %i\n"
s2:	.asciz	"Vendor ID: %.12s\n"

	.text

	.align	32
	.globl	main

main:
	pushq	%rbp
	movq	%rsp,%rbp
	subq	$16,%rsp

	movl	$1,%eax
	cpuid

	movq	$s0,%rdi
	movl	%eax,%esi
	xorl	%eax,%eax
	call	printf

	pushq	%rbx  // -fPIC

	xorl	%eax,%eax
	cpuid

	movl	%ebx,0(%rsp)
	movl	%edx,4(%rsp)
	movl	%ecx,8(%rsp)

	popq	%rbx  // -fPIC

	movq	$s1,%rdi
	movl	%eax,%esi
	xorl	%eax,%eax
	call	printf

	movq	$s2,%rdi
	movq	%rsp,%rsi
	xorl	%eax,%eax
	call	printf

	movq	%rbp,%rsp
	popq	%rbp
//	ret
	movl	$1,%eax
	int	$0x80

EAX=1: Prozessorinfo und Feature-Bits

Dies gibt die Schritt- , Modell- und Familieninformationen der CPU im Register EAX (auch als CPU- Signatur bezeichnet ), Merkmalsflags in den Registern EDX und ECX und zusätzliche Merkmalsinformationen im Register EBX zurück.

Informationen zur Prozessorversion
EAX
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 fünfzehn 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Reserviert Erweiterte Familien-ID Erweiterte Modell-ID Reserviert Prozessortyp Familien-ID Modell Schritt-ID
  • Stepping ID ist eine Produktrevisionsnummer, die aufgrund von behobenen Errata oder anderen Änderungen zugewiesen wurde .
  • Das eigentliche Prozessormodell wird aus den Feldern Modell, Erweiterte Modell-ID und Familien-ID abgeleitet. Wenn das Familien-ID-Feld entweder 6 oder 15 ist, ist das Modell gleich der Summe aus dem um 4 Bit nach links verschobenen erweiterten Modell-ID-Feld und dem Modell-Feld. Andernfalls entspricht das Modell dem Wert des Felds Modell.
  • Die eigentliche Prozessorfamilie wird aus den Feldern Family ID und Extended Family ID abgeleitet. Wenn das Feld Familien-ID gleich 15 ist, entspricht die Familie der Summe der Felder der erweiterten Familien-ID und der Familien-ID. Andernfalls entspricht die Familie dem Wert des Felds Familien-ID.
  • Die Bedeutung des Felds Prozessortyp wird in der folgenden Tabelle angegeben.
Prozessortyp
Typ Kodierung in Binär
Erstausrüster ( OEM ) Prozessor 00
Intel Overdrive-Prozessor 01
Dual-Prozessor (gilt nicht für Intel486-Prozessoren) 10
Reservierter Wert 11
Weitere Informationen
Bits EBX Gültig
7:0 Markenindex
15:8 CLFLUSH-Zeilengröße (Wert . 8 = Cache-Zeilengröße in Bytes) wenn das CLFLUSH-Feature-Flag gesetzt ist.

CPUID.01.EDX.CLFSH [Bit 19]= 1

23:16 Maximale Anzahl adressierbarer IDs für logische Prozessoren in diesem physischen Paket;

Die nächste ganze Zahl mit einer Potenz von 2, die nicht kleiner als dieser Wert ist, ist die Anzahl der eindeutigen anfänglichen APIC-IDs, die für die Adressierung verschiedener logischer Prozessoren in einem physischen Paket reserviert sind.

Frühere Verwendung: Anzahl logischer Prozessoren pro physischem Prozessor; zwei für den Pentium 4-Prozessor mit Hyper-Threading-Technologie.

wenn das Hyper-Threading- Feature-Flag gesetzt ist.

CPUID.01.EDX.HTT [Bit 28]= 1

31:24 Lokale APIC-ID: Die anfängliche APIC-ID wird verwendet, um den ausführenden logischen Prozessor zu identifizieren.

Es kann auch über das cpuid 0BH-Blatt ( CPUID.0Bh.EDX[x2APIC-ID] ) identifiziert werden.

Pentium 4 und nachfolgende Prozessoren.

Die Prozessorinformationen und Feature-Flags sind herstellerspezifisch, aber normalerweise werden die Intel-Werte aus Kompatibilitätsgründen von anderen Herstellern verwendet.

Funktionsinformationen
Bit EDX ECX
Kurz Besonderheit Kurz Besonderheit
0 fpu Onboard- x87- FPU sse3 Prescott neue Anweisungen -SSE3 (PNI)
1 vme Erweiterungen des virtuellen 8086-Modus (wie VIF, VIP, PIV) pclmulqdq PCLMULQDQ
2 de Debugging-Erweiterungen ( CR4 Bit 3) dtes64 64-Bit-Debugspeicher (edx-Bit 21)
3 pse Seitengrößenerweiterung Monitor MONITOR- und MWAIT-Anweisungen ( SSE3 )
4 tsc Zeitstempelzähler ds-cpl CPL-qualifizierter Debug-Speicher
5 Frau Modellspezifische Register vmx Erweiterungen für virtuelle Maschinen
6 pae Physische Adresserweiterung smx Safer-Mode-Erweiterungen ( LaGrande )
7 mce Ausnahme bei Maschinenprüfung Europäische Sommerzeit Verbesserter SpeedStep
8 cx8 Anweisung CMPXCHG8 ( Vergleichen und Vertauschen ) tm2 Wärmemonitor 2
9 apic Onboard Advanced Programmable Interrupt Controller ssse3 Ergänzende SSE3- Anweisungen
10 (reserviert) cnxt-id L1-Kontext-ID
11 sep SYSENTER- und SYSEXIT-Anweisungen sdbg Silicon Debug-Schnittstelle
12 mtrr Bereichsregister für Speichertypen fma Fused Multiply-Add (FMA3)
13 Seite Seite Global Enable-Bit in CR4 cx16 CMPXCHG16B-Anweisung
14 mca Architektur der Maschinenprüfung xtpr Kann das Senden von Nachrichten zur Aufgabenpriorität deaktivieren
fünfzehn cmov Bedingte Zug- und FCMOV- Anweisungen pdcm Perfmon- und Debug-Fähigkeit
16 klopfen Seitenattributtabelle (reserviert)
17 pse-36 36-Bit-Seitengrößenerweiterung pcid Kontextkennungen verarbeiten ( CR4 Bit 17)
18 psn Seriennummer des Prozessors dca Direkter Cache-Zugriff für DMA-Schreibvorgänge
19 clfsh CLFLUSH-Anweisung ( SSE2 ) sse4.1 SSE4.1- Anweisungen
20 (reserviert) sse4.2 SSE4.2- Anweisungen
21 ds Debug Store: Trace der ausgeführten Sprünge speichern x2apic x2APIC
22 akpi Onboard-Thermosteuerungs-MSRs für ACPI movbe MOVBE-Anweisung ( Big-Endian )
23 mmx MMX- Anleitung popcnt POPCNT- Anweisung
24 fxsr FXSAVE, FXRESTOR-Befehle, CR4 Bit 9 tsc-Deadline APIC implementiert One-Shot-Operation mit einem TSC-Deadline-Wert
25 ss SSE- Anweisungen (auch bekannt als Katmai New Instructions) aes AES-Befehlssatz
26 ss2 SSE2- Anweisungen xspeichern XSAVE, XRESTOR, XSETBV, XGETBV
27 ss CPU-Cache implementiert Self- Snoop osxsave XSAVE aktiviert durch OS
28 htt Hyper-Threading avx Erweiterte Vektorerweiterungen
29 tm Temperaturwächter begrenzt automatisch die Temperatur f16c F16C ( halbe Genauigkeit ) FP-Funktion
30 ia64 IA64- Prozessor, der x86 emuliert rdrnd RDRAND (On-Chip-Zufallszahlengenerator)-Funktion
31 pbe Ausstehende Break Enable (PBE#-Pin) Wakeup-Fähigkeit Hypervisor Hypervisor vorhanden (bei physischen CPUs immer null)

Reservierte Felder sollten maskiert werden, bevor sie zur Prozessoridentifikation verwendet werden.

EAX=2: Cache- und TLB-Deskriptor-Informationen

Dies gibt eine Liste von Deskriptoren zurück, die Cache- und TLB- Fähigkeiten in EAX-, EBX-, ECX- und EDX-Registern angeben .

EAX=3: Seriennummer des Prozessors

Dies gibt die Seriennummer des Prozessors zurück. Die Prozessor-Seriennummer wurde bei Intel Pentium III eingeführt , aber aus Datenschutzgründen ist diese Funktion bei späteren Modellen nicht mehr implementiert (das PSN-Feature-Bit wird immer gelöscht). Auch die Efficeon- und Crusoe-Prozessoren von Transmeta bieten diese Funktion. AMD-CPUs implementieren diese Funktion jedoch in keinem CPU-Modell.

Bei Intel Pentium III-CPUs wird die Seriennummer in den EDX:ECX-Registern zurückgegeben. Bei Transmeta Efficeon-CPUs wird es in den EBX:EAX-Registern zurückgegeben. Und für Transmeta Crusoe-CPUs wird es nur im EBX-Register zurückgegeben.

Beachten Sie, dass die Prozessor-Seriennummernfunktion in den BIOS- Einstellungen aktiviert sein muss, um zu funktionieren.

EAX=4 und EAX=Bh: Intel Thread/Core und Cache-Topologie

Diese beiden Blätter werden für die Prozessortopologie (Thread, Core, Package) und die Cache-Hierarchie-Aufzählung in Intel Multi-Core (und Hyperthreaded) Prozessoren verwendet. Ab 2013 verwendet AMD diese Blätter nicht mehr, sondern hat alternative Möglichkeiten, die Kernaufzählung durchzuführen.

Im Gegensatz zu den meisten anderen CPUID-Blättern gibt Blatt Bh unterschiedliche Werte in EDX zurück, je nachdem, auf welchem ​​logischen Prozessor der CPUID-Befehl ausgeführt wird; der in EDX zurückgegebene Wert ist tatsächlich die x2APIC- ID des logischen Prozessors. Der x2APIC-ID-Bereich wird jedoch nicht kontinuierlich logischen Prozessoren zugeordnet; die Zuordnung kann Lücken aufweisen, was bedeutet, dass einige zwischengeschaltete x2APIC-IDs nicht unbedingt einem logischen Prozessor entsprechen. Zusätzliche Informationen zum Zuordnen der x2APIC-IDs zu Kernen werden in den anderen Registern bereitgestellt. Obwohl das Blatt Bh Unterblätter hat (die von ECX wie weiter unten beschrieben ausgewählt werden), wird der in EDX zurückgegebene Wert nur von dem logischen Prozessor beeinflusst, auf dem der Befehl ausgeführt wird, aber nicht von dem Unterblatt.

Die Topologie des Prozessors bzw. der Prozessoren, die von Blatt Bh offengelegt wird, ist hierarchisch, jedoch mit dem seltsamen Vorbehalt, dass die Reihenfolge der (logischen) Ebenen in dieser Hierarchie nicht unbedingt der Reihenfolge in der physischen Hierarchie ( SMT /Kern/Paket) entspricht. Jede logische Ebene kann jedoch als ECX-Unterblatt (des Bh-Blattes) auf ihre Entsprechung zu einem "Ebenentyp" abgefragt werden, der entweder SMT, Kern oder "ungültig" sein kann. Der Level-ID-Raum beginnt bei 0 und ist fortlaufend, was bedeutet, dass bei einer ungültigen Level-ID auch alle höheren Level-IDs ungültig sind. Der Ebenentyp wird in den Bits 15:08 von ECX zurückgegeben, während die Anzahl der logischen Prozessoren auf der abgefragten Ebene in EBX zurückgegeben wird. Schließlich wird die Verbindung zwischen diesen Ebenen und x2APIC-IDs in EAX[4:0] als die Anzahl von Bits zurückgegeben, um die die x2APIC-ID verschoben werden muss, um eine eindeutige ID auf der nächsten Ebene zu erhalten.

Ein Hyperthreading- fähiger Dual-Core- Westmere- Prozessor (also insgesamt zwei Kerne und vier Threads) könnte beispielsweise die x2APIC-IDs 0, 1, 4 und 5 für seine vier logischen Prozessoren haben. Leaf Bh (=EAX), Subleaf 0 (=ECX) von CPUID könnte beispielsweise 100h in ECX zurückgeben, was bedeutet, dass Level 0 die SMT-Schicht (Hyperthreading) beschreibt, und 2 in EBX zurückgeben, da es zwei logische Prozessoren (SMT-Einheiten) gibt. pro physischem Kern. Der in EAX für dieses 0-Unterblatt zurückgegebene Wert sollte in diesem Fall 1 sein, da das Verschieben der oben genannten x2APIC-IDs um ein Bit nach rechts eine eindeutige Kernnummer (auf der nächsten Ebene der Level-ID-Hierarchie) ergibt und die SMT-ID löscht Bit in jeden Kern. Eine einfachere Möglichkeit, diese Informationen zu interpretieren, besteht darin, dass das letzte Bit (Bitnummer 0) der x2APIC-ID in unserem Beispiel die SMT/Hyperthreading-Einheit in jedem Kern identifiziert. Das Vorrücken zu Unterblatt 1 (durch einen weiteren Aufruf von CPUID mit EAX=Bh und ECX=1) könnte beispielsweise 201h in ECX zurückgeben, was bedeutet, dass dies eine Core-Typ-Ebene ist, und 4 in EBX, da es 4 logische Prozessoren in der . gibt Paket; Der zurückgegebene EAX kann ein beliebiger Wert größer als 3 sein, da Bit Nummer 2 verwendet wird, um den Kern in der x2APIC-ID zu identifizieren. Beachten Sie, dass Bit Nummer 1 der x2APIC-ID in diesem Beispiel nicht verwendet wird. EAX, das auf dieser Ebene zurückgegeben wird, könnte jedoch durchaus 4 sein (und das ist bei einem Clarkdale Core i3 5x0) der Fall, da dies auch eine eindeutige ID auf Paketebene (=0 offensichtlich) ergibt, wenn die x2APIC-ID um 4 Bit verschoben wird. Schließlich fragen Sie sich vielleicht, was uns das EAX=4-Blatt sagen kann, was wir noch nicht herausgefunden haben. In EAX[31:26] gibt es die APIC-Maskenbits zurück, die für ein Paket reserviert sind ; das wäre in unserem Beispiel 111b, weil die Bits 0 bis 2 zum Identifizieren logischer Prozessoren innerhalb dieses Pakets verwendet werden, aber auch Bit 1 reserviert ist, obwohl es nicht als Teil des Identifizierungsschemas logischer Prozessoren verwendet wird. Mit anderen Worten, die APIC-IDs 0 bis 7 sind für das Paket reserviert, obwohl die Hälfte dieser Werte keinem logischen Prozessor zugeordnet ist.

Die Cache-Hierarchie des Prozessors wird durch Betrachten der Unterblätter von Blatt 4 untersucht. Die APIC-IDs werden auch in dieser Hierarchie verwendet, um Informationen darüber zu übermitteln, wie die verschiedenen Cache-Ebenen von den SMT-Einheiten und Kernen geteilt werden. Um unser Beispiel fortzusetzen, wird der L2-Cache, der von SMT-Einheiten desselben Kerns, aber nicht zwischen physischen Kernen auf dem Westmere geteilt wird, dadurch angezeigt, dass EAX[26:14] auf 1 gesetzt ist, während die Information, dass der L3-Cache geteilt wird durch das gesamte Paket wird angezeigt, indem diese Bits auf (mindestens) 111b gesetzt werden. Die Cache-Details, einschließlich Cache-Typ, Größe und Assoziativität, werden über die anderen Register auf Blatt 4 kommuniziert.

Beachten Sie, dass ältere Versionen der Intel App Note 485 einige irreführende Informationen enthalten, insbesondere in Bezug auf das Identifizieren und Zählen von Kernen in einem Mehrkernprozessor; Fehler aufgrund einer Fehlinterpretation dieser Informationen wurden sogar in den Microsoft-Beispielcode für die Verwendung von cpuid aufgenommen, sogar für die 2013-Edition von Visual Studio, und auch in die sandpile.org-Seite für CPUID, aber das Intel-Codebeispiel zum Identifizieren der Prozessortopologie hat die richtige Interpretation, und das aktuelle Intel Software Developer's Manual hat eine klarere Sprache. Der (Open Source) plattformübergreifende Produktionscode von Wildfire Games implementiert auch die korrekte Interpretation der Intel-Dokumentation.

Beispiele für die Topologieerkennung mit älteren Intel-Prozessoren (vor 2010), denen x2APIC fehlt (also das EAX=Bh-Blatt nicht implementieren), werden in einer Intel-Präsentation von 2010 vorgestellt. Beachten Sie, dass die Verwendung dieser älteren Erkennungsmethode auf 2010 und neueren Intel-Prozessoren die Anzahl der Kerne und logischen Prozessoren überschätzen kann, da die alte Erkennungsmethode davon ausgeht, dass es keine Lücken im APIC-ID-Bereich gibt, und diese Annahme wird von einigen neueren Prozessoren verletzt (beginnend mit der Core i3 5x0-Serie), aber auch diese neueren Prozessoren verfügen über einen x2APIC, sodass ihre Topologie mit der EAX=Bh-Leaf-Methode korrekt bestimmt werden kann.

EAX=6: Wärme- und Energiemanagement

Dies gibt Feature-Flags in EAX-, EBX-, ECX-Registern zurück.

EAX
Bit(s) Besonderheit
0 Digitaler Thermosensor (DTS)
1 Intel Turbo-Boost- Technologie-Funktion
2 Always Running APIC Timer (ARAT)-Funktion
3 (reserviert)
4 Power Limit Notification (PLN)-Funktion
5 Extended Clock Modulation Duty (ECMD)-Fähigkeit
6 Package Thermal Management (PTM)-Funktion
31:7 (reserviert)
EBX
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Anzahl der Interrupt-Schwellenwerte (reserviert)
ECX
Bit(s) Besonderheit
0 Feedback-Funktion zur Hardware-Koordination
1 ACNT2-Fähigkeit
2 (reserviert)
3 Leistungs-Energie-Bias-Fähigkeit
31:4 (reserviert)

EAX=7, ECX=0: Erweiterte Funktionen

Dies gibt erweiterte Feature-Flags in EBX, ECX und EDX zurück. Gibt den maximalen ECX-Wert für EAX=7 in EAX zurück.

EAX=7 CPUID-Feature-Bits
Bit EBX ECX EDX
Kurz Besonderheit Kurz Besonderheit Kurz Besonderheit
0 fsgsbase Zugriff auf die Basis von %fs und %gs prefetchwt1 PREFETCHWT1-Anweisung (reserviert)
1 IA32_TSC_ADJUST avx512_vbmi AVX-512 Vektorbit-Manipulationsanweisungen (reserviert)
2 sgx Software Guard-Erweiterungen umip Anweisungsverhinderung im Benutzermodus avx512_4vnniw AVX-512 4-Register Neural Network Anleitung
3 bmi1 Befehlssatz zur Bitmanipulation 1 pku Speicherschutzschlüssel für Benutzermodusseiten avx512_4fmaps AVX-512 4-Register Multiplizieren Akkumulation Einfache Genauigkeit
4 hle Elision der TSX- Hardwaresperre ospke Vom Betriebssystem aktivierte PKU fsrm Schnell Kurz REP MOVSB
5 avx2 Erweiterte Vektorerweiterungen 2 wartepkg Zeitgesteuerte Pause und Überwachung/Warte auf Benutzerebene (reserviert)
6 FDP_EXCPTN_ONLY avx512_vbmi2 AVX-512 Vektorbit-Manipulationsanweisungen 2
7 smep Ausführungsverhinderung im Supervisor-Modus cet_ss Shadow-Stack für Kontrollflusserzwingung (CET)
8 bmi2 Befehlssatz zur Bitmanipulation 2 gfni Galois Field-Anweisungen avx512_vp2intersect AVX-512 VP2INTERSECT Doppelwort- und Quadwort-Anweisungen
9 Versöhnung Verbesserte REP MOVSB/STOSB vaes Vektor- AES-Befehlssatz (VEX-256/EVEX) SRBDS_CTRL Abschwächung von Sonderregisterpuffer-Datenstichproben
10 invpcid INVPCID-Anweisung vpclmulqdq CLMUL-Befehlssatz (VEX-256/EVEX) md_clear VERW-Befehl löscht CPU-Puffer
11 rtm TSX eingeschränkter Transaktionsspeicher avx512_vnni AVX-512 Vektor-Neuralnetzwerk-Anleitung (reserviert)
12 pqm Überwachung der Plattformqualität des Dienstes avx512_bitalg AVX-512 BITALG-Anweisungen
13 FPU CS und FPU DS veraltet (reserviert) tsx_force_abort
14 mpx Intel MPX (Speicherschutz-Erweiterungen) avx512_vpopcntdq AVX-512 Vector Population Count Double und Quad-Word SERIALISIEREN Befehlsausführung serialisieren
fünfzehn pqe Durchsetzung der Dienstgüte auf der Plattform (reserviert) Hybrid Mischung von CPU-Typen in der Prozessortopologie
16 avx512_f AVX-512 Foundation 5-stufiges Paging TSXLDTRK TSX unterbricht die Ladeadressenverfolgung
17 avx512_dq AVX-512 Doppelwort- und Quadwort-Anweisungen mawau Der Wert von Userspace MPX Address-Width Adjust, der von den BNDLDX- und BNDSTX Intel MPX- Befehlen im 64-Bit-Modus verwendet wird (reserviert)
18 rdseed RDSEED- Anweisung pconfig Plattformkonfiguration (Anleitung für Speicherverschlüsselungstechnologien)
19 adx Intel ADX (Multi-Precision Add-Carry Instruction Extensions) lbr Architekturdatensätze der letzten Zweigniederlassung
20 smap Zugriffsverhinderung im Supervisor-Modus cet_ibt Control Flow Enforcement (CET) indirektes Branch-Tracking
21 avx512_ifma AVX-512 Integer Fused Multiply-Add-Anweisungen (reserviert)
22 pcommit PCOMMIT-Anweisung rdpid Prozessor-ID und IA32_TSC_AUX lesen amx-bf16 Kachelberechnung auf bfloat16-Zahlen
23 clflushopt CLFLUSHOPT-Anweisung (reserviert) AVX512_FP16 AVX512-FP16 Gleitkommabefehle mit halber Genauigkeit
24 clwb CLWB-Anweisung (reserviert) amx-Fliese Fliesenarchitektur
25 intel_pt Intel Prozessor-Trace cldemote Herabstufung der Cache-Zeile amx-int8 Kachelberechnung auf 8-Bit-Ganzzahlen
26 avx512_pf AVX-512 Prefetch-Anweisungen (reserviert) IBRS_IBPB / spec_ctrl Spekulationssteuerung, Teil von Indirect Branch Control (IBC):
Indirect Branch Restricted Spekulation (IBRS) und
Indirect Branch Prediction Barrier (IBPB)
27 avx512_er AVX-512 Exponentielle und Reziproke Anweisungen MOVDIRI stibp  Single Thread Indirect Branch Predictor, Teil von IBC
28 avx512_cd AVX-512 Konflikterkennungsanweisungen MOVDIR64B L1D_FLUSH IA32_FLUSH_CMD MSR
29 sha Intel SHA-Erweiterungen ENQCMD Enqueue-Stores IA32_ARCH_CAPABILITIES Spekulative Abschwächung von Nebenkanälen
30 avx512_bw AVX-512 Byte- und Wort-Anweisungen sgx_lc SGX-Startkonfiguration IA32_CORE_CAPABILITIES Unterstützung für eine MSR-Auflistung modellspezifischer Kernfunktionen
31 avx512_vl AVX-512 Vektorlängenverlängerungen pk Schutzschlüssel für Seiten im Supervisor-Modus ssbd Spekulative Ladenumgehung deaktivieren , als Abschwächung für die spekulative Ladenumgehung (IA32_SPEC_CTRL)

EAX=7, ECX=1: Erweiterte Funktionen

Dies gibt erweiterte Feature-Flags in EAX zurück.

EAX=7 CPUID-Feature-Bits
Bit EAX
Kurz Besonderheit
0 (reserviert)
1 (reserviert)
2 (reserviert)
3 (reserviert)
4 (reserviert)
5 avx512_bf16 AVX-512 BFLOAT16 Anleitung
6 (reserviert)
7 (reserviert)
8 (reserviert)
9 (reserviert)
10 (reserviert)
11 (reserviert)
12 (reserviert)
13 (reserviert)
14 (reserviert)
fünfzehn (reserviert)
16 (reserviert)
17 (reserviert)
18 (reserviert)
19 (reserviert)
20 (reserviert)
21 (reserviert)
22 (reserviert)
23 (reserviert)
24 (reserviert)
25 (reserviert)
26 (reserviert)
27 (reserviert)
28 (reserviert)
29 (reserviert)
30 (reserviert)
31 (reserviert)

EAX=80000000h: Holen Sie sich die höchste implementierte erweiterte Funktion

Der höchste aufrufende Parameter wird in EAX zurückgegeben.

EAX=80000001h: Erweiterte Prozessorinformationen und Funktionsbits

Dies gibt erweiterte Feature-Flags in EDX und ECX zurück.

AMD-Feature-Flags sind wie folgt:

EAX=80000001h CPUID-Feature-Bits
Bit EDX ECX
Kurz Besonderheit Kurz Besonderheit
0 fpu Onboard- x87- FPU lahf_lm LAHF/SAHF im langen Modus
1 vme Erweiterungen des virtuellen Modus (VIF) cmp_legacy Hyperthreading nicht gültig
2 de Debugging-Erweiterungen ( CR4 Bit 3) svm Sichere virtuelle Maschine
3 pse Seitengrößenerweiterung extapic Erweiterter APIC- Raum
4 tsc Zeitstempelzähler cr8_legacy CR8 im 32-Bit-Modus
5 Frau Modellspezifische Register abm Erweiterte Bit-Manipulation ( lzcnt und popcnt )
6 pae Physische Adresserweiterung sse4a SSE4a
7 mce Ausnahme bei Maschinenprüfung Fehlausrichtung Falsch ausgerichteter SSE- Modus
8 cx8 Anweisung CMPXCHG8 ( Vergleichen und Vertauschen ) 3dnowprefetch PREFETCH- und PREFETCHW-Anweisungen
9 apic Onboard Advanced Programmable Interrupt Controller osvw OS sichtbare Problemumgehung
10 (reserviert) RDS Instruktionsbasiertes Sampling
11 Systemaufruf SYSCALL- und SYSRET-Anweisungen xop XOP-Befehlssatz
12 mtrr Bereichsregister für Speichertypen Häute es SKINIT/STGI-Anweisungen
13 Seite Seite Global Enable-Bit in CR4 wdt Watchdog-Timer
14 mca Architektur der Maschinenprüfung (reserviert)
fünfzehn cmov Bedingte Zug- und FCMOV- Anweisungen lwp Leichte Profilerstellung
16 klopfen Seitenattributtabelle fma4 4 Operanden verschmolzen multiplizieren-addieren
17 pse36 36-Bit-Seitengrößenerweiterung tce Übersetzungs-Cache-Erweiterung
18 (reserviert)
19 mp Multi - Prozessor - fähig nodeid_msr NodeID MSR
20 nx NX-Bit (reserviert)
21 (reserviert) tbm Manipulation des nachfolgenden Bits
22 mmxext Erweitertes MMX topoext Topologieerweiterungen
23 mmx MMX- Anleitung perfctr_core Erweiterungen des Leistungsindikators Core
24 fxsr FXSAVE-, FXRSTOR-Befehle, CR4 Bit 9 perfctr_nb NB Leistungszähler-Erweiterungen
25 fxsr_opt FXSAVE/FXRSTOR-Optimierungen (reserviert)
26 pdpe1gb Gigabyte- Seiten dbx Datenhaltepunkterweiterungen
27 rdtscp RDTSCP-Anweisung perftsc Leistung TSC
28 (reserviert) pcx_l2i L2I Leistungszähler-Erweiterungen
29 lm Langer Modus (reserviert)
30 3dnowext Erweitertes 3DNow! (reserviert)
31 3dnow 3DNJetzt! (reserviert)

EAX=80000002h,80000003h,800000004h: Prozessormarke String

Diese geben die Prozessormarkenzeichenfolge in EAX, EBX, ECX und EDX zurück. CPUIDmuss mit jedem Parameter nacheinander ausgegeben werden, um die gesamte 48-Byte-Null-terminierte ASCII-Prozessormarkenzeichenfolge zu erhalten. Es ist zu prüfen , ob die Funktion in der CPU vorhanden ist , durch die Ausgabe CPUIDmit EAX = 80000000hersten und prüfen , ob der zurückgegebene Wert größer oder gleich 80000004h ist.

#include <cpuid.h>  // GCC-provided
#include <stdio.h>
#include <stdint.h>

int main(void) {
    uint32_t brand[12];

    if (!__get_cpuid_max(0x80000004, NULL)) {
        fprintf(stderr, "Feature not implemented.");
        return 2;
    }

    __get_cpuid(0x80000002, brand+0x0, brand+0x1, brand+0x2, brand+0x3);
    __get_cpuid(0x80000003, brand+0x4, brand+0x5, brand+0x6, brand+0x7);
    __get_cpuid(0x80000004, brand+0x8, brand+0x9, brand+0xa, brand+0xb);
    printf("Brand: %s\n", brand);
}

EAX=80000005h: L1-Cache- und TLB-Kennungen

Diese Funktion enthält die L1-Cache- und TLB-Eigenschaften des Prozessors.

EAX=80000006h: Erweiterte L2-Cache-Funktionen

Gibt Details des L2-Cache in ECX zurück, einschließlich der Zeilengröße in Bytes (Bits 07 - 00), der Art der Assoziativität (kodiert durch ein 4-Bit-Feld; Bits 15 - 12) und der Cache-Größe in KB (Bits 31 - 16) .

#include <cpuid.h>  // GCC-provided
#include <stdio.h>
#include <stdint.h>

int main(void) {
    uint32_t eax, ebx, ecx, edx;
    if (__get_cpuid(0x80000006, &eax, &ebx, &ecx, &edx)) {
        printf("Line size: %d B, Assoc. Type: %d; Cache Size: %d KB.\n", ecx & 0xff, (ecx >> 12) & 0x07, (ecx >> 16) & 0xffff);
        return 0;
    } else {
        fputs(stderr, "CPU does not support 0x80000006");
        return 2;
    }
}

EAX=80000007h: Informationen zur erweiterten Energieverwaltung

Diese Funktion bietet erweiterte Kennungen der Energieverwaltungsfunktionen. EDX-Bit 8 zeigt die Unterstützung für invariante TSC an.

EAX=80000008h: Virtuelle und physische Adressgrößen

Gibt die größten virtuellen und physischen Adressgrößen in EAX zurück.

  • Bits 07-00: #Physische Adressbits.
  • Bits 15-8: #Lineare Adressbits.
  • Bits 31-16: Reserviert = 0.

Es könnte vom Hypervisor in einem virtuellen Maschinensystem verwendet werden, um die mit der virtuellen CPU möglichen physischen/virtuellen Adressgrößen zu melden.

EBX wird für Funktionen verwendet:

  • Bit 0: CLZERO, Cache-Zeile mit Adresse in RAX löschen.
  • Bit 4: RDPRU, MPERF oder APERF von Ring 3 lesen.
  • Bit 8: MCOMMIT, Speichere in den Speicher übertragen. Für Memory Fencing und Abrufen von ECC-Fehlern.
  • Bit 9: WBNOINVD, Zurückschreiben und Cache nicht ungültig machen.

ECX bietet Kernanzahl.

  • Bits 07-00: #Physische Kerne minus eins.
  • Bits 11-8: Reserviert = 0.
  • Bits 15-12: #APIC-ID-Bits. 2 auf diese Potenz erhöht wäre die physische Kernzahl, solange sie nicht Null ist.
  • Bits 17-16: Leistungszeitstempelzählergröße.
  • Bits 31-18: Reserviert = 0.

EDX stellt in 31-16 spezifische Informationen für RDPRU (die maximal zulässige Registerkennung) bereit. Die aktuelle Nummer ab Zen 2 ist 1 für MPERF und APERF.

EAX=8FFFFFFFh: AMD-Osterei

Spezifisch für AMD K7- und K8-CPUs gibt dies die Zeichenfolge "IT'S HAMMER TIME" in EAX, EBX, ECX und EDX zurück, eine Referenz auf den MC-Hammer- Song U Can't Touch This .

CPUID-Nutzung von Hochsprachen

Inline-Montage

Diese Informationen sind auch in anderen Sprachen leicht zugänglich. Der folgende C-Code für gcc gibt beispielsweise die ersten fünf Werte aus, die von der CPU zurückgegeben werden:

#include <stdio.h>

/* This works on 32 and 64-bit systems. See [[Inline assembler#In actual compilers]] for hints on reading this code. */
int main()
{
  /* The four registers do not need to be initialized as the processor will write over it. */
  int infotype, a, b, c, d;

  for (infotype = 0; infotype < 5; infotype ++)
  {
    __asm__("cpuid"
            : "=a" (a), "=b" (b), "=c" (c), "=d" (d)   // The output variables. EAX -> a and vice versa.
            : "0" (infotype));                         // Put the infotype into EAX.
    printf ("InfoType %x\nEAX: %x\nEBX: %x\nECX: %x\nEDX: %x\n", infotype, a, b, c, d);
  }

  return 0;
}

In MSVC- und Borland/Embarcadero C-Compilern (bcc32) mit Inline-Assembly sind die Clobbering-Informationen implizit in den Anweisungen enthalten:

#include <stdio.h>
int main()
{
  unsigned int InfoType = 0;
  unsigned int a, b, c, d;
  __asm {
    /* Do the call. */
    mov EAX, InfoType;
    cpuid;
    /* Save results. */
    mov a, EAX;
    mov b, EBX;
    mov c, ECX;
    mov d, EDX;
  }
  printf ("InfoType %x\nEAX: %x\nEBX: %x\nECX: %x\nEDX: %x\n", InfoType, a, b, c, d);
  return 0;
}

Wenn eine der Versionen in einfacher Assemblersprache geschrieben wurde, muss der Programmierer die Ergebnisse von EAX, EBX, ECX und EDX manuell speichern, wenn er die Werte weiterhin verwenden möchte.

Wrapper-Funktionen

GCC bietet auch einen Header, der <cpuid.h>auf Systemen mit CPUID aufgerufen wird. Das __cpuidist ein Makro, das auf Inline-Assembly erweitert wird. Typische Verwendung wäre:

#include <cpuid.h>
#include <stdio.h>

int
main (void)
{
  int a, b, c, d;
  __cpuid (0 /* vendor string */, a, b, c, d);
  printf ("EAX: %x\nEBX: %x\nECX: %x\nEDX: %x\n", a, b, c, d);
  return 0;
}

Wenn man jedoch eine erweiterte Funktion anforderte, die auf dieser CPU nicht vorhanden ist, würden sie es nicht bemerken und könnten zufällige, unerwartete Ergebnisse erhalten. Eine sicherere Version wird auch in bereitgestellt <cpuid.h>. Es prüft auf erweiterte Funktionen und führt einige weitere Sicherheitsüberprüfungen durch. Die Ausgabewerte werden nicht über referenzähnliche Makroparameter übergeben, sondern über konventionellere Zeiger.

#include <cpuid.h>
#include <stdio.h>

int
main (void)
{
  int a, b, c, d;
  if (!__get_cpuid (0x81234567 /* nonexistent, but assume it exists */, &a, &b, &c, &d))
    {
      fprintf (stderr, "Warning: CPUID request 0x81234567 not valid!\n");
    }
  printf("EAX: %x\nEBX: %x\nECX: %x\nEDX: %x\n", a, b, c, d);
  return 0;
}

Beachten Sie die kaufmännischen Und-Zeichen in &a, &b, &c, &dund die Bedingung. Wenn der __get_cpuidAufruf eine korrekte Anforderung erhält, wird ein Wert ungleich Null zurückgegeben, wenn er fehlschlägt, Null.

Der Microsoft Visual C-Compiler verfügt über eine integrierte Funktion, __cpuid()sodass die cpuid-Anweisung ohne Inline-Assembly eingebettet werden kann, was praktisch ist, da die x86-64-Version von MSVC Inline-Assembly überhaupt nicht zulässt. Das gleiche Programm für MSVC wäre:

#include <iostream>
#include <intrin.h>

int main()
{
  int cpuInfo[4];

  for (int a = 0; a < 4; a++)
  {
    __cpuid(cpuInfo, a);
    std::cout << "The code " << a << " gives " << cpuInfo[0] << ", " << cpuInfo[1] << ", " << cpuInfo[2] << ", " << cpuInfo[3] << '\n';
  }

  return 0;
}

Viele interpretierte oder kompilierte Skriptsprachen können CPUID über eine FFI- Bibliothek verwenden. Eine solche Implementierung zeigt die Verwendung des Ruby-FFI-Moduls, um eine Assemblersprache auszuführen, die den CPUID-Opcode enthält.

CPU-spezifische Informationen außerhalb von x86

Einige der Nicht-x86-CPU-Architekturen bieten auch bestimmte Formen strukturierter Informationen über die Fähigkeiten des Prozessors, üblicherweise als Satz spezieller Register:

  • ARM-Architekturen verfügen über ein CPUIDCoprozessorregister, das für den Zugriff EL1 oder höher erfordert.
  • Die IBM System z- Mainframe-Prozessoren verfügen seit dem IBM 4381 von 1983 über einen Store CPU ID ( STIDP) -Befehl zum Abfragen der Prozessor-ID.
  • Die IBM System z- Mainframe-Prozessoren verfügen außerdem über eine Anweisung Store Facilities List Extended ( STFLE), die die installierten Hardwarefunktionen auflistet.
  • Die MIPS32/64- Architektur definiert eine obligatorische Prozessoridentifikation ( PrId) und eine Reihe von verketteten Konfigurationsregistern .
  • Der PowerPC- Prozessor verfügt über das schreibgeschützte 32-Bit- Prozessorversionsregister ( PVR), das das verwendete Prozessormodell identifiziert. Die Anweisung erfordert eine Supervisor-Zugriffsebene.

DSP- und transputerartige Chipfamilien haben die Anweisung in keiner merklichen Weise aufgegriffen, obwohl sie (relativ gesehen) so viele Variationen im Design haben. Es könnten alternative Wege der Siliziumidentifikation vorhanden sein; DSPs von Texas Instruments enthalten beispielsweise einen speicherbasierten Registersatz für jede Funktionseinheit, der mit Identifikatoren beginnt, die den Einheitentyp und das Modell, ihre ASIC- Designrevision und die in der Designphase ausgewählten Funktionen bestimmen , und sich mit einheitenspezifischen Steuerungen und Daten fortsetzt registriert. Der Zugriff auf diese Bereiche wird durchgeführt, indem einfach die vorhandenen Lade- und Speicherbefehle verwendet werden; somit besteht für solche Geräte keine Notwendigkeit, den Registersatz für Geräteidentifikationszwecke zu erweitern.

Siehe auch

Verweise

Weiterlesen

Externe Links