В архитектуре x86 инструкция CPUID (идентифицируемая кодом CPUID
операции ) является дополнительной инструкцией процессора (ее название происходит от CPU IDentification), позволяющей программному обеспечению обнаруживать детали процессора. Он был представлен Intel в 1993 году с выпуском процессоров 486 с улучшенными процессорами Pentium и SL . [1]
Программа может использовать CPUID
для определения типа процессора и того, реализованы ли такие функции, как MMX / SSE .
История
До того, как CPUID
инструкция стала общедоступной , программисты должны были написать эзотерический машинный код, который использовал бы незначительные различия в поведении ЦП, чтобы определить марку и модель процессора. [2] [3] С появлением процессора 80386 EDX при сбросе указывал версию, но она была доступна для чтения только после сброса, и не было стандартного способа для приложений считывать значение.
Вне семейства x86 от разработчиков в основном все еще требуется использовать эзотерические процессы (включая синхронизацию инструкций или триггеры сбоя ЦП) для определения имеющихся вариаций в конструкции ЦП.
В семействе Motorola 680x0, в котором никогда не было инструкций CPUID, для определенных инструкций требовались повышенные привилегии. Их можно использовать для различения различных членов семейства ЦП. В Motorola 68010 инструкция MOVE от SR стала привилегированной. Это примечательное изменение инструкций (и конечного автомата) позволило 68010 удовлетворить требования виртуализации Попека и Голдберга . Поскольку 68000 предлагал непривилегированный MOVE от 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 = 80000000h
.
Листы 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 ( серия 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 |
Ниже приведены известные строки идентификатора производителя процессора:
- "AMD лучше!" - раннее инженерные образцы AMD K5 процессор
- «AuthenticAMD» - AMD
- "CentaurHauls" - IDT WinChip / Centaur (включая некоторые процессоры VIA)
- «CyrixInstead» - Cyrix / ранняя STMicroelectronics и IBM
- «GenuineIntel» - Intel
- «TransmetaCPU» - Transmeta
- «ПодлинныйTMx86» - Transmeta
- "Geode by NSC" - National Semiconductor
- «NexGenDriven» - NexGen
- "RiseRiseRise" - Восход
- «SiS SiS SiS» - SiS
- «UMC UMC UMC» - UMC
- «ВИА ВИА ВИА» - ВИА
- "Vortex86 SoC" - DM&P Vortex
- «Шанхай» - Чжаосинь
- «HygonGenuine» - Хигон
- «МАШИНА Е2К» - МЦСТ Эльбрус.
Следующие строки идентификаторов используются программными ядрами ЦП с открытым исходным кодом :
- "GenuineAO486" - процессор ao486 [5]
- "GenuineIntel" - ядро v586 [6] (идентично строке Intel ID)
Ниже приведены известные строки идентификаторов виртуальных машин:
- «бхиве бхиве» - бхиве
- «КВМКВМКВМ» - КВМ
- «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
- «VirtualApple» - Apple Rosetta
- «GenuineIntel» - Apple Rosetta 2 [7]
Например, для процессора GenuineIntel значения, возвращаемые в EBX, равны 0x756e6547, EDX - 0x49656e69, а ECX - 0x6c65746e. Следующий код написан на GNU Assembler для архитектуры x86-64 и отображает строку идентификатора поставщика, а также самый высокий параметр вызова, который реализует ЦП.
.данныеs0: .asciz "CPUID:% x \ n" s1: .asciz "Наибольший номер реализованной базовой функции:% i \ n" s2: .asciz "Идентификатор поставщика:% .12s \ n".текст.align 32 .globl mainОсновной: pushq % RBP MOVQ % RSP , % RBP SubQ $ 16 , % RSPmovl $ 1 , % eax cpuidmovq $ s0 , % rdi movl % eax , % esi xorl % eax , % eax вызов printfpushq % rbx // -fPICxorl % eax , % eax cpuidmovl % ebx , 0 ( % rsp ) movl % edx , 4 ( % rsp ) movl % ecx , 8 ( % rsp )popq % rbx // -fPICmovq $ s1 , % rdi movl % eax , % esi xorl % eax , % eax вызов printfmovq $ s2 , % rdi movq % rsp , % rsi xorl % eax , % eax вызов printfmovq % rbp , % rsp popq % rbp // ret movl $ 1 , % eax int $ 0x80
EAX = 1: информация о процессоре и биты функций
Это возвращает информацию о степпинге , модели и семействе ЦП в регистре EAX (также называемом сигнатурой ЦП), флаги функций в регистрах EDX и ECX и дополнительную информацию о функциях в регистре EBX. [8]
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. Если поле «Идентификатор семьи» равно 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. [9] | если установлен флаг функции 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 [10] [11] |
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 | Hyper Threading | avx | Расширенные векторные расширения |
29 | тм | Термомонитор автоматически ограничивает температуру | f16c | Функция FP F16C ( половинная точность ) |
30 | ia64 | Процессор IA64 , эмулирующий x86 | rdrnd | Функция RDRAND (встроенный генератор случайных чисел) |
31 год | pbe | Возможность пробуждения Pending Break Enable (PBE # pin) | гипервизор | Наличие гипервизора (всегда ноль на физических процессорах) [12] [13] |
Зарезервированные поля должны быть замаскированы перед их использованием для идентификации процессора.
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. [14] По состоянию на 2013 год.[Обновить]AMD не использует эти листья, но имеет альтернативные способы выполнения перечисления ядер. [15]
В отличие от большинства других листьев 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 содержат некоторую вводящую в заблуждение информацию, особенно в отношении идентификации и подсчета ядер в многоядерном процессоре; [16] ошибки из-за неправильной интерпретации этой информации были даже включены в пример кода Microsoft для использования cpuid, даже для версии Visual Studio 2013 г. [17], а также на странице sandpile.org для CPUID, [18] но Intel Пример кода для определения топологии процессора [14] имеет правильную интерпретацию, а текущее руководство Intel Software Developer's Manual содержит более ясный язык. Кросс-платформенный производственный код (с открытым исходным кодом) [19] от Wildfire Games также реализует правильную интерпретацию документации Intel.
Примеры обнаружения топологии с участием более старых (до 2010 г.) процессоров Intel, в которых отсутствует x2APIC (таким образом, не реализуется лист EAX = Bh), приведены в презентации Intel 2010 г. [20] Помните, что использование этого старого метода обнаружения на процессорах Intel 2010 года и более новых может привести к завышению количества ядер и логических процессоров, поскольку старый метод обнаружения предполагает, что в пространстве идентификаторов APIC нет пробелов, и это предположение нарушается некоторыми новыми процессорами. (начиная с серии Core i3 5x0), но эти новые процессоры также поставляются с x2APIC, поэтому их топология может быть правильно определена с помощью листового метода EAX = Bh.
EAX = 6: Управление температурой и питанием
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 | Непрямое отслеживание ветвлений принуждения к потоку управления | ||
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) [21] [22] | |
27 | avx512_er | AVX-512 Экспоненциальные и взаимные инструкции | МОВДИРИ | шпилька | Однопоточный предсказатель косвенного перехода, часть IBC [21] | |
28 год | avx512_cd | Инструкции по обнаружению конфликтов AVX-512 | MOVDIR64B | L1D_FLUSH | IA32_FLUSH_CMD MSR | |
29 | ша | Расширения Intel SHA | ENQCMD | Поставить в очередь магазины | IA32_ARCH_CAPABILITIES | Спекулятивные меры по смягчению побочного канала [21] |
30 | avx512_bw | AVX-512 Байт и Word инструкции | sgx_lc | Конфигурация запуска SGX | IA32_CORE_CAPABILITIES | Поддержка основных возможностей конкретной модели в списке MSR |
31 год | avx512_vl | Расширения векторной длины AVX-512 | pks | Ключи защиты для страниц в режиме супервизора | ssbd | Отключение спекулятивного обхода хранилища, [21] как смягчение последствий спекулятивного обхода хранилища (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 следующие: [23] [24]
Немного | 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 | Легкое профилирование [25] |
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 байтовым символом в конце. [26] Необходимо , чтобы проверить, присутствует ли в CPU функция путем выдачи CPUID
с EAX = 80000000h
первой и проверки , если возвращаемое значение больше или равно 80000004h.
#include // предоставляется GCC#include #include int main ( void ) { бренд uint32_t [ 12 ]; if ( ! __get_cpuid_max ( 0x80000004 , NULL )) { 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 \ n " , бренд ); }
EAX = 80000005h: идентификаторы кэша L1 и TLB
Эта функция содержит характеристики кэша L1 и TLB процессора.
EAX = 80000006h: Расширенные функции кэша второго уровня
Возвращает подробную информацию о кэше L2 в ECX, включая размер строки в байтах (биты 07-00), тип ассоциативности (закодирован 4-битным полем; биты 15-12) и размер кеша в килобайтах (биты 31-16). .
#include // предоставляется GCC#include #include int main ( void ) { uint32_t eax , ebx , ecx , edx ; if ( __get_cpuid ( 0x80000006 , & eax , & ebx , & ecx , & edx )) { printf ( "Размер строки:% d B, Assoc. Type:% d; Размер кеша:% d KB. \ n " , ecx & 0xff , ( ecx >> 12 ) & 0x07 , ( ecx >> 16 ) & 0xffff ); возврат 0 ; } else { 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, [27] ссылку на песню MC Hammer U Can't Touch This .
Использование CPUID из языков высокого уровня
Встроенная сборка
Эту информацию легко получить и на других языках. Например, приведенный ниже код C для gcc выводит первые пять значений, возвращаемых cpuid:
#include / * Работает в 32- и 64-битных системах. См. [[Встроенный ассемблер # В реальных компиляторах]] за советами по чтению этого кода. * / int main () { / * Четыре регистра не нужно инициализировать, так как процессор будет писать поверх них. * / int инфо-тип , a , b , c , d ; for ( инфо-тип = 0 ; инфо- тип < 5 ; инфо- тип ++ ) { __asm__ ( "cpuid" : "= a" ( a ), "= b" ( b ), "= c" ( c ), "= d" ( г ) // Выходные переменные. EAX -> a и наоборот : "0" ( инфо-тип )); // Поместите инфо-тип в EAX. printf ( "Инфо-тип% x \ n EAX:% x \ n EBX:% x \ n ECX:% x \ n EDX:% x \ n " , инфо-тип , a , b , c , d ); } возврат 0 ; }
В компиляторах MSVC и Borland / Embarcadero C (bcc32) встроенная ассемблерная информация неявно указана в инструкциях:
#include int main () { беззнаковый int InfoType = 0 ; беззнаковые int a , b , c , d ; __asm { / * Сделай звонок. * / mov EAX , InfoType ; cpuid ; / * Сохраняем результаты. * / mov a , EAX ; mov b , EBX ; mov c , ECX ; mov d , EDX ; } printf ( "InfoType% x \ n EAX:% x \ n EBX:% x \ n ECX:% x \ n EDX:% x \ n " , InfoType , a , b , c , d ); возврат 0 ; }
Если какая-либо версия была написана на простом языке ассемблера, программист должен вручную сохранить результаты EAX, EBX, ECX и EDX в другом месте, если он хочет продолжать использовать значения.
Функции оболочки
GCC также предоставляет заголовок, вызываемый
в системах с CPUID. Это __cpuid
макрос, расширяющийся до встроенной сборки. Типичное использование:
#include #include int main ( void ) { int a , b , c , d ; __cpuid ( 0 / * строка поставщика * / , a , b , c , d ); printf ( "EAX:% x \ n EBX:% x \ n ECX:% x \ n EDX:% x \ n " , a , b , c , d ); возврат 0 ; }
Но если кто-то запросит расширенную функцию, отсутствующую в этом процессоре, они не заметят и могут получить случайные, неожиданные результаты. Более безопасная версия также предоставляется в формате
. Он проверяет наличие расширенных функций и выполняет еще несколько проверок безопасности. Выходные значения передаются не с использованием параметров макроса, подобных ссылкам, а с использованием более обычных указателей.
#include #include int main ( void ) { int a , b , c , d ; if ( ! __get_cpuid ( 0x81234567 / * не существует, но предполагается, что он существует * / , & a , & b , & c , & d )) { fprintf ( stderr , "Предупреждение: запрос CPUID 0x81234567 недействителен! \ n " ); } printf ( "EAX:% x \ n EBX:% x \ n ECX:% x \ n EDX:% x \ n " , a , b , c , d ); возврат 0 ; }
Обратите внимание на амперсанды &a, &b, &c, &d
и условное выражение. Если __get_cpuid
вызов получит правильный запрос, он вернет ненулевое значение, если не удастся - ноль. [28]
Компилятор Microsoft Visual C имеет встроенную функцию, __cpuid()
поэтому инструкция cpuid может быть встроена без использования встроенной сборки, что удобно, поскольку версия MSVC для x86-64 вообще не допускает встроенную сборку. Та же программа для MSVC будет:
#include #include int main () { int cpuInfo [ 4 ]; для ( int a = 0 ; a < 5 ; a ++ ) { __cpuid ( cpuInfo , a ); std :: cout << "Код" << a << "дает" << cpuInfo [ 0 ] << "," << cpuInfo [ 1 ] << "," << cpuInfo [ 2 ] << ", " << cpuInfo [ 3 ] << '\ n' ; } возврат 0 ; }
Многие интерпретируемые или скомпилированные языки сценариев могут использовать CPUID через библиотеку FFI . Одна из таких реализаций демонстрирует использование модуля Ruby FFI для выполнения языка ассемблера, который включает код операции CPUID.
Информация о процессоре за пределами x86
Некоторые архитектуры ЦП, отличные от x86, также предоставляют определенные формы структурированной информации о возможностях процессора, обычно в виде набора специальных регистров:
- Архитектура ARM имеет
CPUID
регистр сопроцессора, для доступа к которому требуется уровень EL1 или выше. [29] - В Z IBM System процессоры мэйнфреймов имеют магазин CPU ID (
STIDP
инструкция) , так как в 1983 году IBM 4381 [30] для запроса процессор ID. [31] - В процессорах мэйнфреймов IBM System z также есть инструкция « Сохранить список возможностей» (
STFLE
), в которой перечислены установленные аппаратные функции. [31] - Архитектура MIPS32 / 64 определяет обязательную идентификацию процессора (
PrId
) и серию последовательно соединенных регистров конфигурации . [32] - Процессор PowerPC имеет 32-битный регистр версии процессора (
PVR
), предназначенный только для чтения, который определяет используемую модель процессора. Инструкция требует уровня доступа супервизора. [33]
Семейства микросхем DSP и транспьютерных микросхем практически не учитывают инструкции, несмотря на то, что имеют (в относительном выражении) множество вариаций в дизайне. Могут присутствовать альтернативные способы идентификации кремния; например, DSP от Texas Instruments содержат набор регистров на основе памяти для каждого функционального блока, который начинается с идентификаторов, определяющих тип и модель блока, его версию ASIC и функции, выбранные на этапе проектирования, и продолжается с управлением и данными для конкретного блока. регистры. Доступ к этим областям осуществляется простым использованием существующих инструкций загрузки и сохранения; таким образом, для таких устройств нет необходимости расширять набор регистров для целей идентификации устройства. [ необходима цитата ]
Смотрите также
- CPU-Z , утилита Windows, которая используется
CPUID
для определения различных системных настроек. - Spectre (уязвимость безопасности)
- Спекулятивный обход хранилища (SSB)
- / proc / cpuinfo , текстовый файл, созданный некоторыми системами, содержащий некоторую информацию о CPUID.
Рекомендации
- ^ "Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32" (PDF) . Intel.com . Проверено 11 апреля 2013 .
- ^ «Обнаружение процессоров Intel - знание поколения системного процессора» . Rcollins.org . Проверено 11 апреля 2013 .
- ^ "LXR linux-old / arch / i386 / kernel / head.S" . Lxr.linux.no. Архивировано из оригинала на 2012-07-13 . Проверено 11 апреля 2013 .
- ^ «CPUID, EAX = 4 - Странные результаты (решено)» . Software.intel.com . Проверено 10 июля 2014 .
- ^ "инструкция CPUID ao486" .
- ^ «Программное обеспечение, совместимое с v586: 586, для FPGA» .
- ^ https://cpufun.substack.com/p/fun-with-timers-and-cpuid
- ^ «Глава 3 Справочник по набору команд, AL» (PDF) . Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32 . Корпорация Intel. 2018-12-20 . Проверено 20 декабря 2018 .
- ^ http://bochs.sourceforge.net/techspec/24161821.pdf
- ^ Хуггахалли, Рам; Айер, Рави; Тетрик, Скотт (2005). «Прямой доступ к кэш-памяти для высокоскоростного сетевого ввода-вывода». Новости компьютерной архитектуры ACM SIGARCH . 33 (2): 50–59. DOI : 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 марта 2019 года.
Бит 31 ECX листа CPUID 0x1. Этот бит зарезервирован Intel и AMD для использования гипервизорами и указывает на наличие гипервизора. Виртуальные ЦП (гипервизоры) устанавливают этот бит в 1, а физические ЦП (все существующие и будущие ЦП) устанавливают этот бит в ноль. Этот бит может проверяться гостевым программным обеспечением, чтобы определить, работают ли они внутри виртуальной машины.
- ^ а б Ши Куо (27 января, 2012). «Перечень топологии процессора с архитектурой Intel® 64» .
- ^ «Перечисление процессоров и ядер с использованием CPUID | AMD» . Developer.amd.com. Архивировано из оригинала на 2014-07-14 . Проверено 10 июля 2014 .
- ^ «Процессоры Sandybridge сообщают неверный номер ядра?» . Software.intel.com. 2012-12-29 . Проверено 10 июля 2014 .
- ^ «cpuid, __cpuidex» . Msdn.microsoft.com. 2014-06-20 . Проверено 10 июля 2014 .
- ^ «Архитектура x86 - CPUID» . sandpile.org . Проверено 10 июля 2014 .
- ^ "topology.cpp в ps / trunk / source / lib / sysdep / arch / x86_x64 - Wildfire Games" . Trac.wildfiregames.com. 2011-12-27 . Проверено 10 июля 2014 .
- ^ Технология Hyper-Threading и обнаружение многоядерных процессоров
- ^ а б в г «Снижение риска по побочному каналу спекулятивного исполнения» (PDF) . Версия 2.0. Intel . Май 2018 [январь 2018]. Номер документа: 336996-002 . Проверено 26 мая 2018 .
- ^ «Серия патчей IBRS [LWN.net]» .
- ^ Спецификация CPUID (PDF) , AMD , сентябрь 2010 г. , получено 2 апреля 2013 г.
- ^ Исходный код ядра Linux
- ^ Спецификация облегченного профилирования (PDF) , AMD , август 2010 г. , получено 3 апреля 2013 г.
- ^ «Идентификация процессора Intel® и инструкция CPUID» (PDF) . Download.intel.com. 2012-03-06 . Проверено 11 апреля 2013 .
- ^ Ферри, Питер. «Атаки на эмуляторы виртуальных машин» (PDF) . symantec.com . Symantec Advanced Threat Research. Архивировано из оригинального (PDF) 07.02.2007 . Проверено 15 марта 2017 года .
- ^ https://github.com/gcc-mirror/gcc/blob/master/gcc/config/i386/cpuid.h
- ^ «Информационный центр АРМ» . Infocenter.arm.com . Проверено 11 апреля 2013 .
- ^ «Коды версий процессора и константы SRM» . Архивировано из оригинала на 2014-09-08 . Проверено 8 сентября 2014 .
- ^ а б «Техническое руководство 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) из оригинала 09.05.2018 . Проверено 9 мая 2018 .
Внешние ссылки
- Идентификация процессора Intel и инструкция CPUID (примечание по приложению 485), последняя опубликованная версия. В 2013 г. предполагается включить в Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32 , но с июля 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, задержке памяти и CPUID