stringtranslate.com

идентификатор процессора

В архитектуре x86 инструкция CPUID (идентифицированная CPUID кодом операции ) является дополнительной инструкцией процессора (ее название происходит от идентификации ЦП ), позволяющей программному обеспечению обнаруживать подробную информацию о процессоре. Он был представлен Intel в 1993 году с выпуском процессоров Pentium и 486 с усовершенствованной версией 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операции 0F A2: .

На языке ассемблера инструкция 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. По состоянию на сентябрь 2023 года базовый срок действия отпусков увеличивается до 20 часов, но информация, возвращаемая некоторыми отпусками, не раскрывается в общедоступной документации, т.е. они «зарезервированы».

Некоторые из недавно добавленных листьев также имеют подлисты, которые выбираются через регистр ECX перед вызовом CPUID.

EAX =0: наивысший функциональный параметр и идентификатор производителя.

Возвращает строку идентификатора производителя ЦП — двенадцатизначную строку ASCII, хранящуюся в EBX, EDX, ECX (именно в этом порядке). CPUIDВ EAX возвращается самый высокий базовый параметр вызова (наибольшее значение, которое может быть установлено EAX перед вызовом ).

Вот список процессоров и реализованных функций.

Ниже приведены известные строки идентификатора производителя процессора:

Ниже приведены строки идентификаторов, используемые программными ядрами ЦП с открытым исходным кодом :

Ниже приведены известные строки идентификаторов виртуальных машин:

Например, на процессоре GenuineIntel значения, возвращаемые в EBX, — это 0x756e6547, EDX — 0x49656e69, а ECX — 0x6c65746e. В следующем примере кода отображается строка идентификатора поставщика, а также наивысший вызывающий параметр, реализуемый ЦП.

.intel_syntax без префикса .текст.m0: .string "ЦП: %x\n"  .m1: .string "Наибольший реализованный номер базовой функции: %i\n"  .m2: .string "Идентификатор поставщика: %s\n"   .globl основной основной:нажмите r12 мов eax , 1  суб рсп , 16   идентификатор процессора lea rdi , .m0 [ rip ]  mov esi , eax  вызвать printfперемещение eax , 0   идентификатор процессораlea rdi , .m1 [ rip ]  mov esi , eax  мов r12d , edx  мов ebp , ecx  вызвать printf мов 3 [ rsp ], ebx  Леа Рси , 3 [ RSP ]   lea rdi , .m2 [ рип ]   мов 7 [ рсп ], r12d   мов 11 [ рсп ], ebp  вызвать printfдобавить рсп , 16  поп р12 в отставку .section .note.GNU - стек , "" , @ progbits 

На некоторых процессорах можно изменить строку идентификатора производителя, сообщаемую CPUID.(EAX=0), путем записи новой строки идентификатора в определенные MSR ( регистры, зависящие от модели ) с помощью WRMSRинструкции. Это использовалось на процессорах сторонних производителей для включения функций и оптимизаций, которые были отключены в программном обеспечении для процессоров, которые не возвращают GenuineIntelстроку идентификатора. [14] Известно, что процессоры, обладающие такими MSR, включают:

EAX=1: информация о процессоре и биты функций.

Это возвращает информацию о шагах , модели и семействе ЦП в регистре EAX (также называемом сигнатурой ЦП ), флаги функций в регистрах EDX и ECX, а также дополнительную информацию о функциях в регистре EBX. [21]

По состоянию на октябрь 2023 года известны следующие идентификаторы семейства процессоров x86: [23]

  1. ^ Процессор i386 не поддерживает эту CPUIDинструкцию, однако он возвращает идентификатор семейства 3hв значении сброса EDX.
  2. ^ Сообщается, что Family ID намеренно не использовался для семейства процессоров Pentium 4 из-за несовместимости с Windows NT 4.0. [33]8h

Информация о процессоре и флаги функций зависят от производителя, но обычно значения Intel используются другими производителями в целях совместимости.

  1. ^ На некоторых старых процессорах выполнение CPUIDс конечным индексом (EAX) больше 0 может оставить EBX и ECX неизмененными, сохранив свои старые значения. По этой причине рекомендуется обнулить EBX и ECX перед выполнением CPUIDс конечным индексом 1.

    К процессорам, демонстрирующим такое поведение, относятся Cyrix MII [37] и IDT WinChip 2. [38]

  2. ^ На процессорах IDT, Transmeta и Rise (идентификаторы производителей CentaurHaulsи GenuineTMx86) RiseRiseRiseинструкция CMPXCHG8Bвсегда поддерживается, однако бит функции для инструкции может быть не установлен. Это обходной путь ошибки в Windows NT. [39]
  3. ^ Только на ранних процессорах AMD K5 ( AuthenticAMDсемейство 5, модель 0) бит 9 EDX использовался для обозначения поддержки PGE. Начиная с модели K5 Model 1, это было перенесено в бит 13. [40]
  4. ^ Intel AP-485, версии с 006 [41] по 008, указывает CPUID. (EAX = 1): EDX [бит 10] как имеющий имя «MTRR» (хотя и описывается как «Зарезервировано» / «Не рассчитывайте на их значение». ") - это имя было удалено в более поздних версиях AP-485, и с тех пор бит был указан как зарезервированный без имени.
  5. ^ Только на процессорах Pentium Pro ( GenuineIntelсемейство 6, модель 1) бит 11 EDX недействителен — бит, который он установил, но инструкции SYSENTERи SYSEXITне поддерживаются на Pentium Pro. [42]
  6. ^ FCMOV и FCOMIинструкции доступны только в том случае, если имеется встроенный FPU x87 (обозначается битом 0 EDX).
  7. ^ Бит 16 ECX указан как «Зарезервирован» в общедоступной документации Intel и AMD и не установлен ни в одном известном процессоре. Однако сообщается, что некоторые версии ядра Windows Vista проверяют этот бит [43] — если он установлен, Vista распознает его как функцию «каналов процессора».
  8. ^ На процессорах Intel, поддерживающих PSN (серийный номер процессора), PSN можно отключить, установив для бита 21 MSR 119h( BBL_CR_CTL) значение 1. В результате CPUID.(EAX=1):EDX[бит 18] вернет 0.
  9. ^ На процессорах x86, отличных от Itanium, поддержка бита No-execute указана в CPUID. (EAX=8000_0001):EDX[бит 20] вместо этого.
  10. ^ Бит 28 EDX, если он установлен, указывает, что биты 23:16 CPUID.(EAX=1):EBX действительны. Если этот бит не установлен, то пакет ЦП содержит только 1 логический процессор.

    В старой документации этот бит часто указывается как флаг « Технологии Hyper-Threading » [47] . Однако, хотя этот флаг является обязательным условием для поддержки Hyper-Threading, сам по себе он не указывает на поддержку Hyper-Threading и имеет был установлен на многих процессорах, которые не поддерживают какую-либо технологию многопоточности. [48]

Зарезервированные поля следует замаскировать перед их использованием в целях идентификации процессора.

EAX=2: информация о дескрипторе кэша и TLB.

Это возвращает список дескрипторов, указывающих возможности кэша и TLB в регистрах EAX, EBX, ECX и EDX.

На процессорах, поддерживающих этот лист, вызов CPUIDс EAX=2 приведет к тому, что нижний байт EAX будет установлен в значение, 01hа оставшиеся 15 байтов EAX/EBX/ECX/EDX будут заполнены 15 дескрипторами, по одному байту каждый. Эти дескрипторы предоставляют информацию о кэшах процессора, TLB и предварительной выборке. Обычно это один кэш или TLB для каждого дескриптора, но некоторые значения дескриптора также предоставляют другую информацию - в частности, 00hиспользуется для пустого дескриптора, FFhуказывает, что лист не содержит допустимой информации о кэше и что вместо него следует использовать лист 4h. и FEhуказывает, что лист не содержит допустимой информации TLB и что вместо него следует использовать лист 18h. Дескрипторы могут появляться в любом порядке.

Для каждого из четырех регистров (EAX,EBX,ECX,EDX), если установлен бит 31, не следует считать, что регистр содержит действительные дескрипторы (например, на Itanium в режиме IA-32 CPUID(EAX=2) возвращает 80000000hв EDX — это следует интерпретировать как означающее, что EDX не содержит достоверной информации, а не то, что он содержит кэш L2 объемом 512 КБ.)

В таблице ниже для известных значений дескриптора представлено сокращенное описание кэша или TLB, указанного этим значением дескриптора (или другой информации, если это применимо). В таблице используются суффиксы:

  1. ^ abcdefghi Дескрипторы 10h, 15h, 1Ah, 88h, 89h, 8Ah, 90h, 96h, 9Bhдокументированы только для режима работы IA-32 Itanium . [52]
  2. ^ Значения дескриптора abcd , , и не указаны в документации Intel и не используются ни в одном известном процессоре, но, как сообщается, распознаются ядром Windows NT v5.1 ( Windows XP ) и выше. также распознается версией 5.0 ( Windows 2000 ). [59]26h27h28h81h81h
  3. ^ Дескрипторы abcdefg 39h-3Ehперечислены 73hв версии 36 Intel AP-485, [53] , но были удалены из более поздней документации Intel, хотя некоторые из них использовались в процессорах Intel (например, 39hв процессорах Celeron на базе «Willamette-128» [ 54] ).
  4. ^ Дескриптор 49hуказывает на кэш-память 3-го уровня на GenuineIntelпроцессорах семейства 0Fh Model 6 (Xeon на базе Pentium 4) и кэш-память 2-го уровня на других процессорах.
  5. ^ В документации Intel CPUID не указана ассоциативность ITLB, указанная дескриптором 4Fh. Процессоры, использующие этот дескриптор (Intel Atom «Bonnell» [55] ), указаны в другом месте как имеющие полностью ассоциативную ITLB с 32 элементами. [56]
  6. ^ ab На процессорах Cyrix и Geode (идентификаторы поставщиков CyrixInsteadи Geode by NSC) дескрипторы 70hимеют 80hдругое значение: [57]
    • Дескриптор 70hуказывает общий TLB с 32 записями и четырьмя ассоциативными наборами инструкций и данными с размером страницы 4 КБ.
    • Дескриптор 80hуказывает общий кэш инструкций + данных L1 объемом 16 КБ с четырехсторонней ассоциативностью наборов и размером строки кэша 16 байт.
  7. ^ Дескриптор 76hуказан как кэш L2 размером 1 МБ в версии 37 Intel AP-485, [58] , но как инструкция TLB в версии 38 и во всей более поздней документации Intel.
  8. ^ abc Дескрипторы 77h, 7Eh, 8Dhдокументированы только для режима работы IA-32 Itanium 2 . [60]
  9. ^ В режиме работы IA-32 процессора Itanium 2 размер кэша L3 всегда указывается как 3 мегабайта независимо от фактического размера кэша. [61]
  10. ^ Для дескриптора B1hемкость TLB составляет 8 элементов при использовании страниц по 2 МБ, но уменьшается до 4 элементов при использовании страниц по 4 МБ.

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. [64] По состоянию на 2013 год AMD не использует эти листья, но имеет альтернативные способы выполнения нумерации ядер. [65]

В отличие от большинства других листьев CPUID, лист Bh будет возвращать разные значения в EDX в зависимости от того, на каком логическом процессоре выполняется инструкция CPUID; значение, возвращаемое в EDX, на самом деле является идентификатором x2APIC логического процессора. Однако пространство идентификаторов x2APIC не отображается постоянно на логические процессоры; в сопоставлении могут быть пробелы, а это означает, что некоторые промежуточные идентификаторы x2APIC не обязательно соответствуют какому-либо логическому процессору. Дополнительная информация для сопоставления идентификаторов x2APIC с ядрами предоставляется в других регистрах. Хотя лист Bh имеет подлисты (выбираемые ECX, как описано ниже), на значение, возвращаемое в EDX, влияет только логический процессор, на котором выполняется инструкция, но не подлист.

Топология процессора(ов), представленная листом Bh, является иерархической, но со странной оговоркой, что порядок (логических) уровней в этой иерархии не обязательно соответствует порядку в физической иерархии ( SMT /core/package). . Однако каждый логический уровень может быть запрошен как подлист ECX (листа Bh) на предмет его соответствия «типу уровня», который может быть SMT, ядром или «недействительным». Пространство идентификатора уровня начинается с 0 и является непрерывным. Это означает, что если идентификатор уровня недействителен, все идентификаторы более высоких уровней также будут недействительны. Тип уровня возвращается в битах 15:08 ECX, а количество логических процессоров на запрошенном уровне возвращается в EBX. Наконец, связь между этими уровнями и идентификаторами x2APIC возвращается в EAX[4:0] как количество битов, на которое идентификатор x2APIC должен быть сдвинут, чтобы получить уникальный идентификатор на следующем уровне.

Например, двухъядерный процессор Westmere , поддерживающий гиперпоточность (то есть имеющий в общей сложности два ядра и четыре потока), может иметь идентификаторы x2APIC 0, 1, 4 и 5 для своих четырех логических процессоров. Лист Bh (=EAX), подлист 0 (=ECX) CPUID может, например, возвращать 100h в ECX, что означает, что уровень 0 описывает уровень SMT (гиперпоточность) и возвращать 2 в EBX, поскольку имеется два логических процессора (модуля SMT). на каждое физическое ядро. Значение, возвращаемое в EAX для этого 0-подлиста, в этом случае должно быть равно 1, поскольку сдвиг вышеупомянутых идентификаторов x2APIC вправо на один бит дает уникальный номер ядра (на следующем уровне иерархии идентификаторов уровней) и стирает идентификатор SMT. бит внутри каждого ядра. Более простой способ интерпретировать эту информацию заключается в том, что последний бит (бит номер 0) идентификатора x2APIC идентифицирует блок SMT/гиперпоточности внутри каждого ядра в нашем примере. Переход к подлисту 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 содержат некоторую вводящую в заблуждение информацию, особенно в отношении идентификации и подсчета ядер в многоядерном процессоре; [66] ошибки, связанные с неправильной интерпретацией этой информации, были даже включены в пример кода Microsoft для использования CPUID, даже для версии Visual Studio 2013 года, [67] , а также на странице sandpile.org для CPUID, [68], но Intel пример кода для определения топологии процессора [64] имеет правильную интерпретацию, а в текущем Руководстве разработчика программного обеспечения Intel написан более понятный язык. Кроссплатформенный производственный код (с открытым исходным кодом) [69] от Wildfire Games также реализует правильную интерпретацию документации Intel.

Примеры обнаружения топологии с использованием старых процессоров Intel (до 2010 года), в которых отсутствует x2APIC (поэтому не реализуется лист EAX=Bh), приведены в презентации Intel за 2010 год. [70] Помните, что использование этого старого метода обнаружения на процессорах Intel 2010 года выпуска и новее может привести к завышению количества ядер и логических процессоров, поскольку старый метод обнаружения предполагает отсутствие пробелов в пространстве идентификаторов APIC, а это предположение нарушается некоторыми новыми процессорами. (начиная с серии Core i3 5x0), но эти новые процессоры также поставляются с x2APIC, поэтому их топологию можно правильно определить с помощью листового метода EAX=Bh.

EAX=6: Управление температурой и питанием.

Это возвращает функциональные биты в регистре EAX и дополнительную информацию в регистрах EBX, ECX и EDX.

  1. ^ Только на процессорах семейства Intel Pentium 4 бит 2 EAX используется для обозначения OPP (защита рабочей точки) [71] вместо ARAT.
  2. ^ Чтобы включить режим быстрого (несериализующего) доступа для IA32_HWP_REQUESTMSR на процессорах, которые его поддерживают, необходимо установить бит 0 в FAST_UNCORE_MSRS_CTL( 657h) MSR.
  1. ^ Бит «ACNT2 Capability» указан в Intel AP-485 версии 038 [73] и 039, но не указан ни в одной версии Intel SDM. Известно, что эта функция существует только в нескольких процессорах Intel, например, в Xeon «Harpertown» со степпингом E0. [74]

EAX=7, ECX=0: расширенные функции

Это возвращает флаги расширенных функций в EBX, ECX и EDX. Возвращает максимальное значение ECX для EAX=7 в EAX.

EAX=7, ECX=1: расширенные функции

Это возвращает флаги расширенных функций во всех четырех регистрах.

EAX=7, ECX=2: расширенные функции

Это возвращает флаги расширенных функций в EDX.

EAX, EBX и ECX зарезервированы.

EAX=0Dh: функции XSAVE и компоненты состояния.

Этот лист используется для перечисления функций XSAVE и компонентов состояния.

Расширение набора команд XSAVE предназначено для сохранения/восстановления расширенного состояния ЦП (обычно с целью переключения контекста ) таким образом, чтобы его можно было расширить для охвата новых расширений набора команд, при этом коду переключения контекста ОС не нужно понимать специфику новые расширения. Это делается путем определения серии компонентов состояния , каждый из которых имеет размер и смещение в пределах заданной области сохранения, и каждый соответствует подмножеству состояния, необходимого для того или иного расширения ЦП. Лист EAX=0DhCPUID используется для предоставления информации о том, какие компоненты состояния поддерживает ЦП и каковы их размеры/смещения, чтобы ОС могла зарезервировать необходимый объем пространства и установить соответствующие биты включения.

Компоненты состояния можно разделить на две группы: состояние пользователя (элементы состояния, видимые приложению, например векторные регистры AVX-512 ) и состояние супервизора (элементы состояния, которые влияют на приложение, но не являются непосредственно пользователем). видимый, например, конфигурация прерываний пользовательского режима). Элементы состояния пользователя активируются путем установки связанных с ними битов в XCR0регистре управления, а элементы состояния супервизора включаются путем установки связанных с ними битов в IA32_XSS( 0DA0h) MSR - указанные элементы состояния затем становятся компонентами состояния, которые можно сохранить. и восстановлен с помощью XSAVE/ XRSTORсемейства инструкций.

Таким образом механизм XSAVE может обрабатывать до 63 компонентов состояния. Компоненты состояния 0 и 1 ( x87 и SSE соответственно) имеют фиксированные смещения и размеры — для компонентов состояния от 2 до 62 их размеры, смещения и несколько дополнительных флагов можно запросить, выполнив с помощью CPUIDи EAX=0Dhустановив ECXиндекс состояния. -компонент. Это вернет следующие элементы в EAX, EBX и ECX (при этом EDX зарезервирован):

Попытка запросить неподдерживаемый компонент состояния таким образом приводит к тому, что EAX,EBX,ECX и EDX устанавливаются в 0.

Подлисты 0 и 1 CPUIDлиста 0Dhиспользуются для предоставления информации о функциях:

По состоянию на июль 2023 года архитектурно определены следующие компоненты состояния XSAVE:

  1. ^ Бит 0 XCR0жестко привязан к 1, поэтому инструкции XSAVE всегда поддерживают сохранение/восстановление состояния x87.
  2. ^ Для регистров XCR0и IA32_XSSбит 63 зарезервирован специально для расширения битового вектора - это исключает существование компонента состояния 63.

EAX=12h: возможности SGX

На этом листе представлена ​​информация о поддерживаемых возможностях функции Intel Software Guard Extensions (SGX). Лист предоставляет несколько подлистов, выбранных с помощью ECX.

Подлист 0 предоставляет информацию о поддерживаемых конечных функциях SGX в EAX и максимальных поддерживаемых размерах анклава SGX в EDX; ECX зарезервирован. EBX предоставляет битовую карту, которая может быть установлена ​​в поле MISCSELECT в SECS (структура управления анклавом SGX) — это поле используется для управления информацией, записываемой в область MISC SSA (область состояния сохранения SGX), когда AEX (SGX Save State Area) происходит асинхронный выход из анклава).

Подлист 1 предоставляет битовую карту, биты которой могут быть установлены в 128-битном поле ATTRIBUTES SECS в EDX:ECX:EBX:EAX (это относится к копии SECS, используемой в качестве входных данных для конечной ENCLS[ECREATE]функции). Старшие 64 бита (заданные в EDX:ECX) представляют собой битовую карту, биты которой могут быть установлены в XFRM (маска запроса X-функции) — эта маска представляет собой битовую маску того, какие компоненты состояния процессора (см. лист 0Dh) будут сохранены. в SSA в случае AEX; он имеет ту же структуру, что и XCR0регистр управления. Остальные биты задаются в EAX и EBX следующим образом:

  1. ^ Для копии SECS, существующей внутри эксклава, бит 0 (INIT) SECS.ATTRIBUTES используется для указания того, что анклав был инициализирован с помощью ENCLS[EINIT]. Этот бит должен быть равен 0 в копии SECS, которая передается в качестве входных данных для ENCLS[CREATE].

Подлисты 2 и выше используются для предоставления информации о том, какие области физической памяти доступны для использования в качестве разделов EPC (кэш страниц анклава) в SGX.

EAX=14h, ECX=0: трассировка процессора

На этом подлисте представлена ​​информация о функциях трассировки процессоров Intel (также известной как трассировка инструкций в реальном времени).

Значение, возвращаемое в EAX, представляет собой индекс самого высокого подлиста, поддерживаемого для CPUID с EAX=14h. EBX и ECX предоставляют флаги функций, EDX зарезервирован.

EAX=19h: функции AES Key Locker

В этом листе представлена ​​информация о функциях AES Key Locker в EAX, EBX и ECX. EDX зарезервирован.

EAX=24 часа, ECX=0: возможности AVX10

Это возвращает максимально поддерживаемый подлист в EAX и информацию о функциях AVX10 в EBX. [82] (ECX и EDX зарезервированы.)

EAX=80000000h: получить максимальную реализованную расширенную функцию

В EAX возвращается самый высокий вызывающий параметр.

EBX/ECX/EDX возвращают строку идентификатора производителя (такую ​​же, как EAX=0) на процессорах AMD, но не на процессорах Intel.

EAX=80000001h: расширенная информация о процессоре и биты функций.

Это возвращает флаги расширенных функций в EDX и ECX.

Многие из битов EDX(биты с 0 по 9, с 12 по 17, 23 и 24) являются дубликатами EDXлиста EAX=1— эти биты выделены светло-желтым цветом. (Эти дублированные биты присутствуют в процессорах AMD, но не в процессорах Intel.)

Флаги функций AMD следующие: [86] [87]

  1. ^ Использование бита 10 EDX для указания поддержки SYSCALL/ SYSRETдопустимо только для процессоров AuthenticAMD семейства 5 Model 7 ( AMD K6 , 250 нм «Little Foot») — для всех остальных процессоров вместо этого следует использовать бит 11 EDX.

    Эти инструкции были впервые представлены в модели 7 [88] — бит CPUID, обозначающий их поддержку, был перенесен [89] в бит 11 EDX, начиная с модели 8 ( AMD K6-2 ).

  2. ^ В процессорах Intel бит CPUID для SYSCALL/ SYSRETустанавливается только в том случае, если CPUIDинструкция выполняется в 64-битном режиме. [90]
  3. ^ ab На некоторых процессорах — Cyrix MediaGXm , [92] нескольких Geodes (NatSemi Geode GXm, GXLV, GX1; AMD Geode GX1 [93] ) и Transmeta Crusoe [94] — биты 16 и 24 EDX имеют разное значение:
    • Бит 16: поддерживается условное перемещение с плавающей запятой ( FCMOV).
    • Бит 24: поддерживаются расширенные инструкции MMX 6x86MX.
  4. ^ Бит 19 EDX используется для идентификации бренда ЦП только на процессорах AuthenticAMD семейства 6 - этот бит в сочетании с сигнатурой процессора и скоростью FSB используется для идентификации процессоров как многопроцессорных или имеющих торговую марку Sempron . [95]
  5. ^ Бит 25 ECX указан как StreamPerfMon только в версии 3.20 AMD APM [97] — в более поздних версиях он указан как зарезервированный. Бит установлен только на процессорах Excavator и Steamroller.

EAX=80000002h,80000003h,80000004h: строка бренда процессора.

Они возвращают строку бренда процессора в EAX, EBX, ECX и EDX. CPUIDдолжен вводиться с каждым параметром последовательно, чтобы получить всю 48-байтовую строку торговой марки процессора ASCII. [98] Необходимо проверить, присутствует ли эта функция в ЦП, выдав сначала CPUIDкоманду EAX = 80000000hи проверив, не меньше ли возвращаемое значение 80000004h.

В документации Intel/AMD строка указана как завершающаяся нулем , однако это не всегда так (например, DM&P Vortex86DX3 и AMD Ryzen 7 6800HS, как известно, возвращают строки бренда, не заканчивающиеся нулем, в листьях 80000002h- 80000004h[99] [100 ] ] ), и программное обеспечение не должно полагаться на него.

#include <stdio.h> #include <string.h> #include <cpuid.h>   int main () { unsigned int regs [ 12 ]; char str [ sizeof ( regs ) + 1 ];       __cpuid ( 0x80000000 , regs [ 0 ], regs [ 1 ], regs [ 2 ], regs [ 3 ]);     if ( regs [ 0 ] < 0x80000004 ) возвращает 1 ;      __cpuid ( 0x80000002 , regs [ 0 ], regs [ 1 ], regs [ 2 ], regs [ 3 ]); __cpuid ( 0x80000003 , regs [ 4 ], regs [ 5 ], regs [ 6 ], regs [ 7 ]); __cpuid ( 0x80000004 , regs [ 8 ], regs [ 9 ], regs [ 10 ], regs [ 11 ]);               memcpy ( str , regs , sizeof ( regs )); str [ sizeof ( regs )] = '\0' ; printf ( "%s \n " , str );        вернуть 0 ; } 

EAX=80000005h: идентификаторы кэша L1 и TLB.

Эта функция содержит характеристики кэша L1 процессора и TLB.

EAX=80000006h: Расширенные функции кэша L2.

Возвращает сведения о кэше L2 в ECX, включая размер строки в байтах (биты 07–00), тип ассоциативности (кодируется 4-битным полем; биты 15–12) и размер кэша в КБ (биты 31–16). .

#include <stdio.h> #include <cpuid.h>  int main () { unsigned int eax , ebx , ecx , edx ; беззнаковый int lsize , assoc , кэш ;             __cpuid ( 0x80000006 , eax , ebx , ecx , edx ); lsize = ecx & 0xff ; assoc = ( ecx >> 12 ) & 0x07 ; кэш = ( ecx >> 16 ) & 0xffff ;                         printf ( "Размер строки: %d B, Тип ассоциированного объекта: %d, Размер кэша: %d КБ. \n " , lsize , ассоциированный , кэш );    вернуть 0 ; } 

EAX=80000007h: информация об управлении питанием процессора и возможностях RAS.

Эта функция предоставляет информацию об управлении питанием, отчетах о питании и возможностях RAS ( надежность, доступность и удобство обслуживания ) ЦП.

EAX=80000008h: Размеры виртуального и физического адреса.

  1. ^ Функция LMSLE (включение ограничения сегмента в длинном режиме) не имеет собственного флага CPUID и обнаруживается путем проверки семейства и модели ЦП. Он был представлен в процессорах AuthenticAMDсемейства 0Fh Model 14h [104] (90-нм Athlon64/Opteron) и присутствует во всех более поздних процессорах AMD, за исключением тех, у которых установлен флаг no_efer_lmsle.
  2. ^ Значение 0 указывает, что «Размер физического адреса гостя» такой же, как «Количество битов физического адреса», указанное в EAX[7:0].

EAX=8000000Ah: функции безопасной виртуальной машины.

Этот лист возвращает информацию о функциях AMD SVM ( безопасной виртуальной машины ) в EAX, EBX и EDX.

  1. ^ В ранних версиях документации AMD «Pacifica» бит 8 EAX указан как всегда нулевой бит, зарезервированный для использования гипервизором. [106]

    В более поздней документации AMD, такой как #25481 «Спецификация CPUID» версии 2.18 [107] и более поздних, этот бит указан только как зарезервированный.

    В версии 2.30 [108] и более поздних версиях указан другой бит, зарезервированный для использования гипервизором: CPUID.(EAX=1):ECX[бит 31].

  2. ^ Бит 9 EDX кратко указан в некоторых старых версиях документа AMD № 25481 «Спецификация CPUID» и установлен только в некоторых процессорах AMD Bobcat . [109]

    В версии 2.28 № 25481 этот бит указан как «Ssse3Sse5Dis» [110] - в версии 2.34 он указан как удаленный из спецификации версии 2.32 под именем «SseIsa10Compat». [111]

EAX=8000001Fh: возможности зашифрованной памяти

EAX=80000021h: Идентификация расширенной функции 2

EAX=8FFFFFFFh: пасхальное яйцо AMD

Некоторые модели процессоров AMD для CPUID с EAX=8FFFFFFFhвозвращают строку пасхального яйца в EAX, EBX, ECX и EDX. [115] [116] Известные струны пасхальных яиц включают:

EAX=C0000000h: получить максимальную расширенную функцию Centaur

Возвращает индекс самого высокого листа Centaur в EAX. Если возвращаемое значение в EAX меньше C0000001h, то расширенные листья Centaur не поддерживаются.

Присутствует в процессорах VIA и Zhaoxin .

В процессорах IDT WinChip ( CentaurHaulsсемейство 5) расширенные листья C0000001h-C0000005hне кодируют какие-либо специфичные для Centaur функции, а вместо этого являются псевдонимами листьев 80000001h-80000005h. [118]

EAX=C0000001h: Информация о функциях Centaur

Этот лист возвращает информацию о функциях Centaur (в основном через PadLock ) в EDX. [119] [120] (EAX, EBX и ECX зарезервированы.)

  1. ^ abcd В процессорах VIA NehemiahCentaurHauls и Antaur ( только семейство 6, модель 9) [121] биты 0,1,4,5 используются по-другому:

Использование CPUID из языков высокого уровня

Линейная сборка

Эту информацию легко получить и на других языках. Например, приведенный ниже код C для gcc печатает первые пять значений, возвращаемых cpuid:

#include <stdio.h> #include <cpuid.h>  int main () { unsigned int i , eax , ebx , ecx , edx ;         for ( я знак равно 0 ; я < 5 ; я ++ ) { __cpuid ( я , eax , ebx , ecx , edx ); printf ( "InfoType %x \n EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , i , eax , ebx , ecx , edx ); }                      вернуть 0 ; } 

В встроенной ассемблерной сборке MSVC и Borland/Embarcadero C (bcc32) информация о затирании неявно содержится в инструкциях:

#include <stdio.h> int main () { unsigned int a , b , c , d , я знак равно 0 ;           __asm ​​{ /* Выполняем вызов. */ mov EAX , я ; идентификатор процессора ; /* Сохраняем результаты. */ mov a , EAX ; мов б , EBX ; мов с , ECX ; мов д , EDX ; }                     printf ( "InfoType %x \n EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , i , a , b , c , d ); вернуть 0 ; }        

Если какая-либо версия была написана на простом языке ассемблера, программист должен вручную сохранить результаты EAX, EBX, ECX и EDX в другом месте, если он хочет продолжать использовать значения.

Функции-обертки

GCC также предоставляет заголовок, вызываемый <cpuid.h>в системах с CPUID. Это __cpuidмакрос, расширяемый до встроенной сборки. Типичное использование будет:

#include <stdio.h> #include <cpuid.h>  int main () { unsigned int eax , ebx , ecx , edx ;        __cpuid ( 0 /* строка поставщика */ , eax , ebx , ecx , edx ); printf ( "EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , eax , ebx , ecx , edx );           вернуть 0 ; } 

Но если кто-то запросит расширенную функцию, отсутствующую в этом процессоре, он этого не заметит и может получить случайные, неожиданные результаты. Более безопасная версия также доступна в формате <cpuid.h>. Он проверяет наличие расширенных функций и выполняет еще несколько проверок безопасности. Выходные значения передаются не с использованием параметров макроса, подобных ссылкам, а с использованием более традиционных указателей.

#include <stdio.h> #include <cpuid.h>  int main () { unsigned int eax , ebx , ecx , edx ;        /* 0x81234567 не существует, но предположим, что он существует */ if ( ! __get_cpuid ( 0x81234567 , & eax , & ebx , & ecx , & edx )) { printf ( "Внимание: запрос CPUID 0x81234567 недействителен! \n " ); вернуть 1 ; }             printf ( "EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , eax , ebx , ecx , edx );     вернуть 0 ; } 

Обратите внимание на амперсанды &a, &b, &c, &dи условный оператор. Если __get_cpuidвызов получит правильный запрос, он вернет ненулевое значение, в случае неудачи — ноль. [122]

Компилятор Microsoft Visual C имеет встроенную функцию __cpuid(), поэтому инструкцию cpuid можно внедрить без использования встроенной ассемблера, что удобно, поскольку версия MSVC x86-64 вообще не поддерживает встроенную ассемблерную сборку. Та же программа для MSVC будет:

#include <stdio.h> #ifdef __MSVC__ #include <intrin.h> #endif   int main () { unsigned int regs [ 4 ]; интервал я ;       for ( я знак равно 0 ; я < 4 ; я ++ ) { __cpuid ( regs , я ); printf ( "Код %d дает %d, %d, %d, %d" , regs [ 0 ], regs [ 1 ], regs [ 2 ], regs [ 3 ]); }                 вернуть 0 ; } 

Многие интерпретируемые или скомпилированные языки сценариев способны использовать CPUID через библиотеку FFI . Одна из таких реализаций демонстрирует использование модуля Ruby FFI для выполнения языка ассемблера, который включает код операции CPUID.

.NET 5 и более поздние версии предоставляют этот System.Runtime.Intrinsics.X86.X86base.CpuIdметод. Например, приведенный ниже код C# выводит марку процессора, если он поддерживает инструкцию CPUID:

используя System.Runtime.InteropServices ; используя System.Runtime.Intrinsics.X86 ; используя System.Text ;   пространство имен X86CPUID { класс CPUBrandString { public static void Main ( строка [] args ) { if ( ! X86Base . IsSupported ) { Console . WriteLine ( "Ваш процессор не поддерживает инструкцию CPUID." ); } else { Span <int> raw = stackalloc int [ 12 ] ;( сырой [ 0 ], необработанный [ 1 ], необработанный [ 2 ], необработанный [ 3 ]) = X86Base . CpuId ( не проверено (( int ) 0 x80000002 ), 0 ); ( сырой [ 4 ], необработанный [ 5 ], необработанный [ 6 ], необработанный [ 7 ]) = X86Base . CpuId ( не проверено (( int ) 0 x80000003 ), 0 ); ( сырой [ 8 ], необработанный [ 9 ], необработанный [ 10 ], необработанный [ 11 ]) = X86Base . CpuId ( не проверено (( int ) 0 x80000004 ), 0 );                                             Span < байт > байт = MemoryMarshal . AsBytes ( необработанный ); строка бренда = Кодировка . UTF8 . GetString ( байты ). Подрезать (); Консоль . WriteLine ( торговая марка ); } } } }           

Информация, специфичная для процессора, за пределами x86

Некоторые архитектуры ЦП, отличные от x86, также предоставляют определенные формы структурированной информации о возможностях процессора, обычно в виде набора специальных регистров:

Семейства DSP и транспьютерных микросхем не восприняли эту инструкцию каким-либо заметным образом, несмотря на (в относительном выражении) столько же вариаций конструкции. Могут существовать альтернативные способы идентификации кремния; например, DSP от Texas Instruments содержат набор регистров в памяти для каждого функционального блока, который начинается с идентификаторов, определяющих тип и модель блока, версию его конструкции ASIC и функции, выбранные на этапе проектирования, и продолжается контролем и данными для конкретного блока. регистры. Доступ к этим областям осуществляется простым использованием существующих инструкций загрузки и сохранения; таким образом, для таких устройств нет необходимости расширять набор регистров для целей идентификации устройства. [ нужна цитата ]

Смотрите также

Рекомендации

  1. ^ «Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32» (PDF) . Intel.com . Проверено 11 апреля 2013 г.
  2. ^ «Обнаружение процессоров Intel — знание поколения системного процессора» . Rcollins.org . Проверено 11 апреля 2013 г.
  3. ^ "LXR linux-old/arch/i386/kernel/head.S" . Lxr.linux.no. Архивировано из оригинала 13 июля 2012 г. Проверено 11 апреля 2013 г.
  4. ^ «CPUID, EAX=4 — Странные результаты (решено)» . Software.intel.com . Проверено 10 июля 2014 г.
  5. ^ @InstLatX64 (28 февраля 2019 г.). «Первое знакомство с «GenuineIotel» (o после I вместо n)» ( твит ) – через Twitter .
  6. ^ instlatx64, дамп CPUID для RDC IAD 100. Проверено 22 декабря 2022 г.
  7. ^ abcd smxi, Inxi, выпуск 197: Данные и реализация поддержки ЦП «Эльбрус». Проверено 23 октября 2023 года. Архивировано 23 октября 2023 года.
  8. ^ sorgelig (3 августа 2017 г.). «Инструкция ao486 CPUID (в коммите 43a2004)». Гитхаб . Архивировано из оригинала 04 декабря 2023 г. Проверено 4 декабря 2023 г.
  9. ↑ ab sorgelig (30 августа 2020 г.). «Обновить идентификатор процессора. · MiSTer-devel/ao486_MiSTer@82f5014». Гитхаб . Архивировано из оригинала 04 декабря 2023 г. Проверено 4 декабря 2023 г.
  10. ^ Зоргелиг (30 августа 2020 г.). «Инструкция ao486 CPUID». Гитхаб . Архивировано из оригинала 23 октября 2023 года . Проверено 4 декабря 2023 г.
  11. ^ «v586: 586-совместимое программное ядро ​​для FPGA» . Гитхаб . 6 декабря 2021 г.
  12. ^ «Опрос оборудования и программного обеспечения Steam». store.steampowered.com . Проверено 26 июля 2022 г.
  13. ^ «Развлечение с таймерами и процессором - Джим Кауни - Развлечение с процессором» . 3 марта 2021 г.
  14. ^ iXBT Labs, VIA Nano CPUID Tricks, 26 августа 2010 г. Архивировано 29 августа 2010 г.
  15. ^ IDT, Техническое описание WinChip 2A, версия 1.0, январь 1999 г., страница A-3.
  16. ^ VIA, Таблица данных C3 Nehemiah, версия 1.13, 29 сентября 2004 г., страница A-3.
  17. ^ Агнер Фог, CpuIDFake, v1.00, 22 января 2010 г., см. «Instructions.txt». Архивировано 9 июля 2010 г.
  18. ^ Transmeta, Руководство программиста Crusoe BIOS, 23 января 2004 г., стр. 65.
  19. ^ AMD, Книга данных Geode LX, pub.id. 33234H, февраль 2009 г., стр. 107. Архивировано 3 декабря 2023 г.
  20. ^ DM&P, Vortex86EX2_A9133_Master_Data_Sheet_V11_BF, 8 мая 2019 г., стр. 72.
  21. ^ «Справочник по набору команд главы 3, AL» (PDF) . Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 . Корпорация Интел. 20 декабря 2018 г. Проверено 20 декабря 2018 г.
  22. ^ Intel, Руководство разработчика семейства процессоров Pentium, 1997 г., номер заказа. 241428-005, разделы 3.4.1.2 (стр. 91), 17.5.1 (стр. 489) и приложение А (стр. 522) содержат более подробную информацию о том, как работают поле «тип процессора» и обозначение «двухпроцессорный».
  23. ^ InstLatx64, x86, x64 Задержка инструкций, задержка памяти и дампы CPUID, 30 сентября 2023 г.
  24. ^ AMD, Улучшенное семейство микропроцессоров Am486DX, pub.no. 20736 ред. B, март 1997 г., раздел 9.2.2, стр. 55. Архивировано 18 октября 2023 г.
  25. ^ Руководство пользователя микроконтроллеров AMD, ÉlanSC400 и ÉlanSC410, pub.no. 21030, 1997, раздел 3.6.2, стр. 73. Архивировано 18 октября 2023 года.
  26. ^ Cyrix, Руководство для разработчиков BIOS 5x86, версия 1.12, номер заказа. 92426-00, 1995 г., стр. 7.
  27. ^ ab Cyrix, Руководство по обнаружению ЦП, версия 1.01, 2 октября 1997 г., стр. 6.
  28. ^ ab Дебби Уайлс, Идентификация процессора, архивировано 4 июня 2006 г.
  29. ^ Исходный код MiSTer ao486, rtl/ao486/defines.v, строка 70. Архивировано 23 октября 2023 г.
  30. ^ CPU-World, CPUID для Vortex86DX2 933 МГц. Архивировано 17 октября 2023 г.
  31. ^ CPU-World, CPUID для Vortex86EX2. Архивировано 18 октября 2023 г.
  32. ^ InstLatx64, дамп CPUID Centaur CNS. Архивировано 30 мая 2023 года.
  33. ^ Джефф Этвуд, Nasty Software Hacks и CPUID Intel. Кодирующий ужас , 16 августа 2005 г.
  34. ^ Intel, Справочное руководство по архитектуре набора инструкций сопроцессора Intel Xeon Phi, сентябрь 2012 г., номер заказа. 327364-001, приложение B.8, стр. 673. Архивировано 4 августа 2021 г.
  35. ^ CPU-World, CPUID для Intel Itanium 2 1,50 ГГц. Архивировано 17 октября 2023 г.
  36. ^ http://bochs.sourceforge.net/techspec/24161821.pdf [ пустой URL-адрес PDF ]
  37. ^ Исходники ядра Linux 6.3, /arch/x86/include/asm/cpuid.h, строка 69.
  38. ^ Список рассылки gcc-patches, Исправление CPUID для IDT Winchip, 21 мая 2019 г.
  39. ^ Джефф Чаппелл, Поддержка CMPXCHG8B в 32-битном ядре Windows, 23 января 2008 г. Архивировано 30 января 2023 г.
  40. ^ AMD, Рекомендации по применению распознавания процессоров AMD, публикация № 20734, ред. D, январь 1997 г., стр. 13.
  41. ^ Intel, Примечание по применению AP-485 — Идентификация процессора Intel и инструкция CPUID, номер заказа. 241618-006, март 1997 г., таблица 5 на стр. 10, см. бит 10.
  42. Михал Некасек, SYSENTER, Где ты?, Музей OS/2 , 20 июля 2017 г.
  43. ^ Джефф Чаппелл, ECX Из CPUID Leaf 1, 26 января 2020 г. Архивировано 9 мая 2020 г.
  44. ^ Хуггахалли, Рам; Айер, Рави; Тетрик, Скотт (2005). «Прямой доступ к кэшу для высокоскоростного сетевого ввода-вывода». Новости компьютерной архитектуры ACM SIGARCH . 33 (2): 50–59. CiteSeerX 10.1.1.85.3862 . дои : 10.1145/1080695.1069976. CiteSeerX : 10.1.1.91.957 . 
  45. ^ Дреппер, Ульрих (2007), Что каждый программист должен знать о памяти , CiteSeerX : 10.1.1.91.957
  46. ^ ab Intel, Руководство разработчика программного обеспечения для архитектуры Itanium, версия 2.3, том 4: Набор инструкций IA-32, май 2010 г., номер документа: 323208, таблица 2-5, страница 4:81, см. биты 20 и 30. Архивировано 15 февраля. , 2012.
  47. ^ Intel, AP-485, Идентификация процессора и флаг инструкции CPUID, версия 30, январь 2006 г., стр. 26
  48. Михал Некасек, HTT означает гиперпоточность, верно?, Музей OS/2 , 11 декабря 2017 г.
  49. ^ «Механизмы определения того, работает ли программное обеспечение на виртуальной машине VMware». База знаний VMware . ВМВаре . 01.05.2015. Процессоры Intel и AMD зарезервировали бит 31 ECX листа CPUID 0x1 в качестве бита присутствия гипервизора. Этот бит позволяет гипервизорам сообщать о своем присутствии гостевой операционной системе. Гипервизоры устанавливают этот бит, а физические процессоры (все существующие и будущие процессоры) устанавливают этот бит в ноль. Гостевые операционные системы могут проверять бит 31, чтобы определить, работают ли они внутри виртуальной машины.
  50. ^ Катария, Алок; Хехт, Дэн (1 октября 2008 г.). «Предложение по интерфейсу CPUID гипервизора». Архив LKML на lore.kernel.org. Архивировано из оригинала 15 марта 2019 г. Бит 31 ECX листа CPUID 0x1. Этот бит зарезервирован Intel и AMD для использования гипервизорами и указывает на наличие гипервизора. Виртуальные процессоры (гипервизоры) устанавливают этот бит в 1, а физические процессоры (все существующие и будущие процессоры) устанавливают этот бит в ноль. Этот бит может быть проверен гостевым программным обеспечением, чтобы определить, работают ли они внутри виртуальной машины.
  51. ^ «Технология AMD64. Руководство программиста по архитектуре AMD64, том 2: Системное программирование» (PDF) (изд. 3.41). Advanced Micro Devices, Inc. с. 498. 24593. Архивировано из оригинала (PDF) 30 сентября 2023 года . Проверено 9 сентября 2023 г. 15.2.2 Гостевой режим. Вход в этот новый режим процессора осуществляется с помощью инструкции VMRUN. В гостевом режиме поведение некоторых инструкций x86 меняется для облегчения виртуализации. Номера функций CPUID 4000_0000h-4000_00FFh зарезервированы для использования программным обеспечением. Гипервизоры могут использовать эти номера функций для предоставления интерфейса для передачи информации от гипервизора гостю. Это похоже на извлечение информации о физическом процессоре с помощью CPUID. Гипервизоры используют бит CPUID Fn 400000[FF:00] для обозначения виртуальной платформы. Бит функции CPUID Fn0000_0001_ECX[31] зарезервирован для использования гипервизорами для обозначения присутствия гипервизора. Гипервизоры устанавливают этот бит в 1, а физические процессоры устанавливают этот бит в ноль. Этот бит может быть проверен гостевым программным обеспечением, чтобы определить, работают ли они внутри виртуальной машины.
  52. ^ Intel, Справочное руководство по процессорам Itanium для разработки программного обеспечения, версия 2.0, номер заказа. 245320-003, декабрь 2001 г., стр. 110. Архивировано из оригинала 18 февраля 2004 г.
  53. ^ Intel, Идентификация процессора и инструкция по применению CPUID, примечание 485, номер заказа. 241618-036, август 2009 г., стр. 26. Архивировано 6 октября 2023 г.
  54. ^ InstLatX64, дамп CPUID Willamette-128. Архивировано 7 декабря 2019 года.
  55. ^ InstlatX64, дамп CPUID Intel Atom 230. Архивировано 7 декабря 2019 года.
  56. ^ WikiChip, Боннелл. Архивировано 16 июля 2017 года.
  57. ^ Cyrix, Руководство по обнаружению ЦП Cyrix, версия 1.01, 2 октября 1997 г., стр. 13.
  58. ^ Intel, Идентификация процессора и инструкция по применению CPUID, примечание 485, номер заказа. 241618-037, январь 2011 г., стр. 32. Архивировано 17 октября 2023 г.
  59. ^ Джефф Чаппелл, CPUID Leaf 2, 26 января 2020 г. Архивировано 4 сентября 2023 г.
  60. ^ Intel, Справочное руководство по процессорам Itanium 2, номер заказа. 251110-003, май 2004 г., стр. 192. Архивировано из оригинала 7 декабря 2006 г.
  61. ^ Intel, Обновление спецификации процессора Itanium 2, номер заказа. 251141-028, ноябрь 2004 г., ошибка 6 на странице 26. Архивировано из оригинала 25 ноября 2004 г.
  62. ^ Intel, Обновление спецификаций семейства процессоров Atom C3000, номер заказа. 336345-020, стр. 16, март 2023 г. Архивировано 7 октября 2023 г.
  63. ^ Intel, Техническое описание процессора Xeon серии 7500, номер заказа. 323341-001, март 2010 г., стр. 150. Архивировано 8 октября 2023 г.
  64. ↑ Аб Ши Куо (27 января 2012 г.). «Перечисление топологии процессора архитектуры Intel 64».
  65. ^ «Перечисление процессоров и ядер с использованием CPUID | AMD» . Разработчик.amd.com. Архивировано из оригинала 14 июля 2014 г. Проверено 10 июля 2014 г.
  66. ^ «Процессоры Sandybridge сообщают неверный номер ядра?». Программное обеспечение.intel.com. 29 декабря 2012 г. Проверено 10 июля 2014 г.
  67. ^ "ЦП, __cpuidex". Msdn.microsoft.com. 20 июня 2014 г. Проверено 10 июля 2014 г.
  68. ^ «Архитектура x86 — CPUID» . сайт sandpile.org . Проверено 10 июля 2014 г.
  69. ^ «topology.cpp в ps/trunk/source/lib/sysdep/arch/x86_x64 – Wildfire Games». Trac.wildfiregames.com. 27 декабря 2011 г. Архивировано из оригинала 09 марта 2021 г. Проверено 10 июля 2014 г.
  70. ^ Технология Hyper-Threading и обнаружение многоядерных процессоров
  71. ^ Intel, Идентификация процессора Intel и инструкция CPUID (AP-485, версия 30), номер заказа. 241618-030, январь 2006 г., стр. 19.
  72. ^ Руководство разработчика программного обеспечения для архитектуры Intel, Intel 64 и IA-32, номер заказа. 352462-079, том 3Б, раздел 15.4.4.4, стр. 3503
  73. ^ Intel, Идентификация процессора и инструкция CPUID, номер заказа. 241618-038, апр 2012, стр.38
  74. ^ Intel, Уведомление об изменении продукта 108701, 1 августа 2008 г. Архивировано 11 мая 2023 г.
  75. ^ Intel, Инструкция PCOMMIT устарела, 12 сентября 2016 г. Архивировано 23 апреля 2023 г.
  76. ^ Intel, Спецификация архитектуры AVX512-FP16 (PDF), номер документа 347407-001, июнь 2021 г. Архивировано 26 октября 2022 г.
  77. ^ abcd «Средства по снижению побочных каналов спекулятивного исполнения» (PDF) . Версия 2.0. Интел . Май 2018 г. [январь 2018 г.]. Номер документа: 336996-002 . Проверено 26 мая 2018 г.
  78. ^ "Серия патчей IBRS [LWN.net]" .
  79. ^ abc Intel, Спецификация гибкого возврата и доставки событий (FRED), версия 6.1, декабрь 2023 г., номер заказа. 346446-007, стр. 14. Архивировано 22 декабря 2023 г.
  80. ^ Intel, Руководство разработчика программного обеспечения, номер заказа. 325462-080, июнь 2023 г. — информация о преждевременно занятых теневых стеках представлена ​​в томе 1, раздел 17.2.3 на стр. 410; Том 2А, таблица 3.8 (CPUID EAX=7,ECX=2) на стр. 820; Том 3C, таблица 25–14 на стр. 3958 и раздел 26.4.3 на стр. 3984.
  81. ^ LKML, Re: (PATCH v3 00/21) Включить виртуализацию CET, 16 июня 2023 г. - содержит дополнительное обсуждение того, как проблема преждевременной занятости стека CET-SSS взаимодействует с виртуализацией.
  82. ^ ab Intel, Advanced Vector Extensions 10, версия 1.0, июль 2023 г., номер заказа. 355989-001. Архивировано 24 июля 2023 г.
  83. ^ ab Intel, Advanced Performance Extensions — Спецификация архитектуры, версия 2.0, август 2023 г., номер заказа. 355828-002, стр. 37. Архивировано 10 сентября 2023 г.
  84. ^ abc Intel, Внедрение истории ветвей и внедрение целевой ветки внутри режима / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598, 4 августа 2022 г. Архивировано 5 мая 2023 г.
  85. ^ Intel, Недополнение буфера стека возврата / CVE-2022-29901, CVE-2022-28693 / INTEL-SA-00702, 12 июля 2022 г. Архивировано 13 июля 2022 г.
  86. ^ Спецификация CPUID, публикация № 25481, версия 2.34 (PDF) , AMD , сентябрь 2010 г., заархивировано из оригинала (PDF) 18 августа 2022 г.
  87. ^ Исходный код ядра Linux
  88. ^ AMD, Лист данных процессора AMD-K6, номер заказа. 20695H/0, март 1998 г., раздел 24.2, стр. 283
  89. ^ AMD, Руководство по версии процессора AMD-K6, номер для заказа. 21846H/0, июнь 1999 г., раздел 3.2.1, стр. 17
  90. ^ Руководство разработчика программного обеспечения для архитектур Intel, Intel 64 и IA-32, номер заказа. 325462-079, март 2023 г., таблица 3-8 на стр. 3-238.
  91. ^ Спецификация облегченного профилирования (PDF) , AMD , август 2010 г., заархивировано из оригинала (PDF) 27 ноября 2012 г. , получено 3 апреля 2013 г.
  92. ^ Cyrix, Руководство по обнаружению ЦП Cyrix, версия 1.01, 2 октября 1997 г., стр. 12
  93. ^ AMD, Справочник процессоров Geode GX1, версия 5.0, декабрь 2003 г., страницы 202 и 226. Архивировано 20 апреля 2020 г.
  94. ^ Transmeta, Распознавание процессоров, 7 мая 2002 г., стр. 5
  95. ^ AMD, Примечание по приложению распознавания процессоров, pub.no. 20734, ред. 3.13, декабрь 2005 г. Раздел 2.2.2 (стр. 20) и Раздел 3 (стр. 33–40) содержат подробную информацию о том, как следует использовать CPUID.(EAX=8000_0001):EDX[бит 19] для идентификации процессоров. Архивировано из оригинала 26 июня 2006 г.
  96. ^ AMD, Семья 10h BKDG, документ №. 31116, ред. 3.62, 11 янв. 2013 г., с. 388 — перечисляет бит NodeId. Архивировано 16 января 2019 года.
  97. ^ AMD, Руководство программиста по архитектуре AMD64, том 3, паб. нет. 24594, ред. 3.20, май 2013 г., стр. 579 — указан бит StreamPerfMon.
  98. ^ «Идентификация процессора Intel и инструкция CPUID» (PDF) . Скачать.intel.com. 06 марта 2012 г. Проверено 11 апреля 2013 г.
  99. ^ InstLatx64, дамп CPUID Vortex86DX3, 27 сентября 2021 г. Архивировано 21 октября 2021 г.
  100. ^ InstLatx64, дамп CPUID AMD Ryzen 7 6800HS, 21 февраля 2022 г. Архивировано 24 марта 2023 г.
  101. ^ AMD, BKDG для процессоров семейства AMD 10h, pub.no. 31116, ред. 3.62, 11 января 2013 г., страница 392. Архивировано 16 января 2019 г.
  102. ^ AMD, PPR для процессоров семейства AMD 19h Model 61h rev B1, pub.no. 56713, ред. 3.05, 8 марта 2023 г., страница 99. Архивировано 25 апреля 2023 г.
  103. ^ AMD, BKDG для процессоров семейства AMD 16h, модели 00-0Fh, pub.no. 48571, ред. 3.03, 19 февраля 2015 г., страница 482. Архивировано 16 января 2019 г.
  104. ^ Руководство разработчика AMD, BIOS и ядра для процессоров AMD Athlon 64 и AMD Opteron, публикация № 26094, версия 3.30, февраль 2006 г., страницы 29–30 (перечислены различия версий Athlon 64, включая LMSLE) (архивировано 16 января 2019 г.) и Руководство по версиям процессоров AMD Athlon 64 и AMD Opteron, публикация № 25759, версия 3.79, июль 2009 г., страницы 7–8 (перечислены идентификаторы версий Athlon 64) (архивировано 18 января 2019 г.).
  105. ^ AMD, PPR для процессоров семейства AMD 19h, модель 01h, редакция B1, том 1 из 2, номер документа. 55898, ред. 0.50, 27 мая 2021 г., стр. 98 — указан бит выборки ветвей. Архивировано 24 июля 2022 г.
  106. ^ AMD, технология виртуализации AMD64 под кодовым названием «Pacifica», публикация №. 33047, ред. 3.01, май 2005 г., приложение B, стр. 81. Архивировано 13 июня 2011 г.
  107. ^ AMD, спецификация CPUID, публикация № 25481, версия 2.18, январь 2006 г., стр. 18.
  108. ^ AMD, спецификация CPUID, публикация № 25481, версия 2.34, сентябрь 2010 г., страницы 5 и 11.
  109. ^ Instlatx64, дамп CPUID AMD E-350 - установлен CPUID.(EAX=8000000A):EDX[9].
  110. ^ AMD, спецификация CPUID, публикация № 25481, версия 2.28, апрель 2008 г., стр. 21.
  111. ^ AMD, спецификация CPUID, публикация № 25481, версия 2.34, сентябрь 2010 г., стр. 5 - указано, что «SseIsa10Compat» исключено в ноябре 2009 г.
  112. ^ ab AMD, PPR для процессоров семейства AMD 19h, модель 61h, ревизия B1, номер документа. 56713, ред. 3.05, 8 марта 2023 г., страница 102. Архивировано 25 апреля 2023 г.
  113. ^ AMD, Сервисный модуль безопасной виртуальной машины для гостей SEV-SNP, pub.no # 58019, версия 1.00, июль 2023 г., стр. 13. Архивировано 5 августа 2023 г.
  114. ^ AMD, PPR для процессоров семейства AMD 19h, модель 61h, ревизия B1, номер документа. 56713, ред. 3.05, 8 марта 2023 г., страница 116. Архивировано 25 апреля 2023 г.
  115. ^ Ферри, Питер. «Атаки на эмуляторы виртуальных машин» (PDF) . symantec.com . Расширенное исследование угроз Symantec. Архивировано из оригинала (PDF) 7 февраля 2007 г. Проверено 15 марта 2017 г.
  116. ^ Sandpile, CPUID архитектуры x86. Проверено 22 декабря 2022 г.
  117. ^ instlatx64, дамп CPUID AMD A4-5000, содержит строку «HELLO KITTY» для листа CPUID 8FFFFFFFh. Проверено 22 декабря 2022 г.
  118. ^ IDT, Лист данных процессора WinChip 2B, версия 0.9, апрель 1999 г., глава 3.3.3, стр. 31.
  119. ^ VIA, Руководство по программированию PadLock, ред. 1.66, 4 августа 2005 г., страница 5. Архивировано из оригинала 26 мая 2010 г.
  120. ^ Исходники ядра OpenEuler 1.0 LTS, /arch/x86/include/asm/cpufeatures.h, строки 147–178. Архивировано 30 июля 2023 г.
  121. ^ VIA, Техническое описание процессора C3 Nehemiah, версия 1.13, 29 сентября 2004 г., стр. 21
  122. ^ "GCC-зеркало/GCC" . Гитхаб . 13 марта 2022 г.
  123. ^ «Информационный центр АРМ». Infocenter.arm.com . Проверено 11 апреля 2013 г.
  124. ^ «Коды версий процессора и константы SRM» . Архивировано из оригинала 8 сентября 2014 г. Проверено 8 сентября 2014 г.
  125. ^ ab «Техническое руководство IBM System z10 Enterprise Class» (PDF) .
  126. ^ «Архитектура MIPS32 для программистов, Том III: Архитектура привилегированных ресурсов MIPS32» (PDF) . MIPS Technologies, Inc. 12 марта 2001 г.
  127. ^ «Архитектура операционной среды PowerPC, книга III» (PDF) .

дальнейшее чтение

Внешние ссылки