CPUID - CPUID
Эта статья должна быть обновлено.Июль 2014 г.) ( |
в x86 архитектура, CPUID инструкция (обозначена CPUID
код операции ) это дополнительная инструкция процессора (его название происходит от ЦПУ IDentification), позволяя программному обеспечению обнаруживать детали процессора. Он был представлен Intel в 1993 году с запуском Pentium и SL-улучшенный 486 процессоры.[1]
Программа может использовать CPUID
для определения типа процессора и наличия таких функций, как MMX /SSE реализованы.
История
До общедоступности CPUID
инструкции, программисты напишут эзотерические Машинный код которые использовали незначительные различия в поведении ЦП, чтобы определить марку и модель процессора.[2][3] С появлением процессора 80386 EDX при сбросе указывал версию, но это было доступно для чтения только после сброса, и у приложений не было стандартного способа считывания значения.
Вне семейства x86 от разработчиков в основном все еще требуется использовать эзотерические процессы (включая синхронизацию инструкций или триггеры сбоя ЦП) для определения имеющихся вариаций в конструкции ЦП.
В семействе Motorola 680x0, в котором никогда не было инструкций CPUID, для определенных инструкций требовались повышенные привилегии. Их можно использовать для различения различных членов семейства ЦП. в Motorola 68010 Инструкция ПЕРЕМЕЩЕНИЕ из SR стал привилегированным. Это заметное изменение инструкций (и конечного автомата) позволило 68010 соответствовать требованиям Требования к виртуализации Попека и Голдберга. Поскольку 68000 предлагал непривилегированный ПЕРЕМЕЩЕНИЕ из SR два разных ЦП можно отличить друг от друга по срабатыванию состояния ошибки ЦП.
В то время как CPUID
Инструкция специфична для архитектуры x86, другие архитектуры (например, ARM) часто предоставляют встроенные регистры, которые могут быть прочитаны предписанными способами для получения той же информации, что и инструкция x86 CPUID.
Вызов CPUID
В CPUID
код операции 0Fh, A2h (как два байта, или A20Fh как сингл слово).
В язык ассемблера, то CPUID
инструкция не принимает параметров, так как CPUID
неявно использует регистр EAX для определения основной категории возвращаемой информации. В более поздней терминологии Intel это называется листом CPUID. CPUID
следует называть с EAX = 0
во-первых, так как это будет хранить в регистре EAX самый высокий параметр вызова EAX (лист), который реализует ЦП.
Для получения информации о расширенных функциях CPUID
должен вызываться с установленным старшим битом EAX. Чтобы определить наивысший параметр вызова расширенной функции, вызовите CPUID
с EAX = 80000000ч
.
CPUID оставляет больше 3, но меньше 80000000 доступны только тогда, когда регистры для конкретных моделей иметь IA32_MISC_ENABLE.BOOT_NT4 [бит 22] = 0 (что так по умолчанию). Как следует из названия, Windows NT 4.0 пока SP6 не загрузился должным образом, если этот бит не был установлен,[4][мертвая ссылка ] но более поздние версии 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 серий | 0x0A | 0x8000 0008 |
Core 2 Duo 8000 серии | 0x0D | 0x8000 0008 |
Xeon 5200, 5400 серии | 0x0A | 0x8000 0008 |
Атом | 0x0A | 0x8000 0008 |
Процессоры на базе Nehalem | 0x0B | 0x8000 0008 |
Процессоры на базе IvyBridge | 0x0D | 0x8000 0008 |
Процессоры на базе Skylake (базовая частота и макс. Частота шины) | 0x16 | 0x8000 0008 |
Главная страница перечисления атрибутов поставщика системы на кристалле | 0x17 | 0x8000 0008 |
Ниже приведены известные строки идентификатора производителя процессора:
- "AMD лучше!" - ранние инженерные образцы AMD K5 процессор
- «Аутентичный AMD» – AMD
- "КентаврХолс" – IDT WinChip /Кентавр (Включая некоторый процессор VIA)
- "CyrixInstead" – Cyrix /рано STMicroelectronics и IBM
- "GenuineIntel" – Intel
- «ТрансметаЦП» – Transmeta
- «ПодлинныйTMx86» – Transmeta
- «Жеод НСК» – National Semiconductor
- "NexGenDriven" – NexGen
- "RiseRiseRise" – Подъем
- «SiS SiS SiS» – SiS
- «UMC UMC UMC» – UMC
- «ВИА ВИА» – ЧЕРЕЗ
- "Vortex86 SoC" - DM&P Вихрь
- «Шанхай» – Чжаосинь
- «HygonGenuine» – Hygon
- «МАШИНА Е2К» – МЦСТ Эльбрус
Ниже приведены строки идентификаторов, используемые в открытых источниках. мягкие ядра процессора:
Ниже приведены известные строки идентификаторов виртуальных машин:
- "бхиве бхиве" – бхиве
- «КВМКВМКВМ» – KVM
- "TCGTCGTCGTCG" – QEMU
- «Microsoft Hv» – Microsoft Hyper-V или же Виртуальный ПК с Windows
- "лрпепых вр" – Параллели (возможно, это должно быть «prl hyperv», но оно закодировано как «lrpepyh vr» из-за порядок байтов несоответствие)
- «VMwareVMware» – VMware
- "XenVMMXenVMM" – Xen HVM
- "ACRNACRNACRN" – Проект ACRN
- "QNXQVMBSQG" – QNX Гипервизор
- «VirtualApple» – Яблочная розетта 2
Например, для процессора GenuineIntel значения, возвращаемые в EBX, равны 0x756e6547, EDX - 0x49656e69, а ECX - 0x6c65746e. Следующий код написан на Ассемблер GNU для x86-64 архитектура и отображает строку идентификатора поставщика, а также самый высокий параметр вызова, который реализует ЦП.
.данныеs0: .asciz "CPUID:% x"s1: .asciz «Наибольший реализованный номер базовой функции:% i»s2: .asciz "ID поставщика:% .12s" .текст .выровнять 32 .globl главныйглавный: pushq % rbp movq % rsp,% rbp subq $16,% rsp движение $1,% eax cpuid movq $ s0,% rdi движение % eax,% esi xorl % eax,% eax вызов printf pushq % rbx // -fPIC xorl % eax,% eax cpuid движение % ebx,0(% rsp) движение % edx,4(% rsp) движение % ecx,8(% rsp) popq % rbx // -fPIC movq $ s1,% rdi движение % eax,% esi xorl % eax,% eax вызов printf movq $ s2,% rdi movq % rsp,% rsi xorl % eax,% eax вызов printf movq % rbp,% rsp popq % rbp// Ret движение $1,% eax int 0x80 $
EAX = 1: информация о процессоре и биты функций
Это возвращает процессор шагать, информация о модели и семействе в регистре EAX (также называемом подпись процессора), флаги функций в регистрах EDX и ECX, а также дополнительную информацию о функциях в регистре EBX.[7]
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 бита, и поля модели. В противном случае модель равна значению поля Модель.
- Фактическое семейство процессоров определяется полями Family ID и Extended Family ID. Если поле Family ID равно 15, семейство равно сумме полей Extended Family ID и Family ID. В противном случае семейство равно значению поля 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 | Максимальное количество адресуемых идентификаторов для логических процессоров в этом физическом пакете; Ближайшее целое число степени двойки, которое не меньше этого значения, представляет собой количество уникальных исходных идентификаторов APIC, зарезервированных для адресации различных логических процессоров в физическом пакете. Прежнее использование: количество логических процессоров на физический процессор; два для процессора Pentium 4 с технологией Hyper-Threading.[8] | если 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 (ПНИ) |
1 | vme | Расширения виртуального режима 8086 (например, VIF, VIP, PIV) | pclmulqdq | PCLMULQDQ |
2 | де | Отладочные расширения (CR4 бит 3) | dtes64 | 64-битное хранилище отладки (edx бит 21) |
3 | pse | Расширение размера страницы | монитор | МОНИТОР и 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[9][10] |
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 New Instructions) | AES | Набор инструкций AES |
26 | sse2 | SSE2 инструкции | xsave | XSAVE, XRESTOR, XSETBV, XGETBV |
27 | SS | Кэш процессора реализует самообслуживание.шпионить | osxsave | XSAVE включен ОС |
28 | htt | Hyper Threading | avx | Расширенные векторные расширения |
29 | тм | Термомонитор автоматически ограничивает температуру | f16c | F16C (половинная точность ) Функция FP |
30 | ia64 | IA64 процессор, эмулирующий x86 | rdrnd | RDRAND (встроенный генератор случайных чисел) |
31 | pbe | Возможность пробуждения Pending Break Enable (PBE # pin) | гипервизор | Гипервизор присутствует (всегда ноль на физических процессорах)[11][12] |
Зарезервированные поля должны быть замаскированы перед их использованием для идентификации процессора.
EAX = 2: информация о кэше и дескрипторе TLB
Это возвращает список дескрипторов, указывающих кеш и TLB возможности регистров EAX, EBX, ECX и EDX.
EAX = 3: серийный номер процессора
Это возвращает серийный номер процессора. Серийный номер процессора был представлен на Intel Pentium III, но из соображений конфиденциальности эта функция больше не реализована в более поздних моделях (бит функции PSN всегда сброшен). Transmeta's Процессоры Efficeon и Crusoe также предоставляют эту функцию. Однако процессоры AMD не поддерживают эту функцию ни в каких моделях процессоров.
Для процессоров Intel Pentium III серийный номер возвращается в регистрах EDX: ECX. Для ЦП Transmeta Efficeon он возвращается в регистрах EBX: EAX. А для процессоров Transmeta Crusoe он возвращается только в регистре EBX.
Обратите внимание, что функция серийного номера процессора должна быть включена в BIOS настройка для работы.
EAX = 4 и EAX = Bh: поток / ядро Intel и топология кэша
Эти два листа используются для топологии процессора (поток, ядро, пакет) и перечисления иерархии кэша в многоядерных (и гиперпоточных) процессорах Intel.[13] По состоянию на 2013 год[Обновить] AMD не использует эти листы, но имеет альтернативные способы выполнения перечисления ядер.[14]
В отличие от большинства других листьев CPUID, лист Bh будет возвращать разные значения в EDX в зависимости от того, на каком логическом процессоре выполняется инструкция CPUID; значение, возвращаемое в EDX, на самом деле является x2APIC id логического процессора. Однако пространство идентификаторов x2APIC не отображается постоянно на логические процессоры; в отображении могут быть пробелы, что означает, что некоторые промежуточные идентификаторы x2APIC не обязательно соответствуют какому-либо логическому процессору. Дополнительная информация для сопоставления идентификаторов x2APIC с ядрами предоставляется в других регистрах. Хотя лист Bh имеет подчиненные листы (выбираемые ECX, как описано ниже), на значение, возвращаемое в EDX, влияет только логический процессор, на котором выполняется инструкция, но не подчиненный лист.
Топология процессора (ов), представленная листом Bh, является иерархической, но со странной оговоркой, что порядок (логических) уровней в этой иерархии не обязательно соответствует порядку в физической иерархии (SMT / ядро / пакет). Однако каждый логический уровень может быть запрошен как подуровень ECX (листа Bh) на предмет его соответствия «типу уровня», который может быть SMT, основным или «недопустимым». Пространство идентификаторов уровня начинается с 0 и является непрерывным, что означает, что если идентификатор уровня недопустим, все идентификаторы более высокого уровня также будут недопустимыми. Тип уровня возвращается в битах 15:08 ECX, а количество логических процессоров на запрошенном уровне возвращается в EBX. Наконец, связь между этими уровнями и идентификаторами x2APIC возвращается в EAX [4: 0] как количество битов, на которое должен быть сдвинут идентификатор x2APIC, чтобы получить уникальный идентификатор на следующем уровне.
Например, двухъядерный Westmere процессор, способный Hyper Threading (таким образом, имея два ядра и четыре потока в сумме) может иметь 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 / Hyper-Threading внутри каждого ядра в нашем примере. Переход к 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.
Помните, что более старые версии примечания 485 к приложению Intel содержат некоторую вводящую в заблуждение информацию, особенно в отношении идентификации и подсчета ядер в многоядерном процессоре;[15] ошибки из-за неправильной интерпретации этой информации были даже включены в пример кода Microsoft для использования cpuid, даже для выпуска Visual Studio 2013,[16] а также на странице sandpile.org для CPUID,[17] но образец кода Intel для определения топологии процессора[13] имеет правильную интерпретацию, а текущее Руководство Intel для разработчиков программного обеспечения имеет более понятный язык. Кросс-платформенный производственный код (открытый исходный код)[18] из Игры Wildfire также реализует правильную интерпретацию документации Intel.
Примеры обнаружения топологии с участием более старых (до 2010 г.) процессоров Intel, в которых отсутствует x2APIC (таким образом, не реализован лист EAX = Bh), приведены в презентации Intel 2010 г.[19] Помните, что использование этого старого метода обнаружения на процессорах Intel 2010 и более новых может привести к завышению количества ядер и логических процессоров, поскольку старый метод обнаружения предполагает отсутствие пробелов в пространстве идентификаторов APIC, и это предположение нарушается некоторыми новыми процессорами (начиная с серии Core i3 5x0), но эти новые процессоры также поставляются с x2APIC, поэтому их топологию можно правильно определить с помощью листового метода EAX = Bh.
EAX = 6: Управление температурой и питанием
Эта секция нуждается в расширении. Вы можете помочь добавляя к этому. (Апрель 2020) |
EAX = 7, ECX = 0: расширенные функции
Это возвращает флаги расширенных функций в EBX, ECX и EDX.
Кусочек | 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 пользовательского пространства, используемой BNDLDX и BNDSTX Intel MPX инструкции в 64-битном режиме | (зарезервированный) | |
18 | Rdseed | RDSEED инструкция | pconfig | Конфигурация платформы (инструкции по технологиям шифрования памяти) | ||
19 | adx | Intel ADX (Расширения инструкций по переносу с высокой точностью) | lbr | Архитектурные отчеты последней ветви | ||
20 | шлепок | Предотвращение доступа в режиме супервизора | cet_ibt | Непрямое отслеживание переходов при принудительном контроле потока управления | ||
21 | avx512_ifma | AVX-512 Целочисленные инструкции умножения-сложения | (зарезервированный) | |||
22 | pcommit | Инструкция PCOMMIT | rdpid | Чтение идентификатора процессора и IA32_TSC_AUX | amx-bf16 | Расчет тайлов на числах bfloat16 |
23 | Clflushopt | Инструкция CLFLUSHOPT | (зарезервированный) | (зарезервированный) | ||
24 | clwb | Инструкция CLWB | (зарезервированный) | amx-плитка | Архитектура плитки | |
25 | intel_pt | Процессор Intel Trace | cldemote | Понижение уровня строки кэша | amx-int8 | Вычисление плитки на 8-битных целых числах |
26 | avx512_pf | AVX-512 Инструкции по предварительной загрузке | (зарезервированный) | IBRS_IBPB / spec_ctrl | Управление спекуляциями, часть косвенного управления ветвями (IBC): Спекуляция с ограничением косвенного ответвления (IBRS) и Барьер косвенного прогнозирования ветвлений (IBPB)[20][21] | |
27 | avx512_er | AVX-512 Показательные и взаимные инструкции | МОВДИРИ | шпилька | Однопоточный предсказатель косвенного ветвления, часть IBC[20] | |
28 | avx512_cd | AVX-512 Инструкции по обнаружению конфликтов | MOVDIR64B | L1D_FLUSH | IA32_FLUSH_CMD MSR | |
29 | ша | Расширения Intel SHA | ENQCMD | Поставить в очередь магазины | IA32_ARCH_CAPABILITIES | Спекулятивные меры по смягчению побочного канала[20] |
30 | avx512_bw | AVX-512 Инструкции по байтам и словам | sgx_lc | Конфигурация запуска SGX | IA32_CORE_CAPABILITIES | Поддержка основных возможностей модели в списке MSR |
31 | avx512_vl | AVX-512 Увеличение длины вектора | pks | Ключи защиты для страниц в режиме супервизора | ssbd | Отключение спекулятивного обхода хранилища,[20] как смягчение для Спекулятивный обход магазина (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 являются следующими:[22][23]
Кусочек | EDX | ECX | ||
---|---|---|---|---|
короткий | Особенность | короткий | Особенность | |
0 | fpu | На борту x87 FPU | lahf_lm | LAHF / SAHF в длинном режиме |
1 | vme | Расширения виртуального режима (VIF) | cmp_legacy | Hyper Threading недействительный |
2 | де | Отладочные расширения (CR4 бит 3) | SVM | Безопасная виртуальная машина |
3 | pse | Расширение размера страницы | экстапический | Расширенный 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 | Легкое профилирование[24] |
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 байтовым символом в конце.[25] Необходимо проверить, присутствует ли функция в ЦП, выполнив CPUID
с EAX = 80000000ч
сначала и проверка того, больше ли возвращаемое значение 80000004h.
#включают // предоставляется GCC #включают <stdio.h>#включают <stdint.h>int главный(пустота) { uint32_t марка[12]; если (!__get_cpuid_max(0x80000004, НОЛЬ)) { fprintf(stderr, «Функция не реализована».); возвращаться 2; } __get_cpuid(0x80000002, марка+0x0, марка+0x1, марка+0x2, марка+0x3); __get_cpuid(0x80000003, марка+0x4, марка+0x5, марка+0x6, марка+0x7); __get_cpuid(0x80000004, марка+0x8, марка+0x9, марка+0xa, марка+0xb); printf("Бренд:% s", марка);}
EAX = 80000005h: идентификаторы кэша L1 и TLB
Эта функция содержит характеристики кэша L1 и TLB процессора.
EAX = 80000006h: Расширенные функции кэша L2
Возвращает подробную информацию о кэше L2 в ECX, включая размер строки в байтах (биты 07-00), тип ассоциативности (закодированный 4-битным полем; биты 15-12) и размер кеша в килобайтах (биты 31-16). .
#включают // предоставляется GCC #включают <stdio.h>#включают <stdint.h>int главный(пустота) { uint32_t eax, ebx, ecx, edx; если (__get_cpuid(0x80000006, &eax, &ebx, &ecx, &edx)) { printf("Размер строки:% d B, тип связи:% d; Размер кэша:% d КБ.", ecx & 0xff, (ecx >> 12) & 0x07, (ecx >> 16) & 0xffff); возвращаться 0; } еще { fputs(stderr, «ЦП не поддерживает 0x80000006»); возвращаться 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.[26]
Использование CPUID из языков высокого уровня
Встроенная сборка
Эту информацию легко получить и на других языках. Например, код C для gcc ниже печатает первые пять значений, возвращаемых cpuid:
#включают <stdio.h>/ * Работает в 32- и 64-битных системах. См. [[Встроенный ассемблер # В реальных компиляторах]] за советами по чтению этого кода. * /int главный(){ / * Четыре регистра не нужно инициализировать, так как процессор будет писать поверх них. * / int инфо-тип, а, б, c, d; за (инфо-тип = 0; инфо-тип < 5; инфо-тип ++) { __как м__("cpuid" : "= а" (а), "= b" (б), "= c" (c), "= d" (d) // Выходные переменные. EAX -> a и наоборот. : "0" (инфо-тип)); // Поместите инфо-тип в EAX. printf ("InfoType% xEAX:% xEBX:% xECX:% xEDX:% x", инфо-тип, а, б, c, d); } возвращаться 0;}
В компиляторах MSVC и Borland / Embarcadero C (bcc32) встроенная ассемблерная информация неявно содержится в инструкциях:
#включают <stdio.h>int главный(){ беззнаковый int InfoType = 0; беззнаковый int а, б, c, d; __как м { / * Делаем звонок. * / mov EAX, InfoType; cpuid; / * Сохраняем результаты. * / mov а, EAX; mov б, EBX; mov c, ECX; mov d, EDX; } printf ("InfoType% xEAX:% xEBX:% xECX:% xEDX:% x", InfoType, а, б, c, d); возвращаться 0;}
Если какая-либо версия была написана на простом языке ассемблера, программист должен вручную сохранить результаты EAX, EBX, ECX и EDX в другом месте, если они хотят продолжать использовать значения.
Функции оболочки
GCC также предоставляет заголовок под названием <cpuid.h>
в системах с CPUID. В __cpuid
- макрос, расширяющийся до встроенной сборки. Типичное использование:
#включают <cpuid.h>#включают <stdio.h>intглавный (пустота){ int а, б, c, d; __cpuid (0 / * строка поставщика * /, а, б, c, d); printf ("EAX:% xEBX:% xECX:% xEDX:% x", а, б, c, d); возвращаться 0;}
Но если кто-то запросит расширенную функцию, отсутствующую в этом процессоре, они не заметят и могут получить случайные, неожиданные результаты. Более безопасная версия также предоставляется в <cpuid.h>
. Он проверяет наличие расширенных функций и выполняет еще несколько проверок безопасности. Выходные значения передаются не с использованием параметров макроса, аналогичных ссылкам, а с использованием более обычных указателей.
#включают <cpuid.h>#включают <stdio.h>intглавный (пустота){ int а, б, c, d; если (!__get_cpuid (0x81234567 / * не существует, но предполагается, что он существует * /, &а, &б, &c, &d)) { fprintf (stderr, "Предупреждение: запрос CPUID 0x81234567 недействителен!"); } printf("EAX:% xEBX:% xECX:% xEDX:% x", а, б, c, d); возвращаться 0;}
Обратите внимание на амперсанды в & a, & b, & c, & d
и условное утверждение. Если __get_cpuid
call получит правильный запрос, вернет ненулевое значение, в случае неудачи - ноль.[27]
Компилятор Microsoft Visual C имеет встроенную функцию __cpuid ()
поэтому инструкция cpuid может быть встроена без использования встроенной сборки, что удобно, поскольку версия MSVC для x86-64 вообще не допускает встроенную сборку. Та же программа для MSVC было бы:
#включают <iostream>#включают <intrin.h>int главный(){ int cpuInfo[4]; за (int а = 0; а < 5; а++) { __cpuid(cpuInfo, а); стандартное::cout << "Код " << а << "дает" << cpuInfo[0] << ", " << cpuInfo[1] << ", " << cpuInfo[2] << ", " << cpuInfo[3] << ''; } возвращаться 0;}
Многие интерпретируемые или скомпилированные языки сценариев могут использовать CPUID через FFI библиотека. Одна такая реализация показывает использование модуля Ruby FFI для выполнения языка ассемблера, который включает код операции CPUID.
Информация о процессоре за пределами x86
Некоторые архитектуры ЦП, отличные от архитектуры x86, также предоставляют определенные формы структурированной информации о возможностях процессора, обычно в виде набора специальных регистров:
- ARM архитектуры есть
CPUID
регистр сопроцессора, для доступа к которому требуется EL1 или выше.[28] - В IBM System z процессоры мэйнфреймов имеют ID ЦП магазина (
STIDP
) инструкция с 1983 г. IBM 4381[29] для запроса идентификатора процессора.[30] - В IBM System z процессоры мэйнфреймов также имеют Расширен список объектов магазина (
STFLE
) инструкция, в которой перечислены установленные аппаратные функции.[30] - В MIPS32 / 64 архитектура определяет обязательный Идентификация процессора (
PrId
) и серию гирляндных Регистры конфигурации.[31] - В PowerPC процессор имеет 32-битный только для чтения Регистр версии процессора (
PVR
) с указанием модели используемого процессора. Инструкция требует уровня доступа супервизора.[32]
DSP и транспьютер -подобные семейства микросхем не восприняли инструкции каким-либо заметным образом, несмотря на то, что (в относительном выражении) имеют столько же вариаций в дизайне. Могут присутствовать альтернативные способы идентификации кремния; например, DSP от Инструменты Техаса содержат набор регистров на основе памяти для каждого функционального блока, который начинается с идентификаторов, определяющих тип и модель блока, его ASIC пересмотр конструкции и функции, выбранные на этапе проектирования, и продолжается с регистрами управления и данных для конкретных устройств. Доступ к этим областям осуществляется простым использованием существующих инструкций загрузки и сохранения; таким образом, для таких устройств нет необходимости в расширении набора регистров для целей идентификации устройства.[нужна цитата ]
Смотрите также
- CPU-Z, утилита Windows, которая использует
CPUID
для определения различных настроек системы - Spectre (уязвимость безопасности)
- Спекулятивный обход магазина (SSB)
- / proc / cpuinfo, текстовый файл, созданный некоторыми системами, содержащий некоторую информацию CPUID.
Рекомендации
- ^ «Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32» (PDF). Intel.com. Получено 2013-04-11.
- ^ «Обнаружение процессоров Intel - определение поколения системного процессора». Rcollins.org. Получено 2013-04-11.
- ^ "LXR linux-old / arch / i386 / kernel / head.S". Lxr.linux.no. Архивировано из оригинал на 2012-07-13. Получено 2013-04-11.
- ^ "CPUID, EAX = 4 - Странные результаты (решено)". Software.intel.com. Получено 2014-07-10.
- ^ "инструкция ao486 CPUID".
- ^ "v586: 586 совместимое программное ядро для FPGA".
- ^ "Глава 3 Справочник по набору команд, A-L" (PDF). Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32. Корпорация Intel. 2018-12-20. Получено 2018-12-20.
- ^ http://bochs.sourceforge.net/techspec/24161821.pdf
- ^ Хуггахалли, Рам; Айер, Рави; Тетрик, Скотт (2005). «Прямой доступ к кэш-памяти для высокоскоростного сетевого ввода-вывода». Новости компьютерной архитектуры ACM SIGARCH. 33 (2): 50–59. Дои:10.1145/1080695.1069976. CiteSeerX:10.1.1.91.957.
- ^ Дреппер, Ульрих (2007), Что каждый программист должен знать о памяти, CiteSeerX:10.1.1.91.957
- ^ «Механизмы определения того, работает ли программное обеспечение на виртуальной машине VMware». База знаний VMware. VMWare. 2015-05-01.
Процессоры Intel и AMD зарезервировали бит 31 ECX листа CPUID 0x1 в качестве бита присутствия гипервизора. Этот бит позволяет гипервизорам сообщать о своем присутствии гостевой операционной системе. Гипервизоры устанавливают этот бит, а физические процессоры (все существующие и будущие процессоры) устанавливают этот бит в ноль. Гостевые операционные системы могут протестировать бит 31, чтобы определить, работают ли они внутри виртуальной машины.
- ^ Катария, Алок; Хехт, Дэн (2008-10-01). "Предложение интерфейса CPUID гипервизора". LKML Архив на lore.kernel.org. В архиве из оригинала от 15.03.2019.
Бит 31 ECX листа CPUID 0x1. Этот бит зарезервирован Intel и AMD для использования гипервизорами и указывает на наличие гипервизора. Виртуальные ЦП (гипервизоры) устанавливают этот бит в 1, а физические ЦП (все существующие и будущие ЦП) устанавливают этот бит в ноль. Этот бит может быть исследован гостевым программным обеспечением, чтобы определить, работают ли они внутри виртуальной машины.
- ^ а б Ши Куо (27 января, 2012). «Перечень топологии процессора с архитектурой Intel® 64».
- ^ «Перечисление процессоров и ядер с использованием CPUID | AMD». Developer.amd.com. Архивировано из оригинал на 2014-07-14. Получено 2014-07-10.
- ^ «Процессоры Sandybridge сообщают неверный номер ядра?». Software.intel.com. 2012-12-29. Получено 2014-07-10.
- ^ "cpuid, __cpuidex". Msdn.microsoft.com. 2014-06-20. Получено 2014-07-10.
- ^ «Архитектура x86 - CPUID». sandpile.org. Получено 2014-07-10.
- ^ "topology.cpp в ps / trunk / source / lib / sysdep / arch / x86_x64 - Wildfire Games". Trac.wildfiregames.com. 2011-12-27. Получено 2014-07-10.
- ^ Технология Hyper-Threading и обнаружение многоядерных процессоров
- ^ а б c d «Снижение риска по побочному каналу спекулятивного исполнения» (PDF). Редакция 2.0. Intel. Май 2018 [январь 2018]. Номер документа: 336996-002. Получено 2018-05-26.
- ^ "Серия патчей IBRS [LWN.net]".
- ^ Спецификация CPUID (PDF), AMD, Сентябрь 2010 г., получено 2013-04-02
- ^ Исходный код ядра Linux
- ^ Спецификация облегченного профилирования (PDF), AMD, Август 2010 г., получено 2013-04-03
- ^ «Идентификация процессора Intel® и инструкция CPUID» (PDF). Download.intel.com. 2012-03-06. Получено 2013-04-11.
- ^ Ферри, Питер. «Атаки на эмуляторы виртуальных машин» (PDF). symantec.com. Symantec Advanced Threat Research. Архивировано из оригинал (PDF) на 2007-02-07. Получено 15 марта 2017.
- ^ https://github.com/gcc-mirror/gcc/blob/master/gcc/config/i386/cpuid.h
- ^ «Информационный центр АРМ». Infocenter.arm.com. Получено 2013-04-11.
- ^ «Коды версий процессора и константы SRM». Архивировано из оригинал на 2014-09-08. Получено 2014-09-08.
- ^ а б "Техническое руководство IBM System z10 Enterprise Class" (PDF).
- ^ "Архитектура MIPS32 для программистов, Том III: Архитектура привилегированных ресурсов MIPS32" (PDF). MIPS Technologies, Inc. 12 марта 2001 г.
- ^ "Архитектура операционной среды PowerPC, книга III" (PDF).
дальнейшее чтение
- «Расширение косвенного управления ветвлением технологии AMD64» (PDF) (Белая бумага). Редакция 4.10.18. Advanced Micro Devices, Inc. (AMD). 2018. В архиве (PDF) из оригинала на 2018-05-09. Получено 2018-05-09.
внешняя ссылка
- 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