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 CPUID
Prozessortyp ermitteln und feststellen, ob Features wie MMX / SSE implementiert sind.
Geschichte
Bevor der CPUID
Befehl 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 CPUID
Befehl 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 CPUID
Opcode ist 0Fh, A2h
(als zwei Bytes oder A20Fh
als einzelnes word
).
In Assembler benötigt der CPUID
Befehl keine Parameter, da CPUID
implizit 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. CPUID
sollte 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, CPUID
sollte das höchstwertige Bit von EAX gesetzt werden. Um den höchsten Parameter für den Aufruf der erweiterten Funktion zu bestimmen, rufen Sie CPUID
mit 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.
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:
-
"AMDisbetter!"
– frühe technische Muster des AMD K5- Prozessors -
"AuthenticAMD"
– AMD -
"CentaurHauls"
– IDT WinChip/ Centaur (einschließlich einiger VIA-CPU) -
"CyrixInstead"
– Cyrix /frühe STMicroelectronics und IBM -
"GenuineIntel"
– Intel -
"TransmetaCPU"
– Transmeta -
"GenuineTMx86"
– Transmeta -
"Geode by NSC"
– Nationaler Halbleiter -
"NexGenDriven"
– NexGen -
"RiseRiseRise"
– Aufstieg -
"SiS SiS SiS "
– SiS -
"UMC UMC UMC "
– UMC -
"VIA VIA VIA "
– VIA -
"Vortex86 SoC"
– DM&P- Wirbel -
" Shanghai "
– Zhaoxin -
"HygonGenuine"
– Hygon -
"E2K MACHINE"
– MCST Elbrus
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:
-
"bhyve bhyve "
– bhyve -
" KVMKVMKVM "
– KVM -
"TCGTCGTCGTCG"
– QEMU -
"Microsoft Hv"
– Microsoft Hyper-V oder Windows Virtual PC -
" lrpepyh vr"
– Parallels (es sollte möglicherweise "prl hyperv" sein, ist aber aufgrund einer Endianness- Mismatch als "lrpepyh vr" codiert ) -
"VMwareVMware"
– VMware -
"XenVMMXenVMM"
– Xen HVM -
"ACRNACRNACRN"
– Projekt ACRN -
" QNXQVMBSQG "
– QNX- Hypervisor -
"GenuineIntel"
– Apfelrosette 2
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.
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.
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 |
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.
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.
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) |
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) |
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.
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.
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:
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. CPUID
muss 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 CPUID
mit EAX = 80000000h
ersten 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 __cpuid
ist 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, &d
und die Bedingung. Wenn der __get_cpuid
Aufruf 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
CPUID
Coprozessorregister, 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
-
CPU-Z , ein Windows-Dienstprogramm, das verwendet
CPUID
, um verschiedene Systemeinstellungen zu identifizieren - Spectre (Sicherheitslücke)
- Spekulative Ladenumgehung (SSB)
- /proc/cpuinfo , eine von bestimmten Systemen generierte Textdatei, die einige der CPUID-Informationen enthält
Verweise
Weiterlesen
- "AMD64 Technology Indirect Branch Control Extension" (PDF) (Whitepaper). Überarbeitung 4.10.18. Advanced Micro Devices, Inc. (AMD). 2018. Archiviert (PDF) vom Original am 09.05.2018 . Abgerufen 2018-05-09 .
Externe Links
- Intel Processor Identification and the CPUID Instruction (Application Note 485), letzte veröffentlichte Version. Angeblich im Jahr 2013 in das Intel® 64- und IA-32-Architekturen-Software-Entwicklerhandbuch aufgenommen worden , aber ab Juli 2014 weist das Handbuch den Leser immer noch auf die Anmerkung 485 hin.
- Enthält einige Informationen, die jedoch leicht fehlinterpretiert werden können und wurden , insbesondere in Bezug auf die Identifizierung der Prozessortopologie .
- Die großen Intel-Handbücher hinken tendenziell hinter dem Intel ISA-Dokument zurück, das oben auf dieser Seite verfügbar ist , das auch für noch nicht öffentlich verfügbare Prozessoren aktualisiert wird und daher normalerweise mehr CPUID-Bits enthält. Zum Beispiel dokumentiert das ISA-Buch (in Revision 19, datiert Mai 2014) zum Zeitpunkt dieses Schreibens das CLFLUSHOPT-Bit in Blatt 7, aber die großen Handbücher, obwohl anscheinend aktueller (in Revision 51, datiert Juni 2014) erwähne es nicht.
- AMD64 Architecture Programmer's Manual, Band 3: Allzweck- und Systemanweisungen
- cpuid.exe, ein Open-Source-Befehlszeilentool für Windows, verfügbar in SysTools.zip . Beispiel: cpuid -v zeigt den Wert jedes CPUID-Feature-Flags an.
- instlatx64 - Sammlung von x86/x64 Instruction Latency, Memory Latency und CPUID Dumps