CPUID - CPUID
В архитектуре x86 инструкция CPUID (идентифицируемая кодом CPUID
операции ) является дополнительной инструкцией процессора (ее имя происходит от CPU IDentification), позволяя программному обеспечению обнаруживать детали процессора. Он был представлен Intel в 1993 году с выпуском процессоров 486 с улучшенными процессорами Pentium и SL .
Программа может использовать CPUID
для определения типа процессора и того, реализованы ли такие функции, как MMX / SSE .
История
До того, как CPUID
инструкция стала общедоступной , программисты должны были написать эзотерический машинный код, который использовал бы незначительные различия в поведении ЦП, чтобы определить марку и модель процессора. С появлением процессора 80386 EDX при сбросе указывал версию, но это было доступно для чтения только после сброса, и не было стандартного способа для приложений считывать значение.
Вне семейства x86 от разработчиков по-прежнему требуется использовать эзотерические процессы (включая синхронизацию инструкций или триггеры сбоя ЦП) для определения имеющихся вариаций в конструкции ЦП.
В семействе Motorola 680x0, в котором никогда не было инструкций CPUID, для определенных инструкций требовались повышенные привилегии. Их можно использовать для различения различных членов семейства ЦП. В Motorola 68010 инструкция MOVE от SR стала привилегированной. Это примечательное изменение инструкций (и конечного автомата) позволило 68010 удовлетворить требования виртуализации Попека и Голдберга . Поскольку 68000 предлагал непривилегированный MOVE от SR, два разных процессора можно было отличить друг от друга по срабатыванию состояния ошибки процессора.
Хотя CPUID
инструкция специфична для архитектуры x86, другие архитектуры (например, ARM) часто предоставляют встроенные регистры, которые могут быть прочитаны заданными способами для получения той же информации, которую предоставляет инструкция x86 CPUID.
Вызов CPUID
Код CPUID
операции 0Fh, A2h
(как два байта или A20Fh
как один word
).
В языке ассемблера , то CPUID
команда не принимает никаких параметров , как CPUID
неявно использует регистр EAX , чтобы определить основную категорию информации , возвращаемой. В более поздней терминологии Intel это называется листом CPUID. CPUID
должен быть вызван EAX = 0
первым, так как это сохранит в регистре EAX самый высокий параметр вызова EAX (лист), который реализует ЦП.
Для получения информации о расширенных функциях CPUID
следует вызывать с установленным старшим битом EAX. Чтобы определить наивысший параметр вызова расширенной функции, вызовите CPUID
с помощью EAX = 80000000h
.
Листы CPUID больше 3, но меньше 80000000 доступны только тогда, когда регистры , зависящие от модели, имеют IA32_MISC_ENABLE.BOOT_NT4 [бит 22] = 0 (что так по умолчанию). Как следует из названия, Windows NT 4.0 до SP6 не загружалась должным образом, если этот бит не был установлен, но более поздние версии Windows не нуждаются в нем, поэтому основные листья больше 4 можно считать видимыми в текущих системах Windows. По состоянию на июль 2014 года основные действительные отпуска продолжаются до 14 часов, но информация, возвращаемая некоторыми листами, не раскрывается в общедоступной документации, т. Е. Они «зарезервированы».
Некоторые из недавно добавленных листьев также имеют подчиненные листья, которые выбираются через регистр ECX перед вызовом CPUID.
EAX = 0: наивысший функциональный параметр и идентификатор производителя
Это возвращает строку идентификатора производителя процессора - двенадцатисимвольную строку ASCII, хранящуюся в EBX, EDX, ECX (в указанном порядке). Самый высокий базовый параметр вызова (наибольшее значение, которое может быть установлено в EAX перед вызовом CPUID
) возвращается в EAX.
Вот список процессоров и самая высокая реализованная функция.
Процессоров | Базовый | Расширенный |
---|---|---|
Ранее Intel 486 | CPUID не реализован | |
Позже Intel 486 и Pentium | 0x01 | Не реализована |
Pentium Pro , Pentium II и Celeron | 0x02 | Не реализована |
Pentium III | 0x03 | Не реализована |
Pentium 4 | 0x02 | 0x8000 0004 |
Xeon | 0x02 | 0x8000 0004 |
Pentium M | 0x02 | 0x8000 0004 |
Pentium 4 с Hyper-Threading | 0x05 | 0x8000 0008 |
Pentium D (8xx) | 0x05 | 0x8000 0008 |
Pentium D (9xx) | 0x06 | 0x8000 0008 |
Core Duo | 0x0A | 0x8000 0008 |
Core 2 Duo | 0x0A | 0x8000 0008 |
Xeon 3000 , 5100, 5200, 5300, 5400 ( серия 5000 ) | 0x0A | 0x8000 0008 |
Core 2 Duo 8000 серии | 0x0D | 0x8000 0008 |
Xeon 5200, 5400 серии | 0x0A | 0x8000 0008 |
Атом | 0x0A | 0x8000 0008 |
Процессоры на базе Nehalem | 0x0B | 0x8000 0008 |
Процессоры на базе Ivy Bridge | 0x0D | 0x8000 0008 |
Процессоры на базе Skylake (базовая частота и макс. Частота шины) | 0x16 | 0x8000 0008 |
Главная страница перечисления атрибутов поставщика системы на кристалле | 0x17 | 0x8000 0008 |
Ниже приведены известные строки идентификатора производителя процессора:
-
"AMDisbetter!"
- раннее инженерные образцы AMD K5 процессор -
"AuthenticAMD"
- AMD -
"CentaurHauls"
- IDT WinChip / Centaur (включая некоторый процессор VIA) -
"CyrixInstead"
- Cyrix / ранние STMicroelectronics и IBM -
"GenuineIntel"
- Intel -
"TransmetaCPU"
- Трансмета -
"GenuineTMx86"
- Трансмета -
"Geode by NSC"
- National Semiconductor -
"NexGenDriven"
- NexGen -
"RiseRiseRise"
- Подъем -
"SiS SiS SiS "
- SiS -
"UMC UMC UMC "
- UMC -
"VIA VIA VIA "
- ЧЕРЕЗ -
"Vortex86 SoC"
- DM&P Vortex -
" Shanghai "
- Чжаосинь -
"HygonGenuine"
- Хигон -
"E2K MACHINE"
- МЦСТ Эльбрус
Следующие строки идентификаторов используются программными ядрами ЦП с открытым исходным кодом :
-
"MiSTer AO486"
- процессор ao486 -
"GenuineIntel"
- ядро v586 (идентично строке Intel ID)
Ниже приведены известные строки идентификаторов виртуальных машин:
-
"bhyve bhyve "
- бхиве -
" KVMKVMKVM "
- KVM -
"TCGTCGTCGTCG"
- QEMU -
"Microsoft Hv"
- Microsoft Hyper-V или Windows Virtual PC -
" lrpepyh vr"
- Параллели (возможно, это должно быть «prl hyperv», но оно закодировано как «lrpepyh vr» из-за несовпадения порядка байтов ) -
"VMwareVMware"
- VMware -
"XenVMMXenVMM"
- Xen HVM -
"ACRNACRNACRN"
- Проект ACRN -
" QNXQVMBSQG "
- Гипервизор QNX -
"GenuineIntel"
- Яблочная розетка 2
Например, для процессора GenuineIntel значения, возвращаемые в EBX, равны 0x756e6547, EDX - 0x49656e69, а ECX - 0x6c65746e. Следующий код написан на GNU Assembler для архитектуры x86-64 и отображает строку идентификатора поставщика, а также самый высокий параметр вызова, который реализует ЦП.
.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: информация о процессоре и биты функций
Это возвращает информацию о степпинге , модели и семействе ЦП в регистре EAX (также называемом сигнатурой ЦП), флаги функций в регистрах EDX и ECX и дополнительную информацию о функциях в регистре EBX.
EAX | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
Зарезервированный | Расширенный семейный идентификатор | Расширенный идентификатор модели | Зарезервированный | Тип процессора | Семейный ID | Модель | Идентификатор шага |
- Идентификатор шага - это номер версии продукта, присвоенный из-за исправленных ошибок или других изменений.
- Фактическая модель процессора определяется полями Модель, Расширенный идентификатор модели и Идентификатор семейства. Если поле идентификатора семейства равно 6 или 15, модель равна сумме поля расширенного идентификатора модели, сдвинутого влево на 4 бита, и поля модели. В противном случае модель равна значению поля Модель.
- Фактическое семейство процессоров выводится из полей «Идентификатор семейства» и «Идентификатор расширенного семейства». Если поле «Идентификатор семьи» равно 15, семейство равно сумме полей «Идентификатор расширенной семьи» и «Идентификатор семьи». В противном случае семейство равно значению поля Family ID.
- Значение поля «Тип процессора» приведено в таблице ниже.
Тип | Кодирование в двоичном формате |
---|---|
Производитель оригинального оборудования ( OEM ) Процессор | 00 |
Процессор Intel Overdrive | 01 |
Двойной процессор (не применимо к процессорам Intel486) | 10 |
Зарезервированная стоимость | 11 |
Биты | EBX | Действительный |
---|---|---|
7: 0 | Индекс бренда | |
15: 8 | Размер строки CLFLUSH (значение. 8 = размер строки кэша в байтах) | если установлен флаг функции CLFLUSH.
CPUID.01.EDX.CLFSH [бит 19] = 1 |
23:16 | Максимальное количество адресуемых идентификаторов для логических процессоров в этом физическом пакете;
Ближайшее целое число степени 2, которое не меньше этого значения, представляет собой количество уникальных начальных идентификаторов APIC, зарезервированных для адресации различных логических процессоров в физическом пакете. Прежнее использование: количество логических процессоров на физический процессор; два для процессора Pentium 4 с технологией Hyper-Threading. |
если установлен флаг функции Hyper-threading .
CPUID.01.EDX.HTT [бит 28] = 1 |
31:24 | Локальный APIC ID: начальный APIC-ID используется для идентификации исполняющего логического процессора.
Его также можно определить по листу cpuid 0BH (CPUID.0Bh.EDX [x2APIC-ID]). |
Pentium 4 и последующие процессоры. |
Информация о процессоре и флаги функций зависят от производителя, но обычно значения Intel используются другими производителями для совместимости.
Немного | EDX | ECX | ||
---|---|---|---|---|
короткий | Характерная черта | короткий | Характерная черта | |
0 | fpu | Встроенный x87 FPU | sse3 | Новые инструкции Prescott -SSE3 (PNI) |
1 | vme | Расширения виртуального режима 8086 (такие как VIF, VIP, PIV) | pclmulqdq | PCLMULQDQ |
2 | де | Отладочные расширения ( CR4 бит 3) | dtes64 | 64-битное хранилище отладки (edx бит 21) |
3 | псевдоним | Расширение размера страницы | монитор | Инструкции MONITOR и MWAIT ( SSE3 ) |
4 | tsc | Счетчик отметок времени | ds-cpl | Отладочное хранилище с квалификацией CPL |
5 | MSR | Регистры для конкретных моделей | vmx | Расширения виртуальной машины |
6 | паэ | Расширение физического адреса | smx | Расширения безопасного режима ( LaGrande ) |
7 | mce | Исключение проверки машины | стандартное восточное время | Улучшенный SpeedStep |
8 | cx8 | Инструкция CMPXCHG8 ( сравнение и замена ) | тм2 | Тепловой монитор 2 |
9 | апикальный | Встроенный расширенный программируемый контроллер прерываний | ssse3 | Дополнительные инструкции SSE3 |
10 | (зарезервированный) | cnxt-id | L1 Context ID | |
11 | сен | Инструкции SYSENTER и SYSEXIT | sdbg | Интерфейс Silicon Debug |
12 | mtrr | Тип памяти Регистры диапазона | фма | Плавное умножение-сложение (FMA3) |
13 | pge | Бит глобальной активации страницы в CR4 | cx16 | Инструкция CMPXCHG16B |
14 | mca | Архитектура машинной проверки | xtpr | Можно отключить отправку сообщений о приоритетах задач |
15 | cmov | Условный ход и инструкции FCMOV | pdcm | Perfmon и возможность отладки |
16 | погладить | Таблица атрибутов страницы | (зарезервированный) | |
17 | pse-36 | 36-битное расширение размера страницы | pcid | Идентификаторы контекста процесса ( CR4 бит 17) |
18 | psn | Серийный номер процессора | dca | Прямой доступ к кешу для записи DMA |
19 | clfsh | Инструкция CLFLUSH ( SSE2 ) | sse4.1 | SSE4.1 инструкции |
20 | (зарезервированный) | sse4.2 | SSE4.2 инструкции | |
21 год | ds | Магазин отладки: сохранить трассировку выполненных переходов | x2apic | x2APIC |
22 | acpi | Бортовые терморегуляторы MSR для ACPI | мовбе | Инструкция MOVBE (с прямым порядком байтов ) |
23 | ммх | Инструкции MMX | popcnt | Инструкция POPCNT |
24 | FXSR | FXSAVE, инструкции FXRESTOR, CR4 бит 9 | tsc-крайний срок | APIC реализует однократную операцию с использованием значения крайнего срока TSC. |
25 | sse | Инструкции SSE (также известные как Новые инструкции Katmai) | AES | Набор инструкций AES |
26 год | sse2 | Инструкции SSE2 | xsave | XSAVE, XRESTOR, XSETBV, XGETBV |
27 | SS | Кэш процессора реализует самопроверку | osxsave | XSAVE включен ОС |
28 год | htt | Гиперпоточность | avx | Расширенные векторные расширения |
29 | тм | Термомонитор автоматически ограничивает температуру | f16c | Функция FP F16C ( половинная точность ) |
30 | ia64 | Процессор IA64 , эмулирующий x86 | rdrnd | Функция RDRAND (встроенный генератор случайных чисел) |
31 год | pbe | Возможность пробуждения Pending Break Enable (PBE # pin) | гипервизор | Наличие гипервизора (всегда ноль на физических процессорах) |
Зарезервированные поля должны быть замаскированы перед их использованием для идентификации процессора.
EAX = 2: информация о кэше и дескрипторе TLB
Это возвращает список дескрипторов, указывающих возможности кеширования и TLB в регистрах EAX, EBX, ECX и EDX.
EAX = 3: серийный номер процессора
Это возвращает серийный номер процессора. Серийный номер процессора был введен в Intel Pentium III , но из соображений конфиденциальности эта функция больше не реализована в более поздних моделях (бит функции PSN всегда сброшен). Процессоры Transmeta Efficeon и Crusoe также предоставляют эту функцию. Однако процессоры AMD не поддерживают эту функцию ни в каких моделях процессоров.
Для процессоров Intel Pentium III серийный номер возвращается в регистрах EDX: ECX. Для процессоров Transmeta Efficeon он возвращается в регистрах EBX: EAX. А для процессоров Transmeta Crusoe он возвращается только в регистре EBX.
Обратите внимание, что для работы функция серийного номера процессора должна быть включена в настройках BIOS .
EAX = 4 и EAX = Bh: поток / ядро Intel и топология кэша
Эти два листа используются для топологии процессора (поток, ядро, пакет) и перечисления иерархии кеша в многоядерных (и гиперпоточных) процессорах Intel. По состоянию на 2013 год AMD не использует эти листья, но имеет альтернативные способы выполнения перечисления ядер.
В отличие от большинства других листьев CPUID, лист Bh будет возвращать разные значения в EDX в зависимости от того, на каком логическом процессоре выполняется инструкция CPUID; значение, возвращаемое в EDX, на самом деле является идентификатором x2APIC логического процессора. Однако пространство идентификаторов x2APIC не отображается постоянно на логические процессоры; в отображении могут быть пробелы, что означает, что некоторые промежуточные идентификаторы x2APIC не обязательно соответствуют какому-либо логическому процессору. Дополнительная информация для сопоставления идентификаторов x2APIC с ядрами предоставляется в других регистрах. Хотя лист Bh имеет подчиненные листы (выбранные ECX, как описано ниже), на значение, возвращаемое в EDX, влияет только логический процессор, на котором выполняется инструкция, но не подчиненный лист.
Топология процессора (ов), представленная листом Bh, является иерархической, но со странной оговоркой, что порядок (логических) уровней в этой иерархии не обязательно соответствует порядку в физической иерархии ( SMT / ядро / пакет). Однако каждый логический уровень может быть запрошен как подуровень ECX (листа Bh) на предмет его соответствия «типу уровня», который может быть либо SMT, либо основным, либо «недействительным». Пространство идентификаторов уровня начинается с 0 и является непрерывным, что означает, что если идентификатор уровня недопустим, все идентификаторы более высокого уровня также будут недопустимыми. Тип уровня возвращается в битах 15:08 ECX, а количество логических процессоров на запрошенном уровне возвращается в EBX. Наконец, связь между этими уровнями и идентификаторами x2APIC возвращается в EAX [4: 0] как количество битов, на которое должен быть сдвинут идентификатор x2APIC, чтобы получить уникальный идентификатор на следующем уровне.
Например, двухъядерный процессор Westmere , способный к гиперпоточности (таким образом, имея два ядра и четыре потока в общей сложности), может иметь x2APIC идентификаторы 0, 1, 4 и 5 для своих четырех логических процессоров. Leaf Bh (= EAX), subbleaf 0 (= ECX) CPUID может, например, возвращать 100h в ECX, что означает, что уровень 0 описывает уровень SMT (гиперпоточность) и возвращает 2 в EBX, потому что есть два логических процессора (блоки SMT) на физическое ядро. В этом случае значение, возвращаемое в EAX для этого 0-подуровня, должно быть равно 1, потому что сдвиг вышеупомянутых идентификаторов x2APIC вправо на один бит дает уникальный номер ядра (на следующем уровне иерархии идентификаторов уровней) и стирает идентификатор SMT. бит внутри каждого ядра. Более простой способ интерпретировать эту информацию состоит в том, что последний бит (бит номер 0) идентификатора x2APIC идентифицирует модуль SMT / гиперпоточности внутри каждого ядра в нашем примере. Переход к subbleaf 1 (путем выполнения другого вызова CPUID с EAX = Bh и ECX = 1) может, например, вернуть 201h в ECX, что означает, что это уровень типа ядра, и 4 в EBX, потому что в нем 4 логических процессора упаковка; Возвращаемый EAX может быть любым значением больше 3, потому что так случается, что бит номер 2 используется для идентификации ядра в идентификаторе x2APIC. Обратите внимание, что бит номер 1 идентификатора x2APIC не используется в этом примере. Однако EAX, возвращаемый на этом уровне, вполне может быть равен 4 (и это так на Clarkdale Core i3 5x0), потому что это также дает уникальный идентификатор на уровне пакета (= 0, очевидно) при смещении идентификатора x2APIC на 4 бита. Наконец, вы можете задаться вопросом, что может сказать нам лист EAX = 4, чего мы еще не выяснили. В EAX [31:26] он возвращает биты маски APIC, зарезервированные для пакета; в нашем примере это будет 111b, потому что биты от 0 до 2 используются для идентификации логических процессоров внутри этого пакета, но бит 1 также зарезервирован, хотя и не используется как часть схемы идентификации логического процессора. Другими словами, идентификаторы APIC от 0 до 7 зарезервированы для пакета, даже если половина этих значений не отображается на логический процессор.
Иерархия кэша процессора исследуется путем рассмотрения подчиненных листов листа 4. Идентификаторы APIC также используются в этой иерархии для передачи информации о том, как различные уровни кэша совместно используются модулями и ядрами SMT. Чтобы продолжить наш пример, кэш L2, который совместно используется модулями SMT одного и того же ядра, но не между физическими ядрами на Westmere, обозначается EAX [26:14], установленным в 1, в то время как информация о том, что кэш L3 является совместно используемым для всего пакета указывается установкой этих битов в (как минимум) 111b. Детали кеша, включая тип, размер и ассоциативность кеша, передаются через другие регистры на листе 4.
Помните, что более старые версии заметки о приложении Intel 485 содержат некоторую вводящую в заблуждение информацию, особенно в отношении идентификации и подсчета ядер в многоядерном процессоре; ошибки из-за неправильной интерпретации этой информации были даже включены в образец кода Microsoft для использования cpuid, даже для выпуска Visual Studio 2013 года, а также на странице sandpile.org для CPUID, но образец кода Intel для определения топологии процессора имеет правильный интерпретация, а текущее Руководство разработчика программного обеспечения Intel имеет более четкий язык. Кросс-платформенный производственный код (с открытым исходным кодом) от Wildfire Games также реализует правильную интерпретацию документации Intel.
Примеры обнаружения топологии с участием более старых (до 2010 г.) процессоров Intel, в которых отсутствует x2APIC (таким образом, не реализуется лист EAX = Bh), приведены в презентации Intel 2010 г. Помните, что использование этого старого метода обнаружения на процессорах Intel 2010 года и более новых может привести к завышению количества ядер и логических процессоров, поскольку старый метод обнаружения предполагает отсутствие пропусков в пространстве идентификаторов APIC, и это предположение нарушается некоторыми новыми процессорами (начиная с серии Core i3 5x0), но эти новые процессоры также поставляются с x2APIC, поэтому их топологию можно правильно определить с помощью листового метода EAX = Bh.
EAX = 6: Управление температурой и питанием
Это возвращает флаги функций в регистрах EAX, EBX, ECX.
Бит (ы) | Характерная черта |
---|---|
0 | Возможность цифрового термодатчика (DTS) |
1 | Возможности технологии Intel Turbo Boost |
2 | Возможность постоянного запуска таймера APIC (ARAT) |
3 | (зарезервированный) |
4 | Возможность уведомления об ограничении мощности (PLN) |
5 | Возможность расширенного режима тактовой модуляции (ECMD) |
6 | Возможность управления температурным режимом (PTM) |
31: 7 | (зарезервированный) |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 год | 22 | 23 | 24 | 25 | 26 год | 27 | 28 год | 29 | 30 | 31 год |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Количество пороговых значений прерывания | (зарезервированный) |
Бит (ы) | Характерная черта |
---|---|
0 | Аппаратная координационная обратная связь |
1 | Возможность ACNT2 |
2 | (зарезервированный) |
3 | Возможность смещения производительности и энергии |
31: 4 | (зарезервированный) |
EAX = 7, ECX = 0: расширенные функции
Это возвращает флаги расширенных функций в EBX, ECX и EDX. Возвращает максимальное значение ECX для EAX = 7 в EAX.
Немного | EBX | ECX | EDX | |||
---|---|---|---|---|---|---|
короткий | Характерная черта | короткий | Характерная черта | короткий | Характерная черта | |
0 | fsgsbase | Доступ к базе% fs и% gs | prefetchwt1 | Инструкция PREFETCHWT1 | (зарезервированный) | |
1 | IA32_TSC_ADJUST | avx512_vbmi | Инструкции по обработке векторных битов AVX-512 | (зарезервированный) | ||
2 | sgx | Расширения Software Guard | умип | Предотвращение инструкций в пользовательском режиме | avx512_4vnniw | AVX-512 4-регистровые инструкции нейронной сети |
3 | bmi1 | Набор инструкций по обработке битов 1 | пку | Ключи защиты памяти для страниц пользовательского режима | avx512_4fmaps | AVX-512 4-регистровое умножение с накоплением одинарной точности |
4 | hle | Аппаратный замок TSX Elision | оспке | ФКУ с поддержкой ОС | fsrm | Быстрый короткий REP MOVSB |
5 | avx2 | Расширенные векторные расширения 2 | waitpkg | Временная пауза и мониторинг / ожидание на уровне пользователя | (зарезервированный) | |
6 | FDP_EXCPTN_ONLY | avx512_vbmi2 | Инструкции по обработке векторных битов AVX-512 2 | |||
7 | смэп | Предотвращение выполнения в режиме супервизора | cet_ss | Теневой стек принудительного управления потоком (CET) | ||
8 | bmi2 | Набор команд обработки битов 2 | gfni | Инструкции Поля Галуа | avx512_vp2intersect | AVX-512 VP2INTERSECT - двойные и четырехсловные инструкции |
9 | ээээ | Улучшенный REP MOVSB / STOSB | vaes | Набор векторных команд AES (VEX-256 / EVEX) | SRBDS_CTRL | Меры по устранению проблем с выборкой данных из специального буфера регистров |
10 | invpcid | Инструкция INVPCID | vpclmulqdq | Набор команд CLMUL (VEX-256 / EVEX) | md_clear | Инструкция VERW очищает буферы ЦП |
11 | rtm | Ограниченная транзакционная память TSX | avx512_vnni | Инструкции для векторной нейронной сети AVX-512 | (зарезервированный) | |
12 | pqm | Платформа мониторинга качества обслуживания | avx512_bitalg | AVX-512 BITALG инструкции | ||
13 | FPU CS и FPU DS устарели | (зарезервированный) | tsx_force_abort | |||
14 | mpx | Intel MPX (расширения защиты памяти) | avx512_vpopcntdq | AVX-512 Счетчик векторной популяции с двойным и четверным словом | СЕРИАЛИЗАЦИЯ | Сериализовать выполнение инструкции |
15 | pqe | Обеспечение качества обслуживания платформы | (зарезервированный) | Гибридный | Смешение типов ЦП в топологии процессора | |
16 | avx512_f | Основание AVX-512 | 5-уровневая подкачка | TSXLDTRK | TSX приостановить отслеживание адреса загрузки | |
17 | avx512_dq | AVX-512 Двойные и четырехсловные инструкции | Mawau | Значение пользовательского пространства MPX Address-Width Adjust, используемое инструкциями BNDLDX и BNDSTX Intel MPX в 64-битном режиме. | (зарезервированный) | |
18 | Rdseed | Инструкция RDSEED | pconfig | Конфигурация платформы (инструкции по технологиям шифрования памяти) | ||
19 | adx | Intel ADX (Расширения инструкций для переноса с высокой точностью) | lbr | Архитектурные отчеты последней ветви | ||
20 | шлепок | Предотвращение доступа в режиме супервизора | cet_ibt | Непрямое отслеживание переходов при принудительном управлении потоком (CET) | ||
21 год | avx512_ifma | AVX-512 Инструкции умножения с целочисленным сплавом | (зарезервированный) | |||
22 | pcommit | Инструкция PCOMMIT | rdpid | Чтение идентификатора процессора и IA32_TSC_AUX | amx-bf16 | Расчет тайлов на числах bfloat16 |
23 | Clflushopt | Инструкция CLFLUSHOPT | (зарезервированный) | AVX512_FP16 | AVX512-FP16 инструкции с плавающей запятой половинной точности | |
24 | clwb | Инструкция CLWB | (зарезервированный) | amx-плитка | Архитектура плитки | |
25 | intel_pt | Процессор Intel Trace | cldemote | Понижение уровня строки кэша | amx-int8 | Вычисление мозаики на 8-битных целых числах |
26 год | avx512_pf | Инструкции по предварительной выборке AVX-512 | (зарезервированный) | IBRS_IBPB / spec_ctrl | Управление спекуляциями, часть Indirect Branch Control (IBC): Indirect Branch Restricted Speculation (IBRS) and Indirect Branch Prediction Barrier (IBPB) |
|
27 | avx512_er | AVX-512 Экспоненциальные и взаимные инструкции | МОВДИРИ | шпилька | Однопоточный предсказатель косвенного ветвления, часть IBC | |
28 год | avx512_cd | Инструкции по обнаружению конфликтов AVX-512 | MOVDIR64B | L1D_FLUSH | IA32_FLUSH_CMD MSR | |
29 | ша | Расширения Intel SHA | ENQCMD | Поставить в очередь магазины | IA32_ARCH_CAPABILITIES | Спекулятивные меры по устранению побочных каналов |
30 | avx512_bw | AVX-512 Байт и Word инструкции | sgx_lc | Конфигурация запуска SGX | IA32_CORE_CAPABILITIES | Поддержка основных возможностей конкретной модели в списке MSR |
31 год | avx512_vl | Расширения векторной длины AVX-512 | pks | Ключи защиты для страниц в режиме супервизора | ssbd | Отключение спекулятивного обхода хранилища как смягчение последствий спекулятивного обхода хранилища (IA32_SPEC_CTRL) |
EAX = 7, ECX = 1: расширенные функции
Это возвращает расширенные флаги функций в EAX.
Немного | EAX | |
---|---|---|
короткий | Характерная черта | |
0 | (зарезервированный) | |
1 | (зарезервированный) | |
2 | (зарезервированный) | |
3 | (зарезервированный) | |
4 | (зарезервированный) | |
5 | avx512_bf16 | AVX-512 BFLOAT16 инструкция |
6 | (зарезервированный) | |
7 | (зарезервированный) | |
8 | (зарезервированный) | |
9 | (зарезервированный) | |
10 | (зарезервированный) | |
11 | (зарезервированный) | |
12 | (зарезервированный) | |
13 | (зарезервированный) | |
14 | (зарезервированный) | |
15 | (зарезервированный) | |
16 | (зарезервированный) | |
17 | (зарезервированный) | |
18 | (зарезервированный) | |
19 | (зарезервированный) | |
20 | (зарезервированный) | |
21 год | (зарезервированный) | |
22 | (зарезервированный) | |
23 | (зарезервированный) | |
24 | (зарезервированный) | |
25 | (зарезервированный) | |
26 год | (зарезервированный) | |
27 | (зарезервированный) | |
28 год | (зарезервированный) | |
29 | (зарезервированный) | |
30 | (зарезервированный) | |
31 год | (зарезервированный) |
EAX = 80000000h: реализация максимальной расширенной функции
Самый высокий параметр вызова возвращается в EAX.
EAX = 80000001h: расширенная информация о процессоре и биты функций
Это возвращает расширенные флаги функций в EDX и ECX.
Флаги функций AMD следующие:
Немного | EDX | ECX | ||
---|---|---|---|---|
короткий | Характерная черта | короткий | Характерная черта | |
0 | fpu | Встроенный x87 FPU | lahf_lm | LAHF / SAHF в длинном режиме |
1 | vme | Расширения виртуального режима (VIF) | cmp_legacy | Гиперпоточность недействительна |
2 | де | Отладочные расширения ( CR4 бит 3) | SVM | Безопасная виртуальная машина |
3 | псевдоним | Расширение размера страницы | экстапический | Расширенное пространство APIC |
4 | tsc | Счетчик отметок времени | cr8_legacy | CR8 в 32-битном режиме |
5 | MSR | Регистры для конкретных моделей | abm | Расширенная обработка битов ( lzcnt и popcnt ) |
6 | паэ | Расширение физического адреса | sse4a | SSE4a |
7 | mce | Исключение проверки машины | несоответствие | Несогласованный режим SSE |
8 | cx8 | Инструкция CMPXCHG8 ( сравнение и замена ) | 3dnowprefetch | Инструкции PREFETCH и PREFETCHW |
9 | апикальный | Встроенный расширенный программируемый контроллер прерываний | osvw | Видимый обходной путь ОС |
10 | (зарезервированный) | СРК | Выборка на основе инструкций | |
11 | системный вызов | Инструкции SYSCALL и SYSRET | xop | Набор инструкций XOP |
12 | mtrr | Тип памяти Регистры диапазона | скинить | SKINIT / STGI инструкция |
13 | pge | Бит глобальной активации страницы в CR4 | wdt | Сторожевой таймер |
14 | mca | Архитектура машинной проверки | (зарезервированный) | |
15 | cmov | Условный ход и инструкции FCMOV | lwp | Легкое профилирование |
16 | погладить | Таблица атрибутов страницы | fma4 | 4 операнда, объединенные умножением-сложением |
17 | pse36 | 36-битное расширение размера страницы | tce | Расширение кэша переводов |
18 | (зарезервированный) | |||
19 | mp | Возможность мультипроцессора | nodeid_msr | NodeID MSR |
20 | nx | Бит NX | (зарезервированный) | |
21 год | (зарезервированный) | tbm | Манипуляция конечными битами | |
22 | mmxext | Расширенный MMX | топоекст | Расширения топологии |
23 | ммх | Инструкции MMX | perfctr_core | Расширения счетчика производительности ядра |
24 | FXSR | FXSAVE, инструкции FXRSTOR, CR4 бит 9 | perfctr_nb | Расширения счетчика производительности NB |
25 | fxsr_opt | Оптимизация FXSAVE / FXRSTOR | (зарезервированный) | |
26 год | pdpe1gb | Гигабайтные страницы | dbx | Расширения точек останова по данным |
27 | rdtscp | Инструкция RDTSCP | perftsc | Производительность TSC |
28 год | (зарезервированный) | pcx_l2i | Расширения счетчика перфомансов L2I | |
29 | lm | Длинный режим | (зарезервированный) | |
30 | 3dnowext | Расширенный 3DNow! | (зарезервированный) | |
31 год | 3dnow | 3DNow! | (зарезервированный) |
EAX = 80000002h, 80000003h, 80000004h: Строка бренда процессора
Они возвращают строку бренда процессора в EAX, EBX, ECX и EDX. CPUID
должен выдаваться с каждым параметром в последовательности, чтобы получить всю строку марки процессора ASCII с завершающим 48 байтовым символом в конце. Это необходимо , чтобы проверить, присутствует ли в CPU функция путем выдачи CPUID
с EAX = 80000000h
первой и проверки , если возвращаемое значение больше или равно 80000004h.
#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 и TLB
Эта функция содержит характеристики кэша L1 и TLB процессора.
EAX = 80000006h: Расширенные функции кэша L2
Возвращает подробную информацию о кэше L2 в ECX, включая размер строки в байтах (биты 07-00), тип ассоциативности (закодирован 4-битным полем; биты 15-12) и размер кеша в килобайтах (биты 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: расширенная информация об управлении питанием
Эта функция предоставляет идентификаторы расширенных функций управления питанием. Бит 8 EDX указывает на поддержку инвариантного TSC.
EAX = 80000008h: размеры виртуального и физического адреса
Возвращает наибольший размер виртуального и физического адреса в EAX.
- Биты 07-00: # Биты физического адреса.
- Биты 15-8: # Биты линейного адреса.
- Биты 31-16: зарезервировано = 0.
Он может использоваться гипервизором в системе виртуальной машины для сообщения о размерах физических / виртуальных адресов, возможных для виртуального ЦП.
EBX используется для функций :
- Бит 0: CLZERO, очистить строку кэша с адресом в RAX.
- Бит 4: RDPRU, чтение MPERF или APERF из кольца 3.
- Бит 8: MCOMMIT, фиксация сохраненных данных в памяти. Для разделения памяти и получения ошибок ECC.
- Бит 9: WBNOINVD, обратная запись и не делать кеш недействительным.
ECX показывает количество ядер.
- Биты 07-00: # Физические ядра минус один.
- Биты 11-8: зарезервировано = 0.
- Биты 15–12: биты идентификатора #APIC. 2 в этой степени будет физическим числом ядер, если оно не равно нулю.
- Биты 17-16: размер счетчика отметок времени производительности.
- Биты 31-18: зарезервировано = 0.
EDX предоставляет информацию, специфичную для RDPRU (максимально допустимый идентификатор регистра) в 31-16. Текущее число по состоянию на Zen 2 - 1 для MPERF и APERF.
EAX = 8FFFFFFFh: пасхальное яйцо AMD
Специально для процессоров AMD K7 и K8, это возвращает строку «IT'S HAMMER TIME» в EAX, EBX, ECX и EDX, ссылку на песню MC Hammer U Can't Touch This .
Использование CPUID из языков высокого уровня
Встроенная сборка
Эту информацию легко получить и на других языках. Например, приведенный ниже код C для gcc выводит первые пять значений, возвращаемых cpuid:
#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;
}
В компиляторах MSVC и Borland / Embarcadero C (bcc32) встроенная ассемблерная информация неявно указана в инструкциях:
#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;
}
Если какая-либо из версий была написана на простом ассемблере, программист должен вручную сохранить результаты EAX, EBX, ECX и EDX в другом месте, если он хочет продолжать использовать значения.
Функции оболочки
GCC также предоставляет заголовок, вызываемый <cpuid.h>
в системах с CPUID. Это __cpuid
макрос, расширяющийся до встроенной сборки. Типичное использование:
#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;
}
Но если кто-то запросит расширенную функцию, отсутствующую в этом процессоре, они не заметят и могут получить случайные, неожиданные результаты. Более безопасная версия также предоставляется в формате <cpuid.h>
. Он проверяет наличие расширенных функций и выполняет еще несколько проверок безопасности. Выходные значения передаются не с использованием параметров макроса, подобных ссылкам, а с использованием более обычных указателей.
#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;
}
Обратите внимание на амперсанды &a, &b, &c, &d
и условное выражение. Если __get_cpuid
вызов получает правильный запрос, он вернет ненулевое значение, если не удастся - ноль.
Компилятор Microsoft Visual C имеет встроенную функцию, __cpuid()
поэтому инструкция cpuid может быть встроена без использования встроенной сборки, что удобно, поскольку версия MSVC для x86-64 вообще не допускает встроенную сборку. Та же программа для MSVC будет:
#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;
}
Многие интерпретируемые или скомпилированные языки сценариев могут использовать CPUID через библиотеку FFI . Одна из таких реализаций демонстрирует использование модуля Ruby FFI для выполнения языка ассемблера, который включает код операции CPUID.
Информация о процессоре за пределами x86
Некоторые архитектуры ЦП, отличные от x86, также предоставляют определенные формы структурированной информации о возможностях процессора, обычно в виде набора специальных регистров:
-
Архитектура ARM имеет
CPUID
регистр сопроцессора, для доступа к которому требуется уровень EL1 или выше. - В Z IBM System процессоры мэйнфреймов имеют магазин CPU ID (
STIDP
инструкция) , так как в 1983 году IBM 4381 для запрашивая идентификатор процессора. - В процессорах мэйнфреймов IBM System z также есть инструкция « Сохранить список возможностей» (
STFLE
), в которой перечислены установленные аппаратные функции. - Архитектура MIPS32 / 64 определяет обязательную идентификацию процессора (
PrId
) и серию последовательно соединенных регистров конфигурации . - Процессор PowerPC имеет 32-битный регистр версии процессора (
PVR
), предназначенный только для чтения, который определяет используемую модель процессора. Инструкция требует уровня доступа супервизора.
Семейства микросхем DSP и транспьютерных микросхем практически не учитывают инструкции, несмотря на то, что имеют (в относительном выражении) множество вариаций в дизайне. Могут присутствовать альтернативные способы идентификации кремния; например, DSP от Texas Instruments содержат набор регистров на основе памяти для каждого функционального блока, который начинается с идентификаторов, определяющих тип и модель блока, его версию ASIC и функции, выбранные на этапе проектирования, и продолжается с управлением и данными для конкретного блока. регистры. Доступ к этим областям осуществляется простым использованием существующих инструкций загрузки и сохранения; таким образом, для таких устройств нет необходимости расширять набор регистров для целей идентификации устройства.
Смотрите также
-
CPU-Z , утилита Windows, которая используется
CPUID
для определения различных системных настроек. - Spectre (уязвимость безопасности)
- Спекулятивный обход хранилища (SSB)
- / proc / cpuinfo , текстовый файл, созданный некоторыми системами, содержащий некоторую информацию о CPUID.
использованная литература
дальнейшее чтение
- «Расширение косвенного управления ветвями технологии AMD64» (PDF) (Белая книга). Редакция 4.10.18. Advanced Micro Devices, Inc. (AMD). 2018. Архивировано (PDF) из оригинала 09.05.2018 . Проверено 9 мая 2018 .
внешние ссылки
- Идентификация процессора Intel и инструкция CPUID (примечание по приложению 485), последняя опубликованная версия. Утверждается, что он будет включен в Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32 в 2013 году , но по состоянию на июль 2014 года руководство по-прежнему предлагает читателю примечание 485.
- Содержит информацию , которая может быть и легко неверно истолковано , хотя, в частности , в отношении идентификации топологии процессора .
- Большие руководства Intel имеют тенденцию отставать от документа Intel ISA, доступного в верхней части этой страницы , который обновляется даже для процессоров, которые еще не являются общедоступными, и поэтому обычно содержат больше битов CPUID. Например, на момент написания книги ISA (редакция 19, датированная маем 2014 г.) бит CLFLUSHOPT задокументирован на листе 7, но большие руководства, хотя и явно более свежие (в редакции 51, датированной июнем 2014 г.), не содержат. не упоминаю об этом.
- Руководство программиста по архитектуре AMD64, том 3: Общие и системные инструкции
- cpuid.exe, инструмент командной строки с открытым исходным кодом для Windows, доступный в SysTools.zip . Пример: cpuid -v отображает значение каждого флага функции CPUID.
- instlatx64 - сборник дампов x86 / x64 Instruction Latency, Memory Latency и CPUID