Что означают флаги в / proc / cpuinfo?

212

Как я могу определить, есть ли у моего процессора особая функция? (64-битный набор команд, аппаратная виртуализация, криптографические ускорители и т. Д.) Я знаю, что файл /proc/cpuinfoсодержит эту информацию в flagsстроке, но что означают все эти загадочные сокращения?

Например, учитывая следующее извлечение из /proc/cpuinfo, у меня есть 64-битный процессор? Есть ли у меня аппаратная виртуализация?

model name      : Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz
…
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 lahf_lm tpr_shadow vnmi flexpriority
жилль
источник

Ответы:

275

x86

(32-разрядный, он же i386 – i686 и 64-разрядный, он же amd64. Другими словами, ваша рабочая станция, ноутбук или сервер.)

FAQ: есть ли у меня ...

  • 64-разрядная (x86_64 / AMD64 / Intel64)? lm
  • Аппаратная виртуализация (VMX / AMD-V) vmx(Intel), svm(AMD)
  • Ускоренный AES (AES-NI)? aes
  • TXT (TPM)? smx
  • гипервизор (объявленный как таковой)? hypervisor

Большинство других функций представляют интерес только для авторов компилятора или ядра.

Все флаги

Полный список находится в исходном коде ядра, в файле arch/x86/include/asm/cpufeatures.h.

Определяемые Intel функции CPU, уровень CPUID 0x00000001 (edx)

См. Также Википедию и таблицу 2-27 в Справочнике по программированию расширенных векторных расширений Intel.

Определяемые AMD функции CPU, уровень CPUID 0x80000001

См. Также Википедию и таблицу 2-23 в Справочнике по программированию расширенных векторных расширений Intel.

Определяемые Transmeta функции CPU, уровень CPUID 0x80860001

  • recovery: Процессор в режиме восстановления
  • longrun: Управление мощностью Longrun
  • lrti: Интерфейс таблицы LongRun

Другие функции, отображение, определенное в Linux

  • cxmmx: Расширения Cyrix MMX
  • k6_mtrr: AMD K6 нестандартных MTRR
  • cyrix_arr: Cyrix ARR (= MTRR)
  • centaur_mcr: Кентавр MCR (= MTRR)
  • constant_tsc: TSC тикает с постоянной скоростью
  • up: Ядро SMP работает на UP
  • art: Всегда работающий таймер
  • arch_perfmon: Intel Architectural PerfMon
  • pebs: Выборка на основе точных событий
  • bts: Филиал Трасса Магазин
  • rep_good: rep микрокод работает хорошо
  • acc_power: Механизм накопления мощности AMD
  • nopl: Инструкции NOPL (0F 1F)
  • xtopology: расширения топологии процессора
  • tsc_reliable: TSC известен как надежный
  • nonstop_tsc: TSC не останавливается в состояниях C
  • cpuid: CPU имеет саму инструкцию CPUID
  • extd_apicid: имеет расширенный APICID (8 бит)
  • amd_dcm: многоузловой процессор
  • aperfmperf: APERFMPERF
  • eagerfpu: Не ленивое восстановление FPU
  • nonstop_tsc_s3: TSC не останавливается в состоянии S3
  • tsc_known_freq: TSC имеет известную частоту
  • mce_recovery: Процессор имеет восстанавливаемые машинные проверки

Определяемые Intel функции CPU, уровень CPUID 0x00000001 (ecx)

См. Также Википедию и таблицу 2-26 в Справочнике по программированию расширенных векторных расширений Intel.

Функции CPU, определяемые VIA / Cyrix / Centaur, уровень CPUID 0xC0000001

  • rng: Генератор случайных чисел присутствует (xstore)
  • rng_en: Генератор случайных чисел включен
  • ace: криптография на процессоре (xcrypt)
  • ace_en: шифрование на процессоре включено
  • ace2: Улучшенный криптографический движок v2
  • ace2_en: ACE v2 включен
  • phe: PadLock Hash Engine
  • phe_en: PHE включен
  • pmm: Мультипликатор PadLock Montgomery
  • pmm_en: PMM включен

Более расширенные флаги AMD: уровень CPUID 0x80000001, ecx

  • lahf_lm: Загрузка AH из флагов (LAHF) и сохранение AH во флаги (SAHF) в длинном режиме
  • cmp_legacy: Если да, HyperThreading не действителен
  • svm: «Безопасная виртуальная машина»: AMD-V
  • extapic: Расширенное пространство APIC
  • cr8_legacy: CR8 в 32-битном режиме
  • abm: Расширенное управление битами
  • sse4a: SSE-4A
  • misalignsse: указывает, генерируется ли исключение общей защиты (#GP), когда некоторые устаревшие инструкции SSE работают с невыровненными данными. Также зависит от CR0 и бита проверки выравнивания
  • 3dnowprefetch: Инструкции по предварительной загрузке 3DNow
  • osvw: указывает на видимый обходной путь ОС , который позволяет ОС работать с ошибками процессора.
  • ibs: Выборка на основе инструкций
  • xop: расширенные инструкции AVX
  • skinit: Инструкции SKINIT / STGI
  • wdt: Сторожевой таймер
  • lwp: Легковесное профилирование
  • fma4: 4 операнда MAC инструкции
  • tce: расширение кеша перевода
  • nodeid_msr: NodeId MSR
  • tbm: Манипулирование конечными битами
  • topoext: Расширения топологии Листья CPUID
  • perfctr_core: Расширения счетчика производительности ядра
  • perfctr_nb: Расширения счетчика производительности NB
  • bpext: расширение точки останова данных
  • ptsc: счетчик меток времени выполнения
  • perfctr_l2: Расширения счетчика производительности L2
  • mwaitx: MWAITрасширение ( MONITORX/ MWAITX)

Вспомогательные флаги: определено в Linux - для функций, разбросанных по различным уровням CPUID

  • ring3mwait: Ring 3 MONITOR / MWAIT
  • cpuid_fault: Intel CPUID неисправен
  • cpb: AMD Core Performance Boost
  • epb: Поддержка IA32_ENERGY_PERF_BIAS
  • cat_l3: Технология выделения кэша L3
  • cat_l2: Технология выделения кэша L2
  • cdp_l3: Код и приоритезация данных L3
  • invpcid_single: эффективно invpcidиCR4.PCIDE=1
  • hw_pstate: AMD HW-PState
  • proc_feedback: AMD ProcFeedbackInterface
  • sme: AMD Secure Memory Encryption
  • pti: Изоляция таблицы страниц ядра (Kaiser)
  • retpoline: Ослабление ретполина для варианта Spectre 2 (непрямые ветви)
  • retpoline_amd: AMD Ретполин смягчение
  • intel_ppin: Инвентарный номер процессора Intel
  • avx512_4vnniw: Инструкции по нейронной сети AVX-512
  • avx512_4fmaps: AVX-512 Multiply Accumulation с одинарной точностью
  • mba: Распределение пропускной способности памяти
  • rsb_ctxsw: Заполнить RSB при переключении контекста

Флаги виртуализации: Linux определен

  • tpr_shadow: Intel TPR Shadow
  • vnmi: Intel Virtual NMI
  • flexpriority: Intel FlexPriority
  • ept: Расширенная таблица страниц Intel
  • vpid: Идентификатор виртуального процессора Intel
  • vmmcall: Предпочитают , VMMCALLчтобыVMCALL

Определяемые Intel функции CPU, уровень CPUID 0x00000007: 0 (ebx)

Расширенные функции состояния, уровень CPUID 0x0000000d: 1 (eax)

  • xsaveopt: Оптимизировано XSAVE
  • xsavec: XSAVEC
  • xgetbv1: XGETBVс ECX = 1
  • xsaves: XSAVES/XRSTORS

Определяемый Intel дополнительный лист QoS ЦП, уровень CPUID 0x0000000F: 0 (edx)

  • cqm_llc: ООО QoS

Определяемый Intel дополнительный лист QoS ЦП, уровень CPUID 0x0000000F: 1 (edx)

  • cqm_occup_llc: Мониторинг занятости ООО
  • cqm_mbm_total: ООО тотальный мониторинг MBM
  • cqm_mbm_local: ООО Локальный МБМ мониторинг

Определяемые AMD функции CPU, уровень CPUID 0x80000008 (ebx)

  • clzero: CLZEROинструкция
  • irperf: инструкция удалилась счетчик производительности
  • xsaveerptr: Всегда сохранять / восстанавливать указатели ошибок FP

Лист управления температурой и питанием, уровень CPUID 0x00000006 (eax)

  • dtherm(ранее dts): цифровой термодатчик
  • ida: Intel Dynamic Acceleration
  • arat: Всегда работает таймер APIC
  • pln: Уведомление об ограничении мощности Intel
  • pts: Intel Package Thermal Status
  • hwp: Intel Hardware P-состояния
  • hwp_notify: Уведомление HWP
  • hwp_act_window: Окно Активности HWP
  • hwp_epp: Предпочтение энергоэффективности HWP
  • hwp_pkg_req: Запрос уровня пакета HWP

Идентификация функций AMD SVM, уровень CPUID 0x8000000a (edx)

  • npt: Поддержка AMD Nested Page Table
  • lbrv: Поддержка виртуализации AMD LBR
  • svm_lock: AMD SVM блокирует MSR
  • nrip_save: AMD SVM next_rip сохранить
  • tsc_scale: Поддержка масштабирования AMD TSC
  • vmcb_clean: Поддержка чистых битов AMD VMCB
  • flushbyasid: Поддержка AMD при помощи ASID
  • decodeassists: Поддержка AMD Decode Assists
  • pausefilter: AMD фильтрует перехват паузы
  • pfthreshold: Порог фильтра паузы AMD
  • avic: Виртуальный контроллер прерываний
  • vmsave_vmload: Виртуальный VMSAVE VMLOAD
  • vgif: Виртуальный GIF

Определяемые Intel функции процессора, уровень CPUID 0x00000007: 0 (ecx)

  • avx512vbmi: AVX512 Инструкции по управлению векторными битами
  • umip: Защита режима пользователя
  • pku: Ключи защиты для пространства пользователя
  • ospke: Ключи защиты ОС включены
  • avx512_vbmi2: Дополнительные инструкции по манипулированию векторным битом AVX512
  • gfni: Галуа Филд Новые инструкции
  • vaes: Вектор AES
  • vpclmulqdq: Двойное умножение без переноса
  • avx512_vnni: Векторные инструкции нейронной сети
  • avx512_bitalg: Инструкции VPOPCNT [B, W] и VPSHUF-BITQMB
  • avx512_vpopcntdq: POPCNT для векторов DW / QW
  • la57: 5-уровневые таблицы страниц
  • rdpid: Инструкция RDPID

Определяемые AMD функции CPU, уровень CPUID 0x80000007 (ebx)

  • overflow_recov: Поддержка восстановления при переполнении MCA
  • succor: исправление и исправление неисправимой ошибки
  • smca: Масштабируемая MCA

Обнаруженные ошибки процессора (определяется Linux)

  • f00f: Intel F00F
  • fdiv: CPU FDIV
  • coma: Cyrix 6x86 кома
  • amd_tlb_mmatch: tlb_mmatchAMD Erratum 383
  • amd_apic_c1e: apic_c1eAMD Erratum 400
  • 11ap: Плохой местный APIC aka 11AP
  • fxsave_leak: FXSAVE пропускает FOP / FIP / FOP
  • clflush_monitor: AAI65, CLFLUSH требуется до МОНИТОРА
  • sysret_ss_attrs: SYSRET не исправляет атрибуты SS
  • espfix: "" IRET для 16-битного SS повреждает старшие биты ESP / RSP
  • null_seg: Обнуление селектора сохраняет базу
  • swapgs_fence: SWAPGS без ввода депозита на GS
  • monitor: IPI требуется для пробуждения удаленного процессора
  • amd_e400: Процессор находится в числе пострадавших от Erratum 400
  • cpu_meltdown: CPU подвержен атаке распада и нуждается в изоляции таблицы страниц ядра
  • spectre_v1: ЦП зависит от Спектра варианта 1 атаки с условными переходами
  • spectre_v2: Процессор зависит от Спектра варианта 2 атаки с косвенными ветвями
  • spec_store_bypass: ЦП подвержен уязвимости спекулятивного обхода хранилища (вариант Spectre 4).

PS Этот список был получен из arch/x86/include/asm/cpufeatures.hисходного кода ядра. Флаги перечислены в том же порядке, что и исходный код. Помогите, добавив ссылки на описания функций, когда они отсутствуют, написав краткое описание функций с невыразительными именами и обновив список для новых версий ядра. Текущий список из Linux 4.15 плюс некоторые более поздние дополнения.

Жиль
источник
1
Спасибо @Gilles и редакторам за информативный вопрос и его обобщенный и подробный ответ. Теперь, чтобы проверить то , что возможности процессора, я использую следующие взяты из NixCraft, например , для процессоров Intel: $ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u. И есть также превосходный CLI / GUI i-nex .
tuk0z
Выдающаяся коллекция объяснений и ссылок; спасибо всем, кто внес свой вклад.
Пол Гир
Откуда появились данные об ошибках? Похоже, он не указан в файле cpufeatures.h.
Дразисил
@Drazisil Насколько я помню все записи из указанной версии cpufeatures.h. Описания отредактированы, чтобы сделать их более понятными и информативными, когда кто-то предпринял усилия, чтобы сделать это.
Жиль
@ Жиль: Кажется, это относится ко всем, кроме ошибок. За исключением того, что это не так, featuresя не вижу их в этом файле.
Дразисил
71

РУКА

На процессорах ARM в features:строке упоминается несколько функций . Здесь упоминаются только функции, непосредственно связанные с архитектурой ARM, а не функции, характерные для производителя кремния или системы на кристалле.

Функции получены путем поиска идентификатора процессора read_cpuid()и поиска его в определениях типов процессоров, известных во время компиляции, где функции выражаются в виде маски HWCAP_xxxфлагов. Соответствующие строки находятся в hwcap_strи тsetup.c . Д. В.

В приведенном ниже списке ARMv6 представил инструкции и типы данных SIMD. ARMv7 предоставил расширенные инструкции SIMD и типы данных. На 32-битных ARM машинах, neonсигналы Advanced SIMD; в то время как asimdсигналы Advanced SIMD на машинах 64-битной руки.

Кроме того, Hardware:линия указывает модель процессора. В зависимости от модели, может быть другая информация в других файлах в /procили /sys, или в сообщениях журнала ядра во время загрузки. К сожалению, у каждого производителя процессоров ARM есть свой собственный метод сообщения о возможностях процессора, если таковые имеются.

Жиль
источник
11

x86

Найдите это сами в 4.1.3 x86 и руководстве Intel

arch/x86/include/asm/cpufeature.h содержит полный список

Определить значения имеют тип:

X*32 + Y

Например:

#define X86_FEATURE_FPU     ( 0*32+ 0) /* Onboard FPU */

Флаги функций, извлеченные из CPUID, хранятся внутри:

  • __u32 x86_capability[NCAPINTS + NBUGINTS]; поле
  • из struct cpuinfo_x86 boot_cpu_data
  • определяется в x86/kernel/setup.c

который инициализируется через __initфункции.

Откуда происходит каждый x86_capabilityэлемент массива:

| index | eax      | ecx | output | file        |
|-------|----------|-----|--------|-------------|
|     0 |        1 |   0 | edx    | common.c    |
|     1 | 80000001 |     | edx    | common.c    |
|     2 | 80860001 |     | edx    | transmeta.c |
|     3 |          |     |        |             |
|     4 |        1 |   0 | ecx    | common.c    |
|     5 | C0000001 |     | edx    | centaur.c   |
|     6 | 80000001 |     | ecx    | common.c    |
|     7 |          |     |        | scattered.c |
|     8 |          |     |        |             |
|     9 |        7 |   0 | ebx    | common.c    |
|    10 |        D |   1 | eax    | common.c    |
|    11 |        F |   0 | edx    | common.c    |
|    12 |        F |   1 | edx    | common.c    |

Примечания:

  • пустые записи означают: «из разных мест» или «не доступно»
  • index: это индекс x86_capability, например,x86_capability[0]
  • eaxи exc: входные значения для CPUID в шестнадцатеричном формате. Входы, которые используют exc, которых меньше, называют это подзаголовком (двухуровневого дерева с eaxкорнем).
  • output: регистр, из которого берется вывод CPUID
  • file: файл, в котором определены эти поля. Пути относительно arch/x86/kernel/cpu/.
  • transmeta: было имя поставщика процессора https://en.wikipedia.org/wiki/Transmeta, которое было приобретено Novafora https://www.crunchbase.com/organization/novafora
  • centaur: было имя поставщика процессора https://en.wikipedia.org/wiki/Centaur_Technology, которое было приобретено VIA https://en.wikipedia.org/wiki/VIA_Technologies . Cyrix это еще один.

Выводы:

  • большинство записей поступают непосредственно из выходных регистров CPUID и задаются common.cчем-то вроде:

    c->x86_capability[0] = edx;
    

    Их легко найти в пакете по руководству Intel для CPUID.

  • остальные разбросаны по всему источнику и устанавливаются постепенно set_cpu_cap.

    Чтобы найти их, используйте git grep X86_FEATURE_XXXвнутри arch/x86.

    Обычно вы можете определить, каким битам CPUID они соответствуют, из окружающего кода.

Другие забавные факты

  • Флаги на самом деле печатаются arch/x86/kernel/cpu/proc.cс кодом:

    seq_puts(m, "flags\t\t:");
    for (i = 0; i < 32*NCAPINTS; i++)
        if (cpu_has(c, i) && x86_cap_flags[i] != NULL)
            seq_printf(m, " %s", x86_cap_flags[i]);
    

    Где:

    • cpu_has выполняет основную проверку функции.
    • x86_cap_flags[i] содержит строки, которые соответствуют каждому флагу.

    Это передается как обратный вызов для procнастройки системы. Точка входа в fs/proc/cpuinfo.c.

  • x86_cap_flagsстроки генерируются arch/x86/kernel/cpu/mkcapflags.hнепосредственно из arch/x86/include/asm/cpufeature.h"разбора" его с sed...

    Вывод идет arch/x86/kernel/cpu/capflags.cв каталог сборки, а результирующий массив выглядит так:

    const char * const x86_cap_flags[NCAPINTS*32] = {
        [X86_FEATURE_FPU]        = "fpu",
        [X86_FEATURE_VME]        = "vme",
    

    так например X86_FEATURE_FPUсоответствует строка "fpu"и так далее.

  • cpu_has разбивается на два случая с кодом:

    #define cpu_has(c, bit)                         \
        (__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 :  \
        test_cpu_cap(c, bit))
    

    Они есть:

    • __builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit): флаг необходим для запуска ядра.

      Это определяется данными внутри required-features.h, которые комментируют:

      Define minimum CPUID feature set for kernel These bits are checked
      really early to actually display a visible error message before the
      kernel dies.  Make sure to assign features to the proper mask!
      

      Поскольку они известны во время компиляции (требования ядра), уже были проверены при запуске, проверка может быть решена во время компиляции, если bitона известна во время компиляции.

      Таким образом, __builtin_constant_p(bit)который проверяет, bitявляется ли постоянная времени компиляции.

    • test_cpu_cap: это использует CPUIDданные из struct cpuinfo_x86 boot_cpu_dataглобального

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
3
Вы объяснили, как перейти от аббревиатуры к более длинному имени, но часто это более длинное имя не намного понятнее и cpuidделает это более удобным способом. Я задал этот вопрос, чтобы иметь место, где имена задокументированы.
Жиль
@Gilles это в основном для тех, кто хочет создать таблицы / не может найти свою особенность в таблице, как я :-) Но, тем не менее, в большинстве случаев, когда вы смотрите на правильную точку источника, отображение на CPUID выглядит так: незамедлительной.
Сиро Сантилли 新疆 at 中心 法轮功 六四 事件
10

Или же вы можете использовать cpuidпрограмму, она должна быть в репозитории Debian. Он выводит всю возможную информацию о вашем процессоре с некоторыми пояснениями, поэтому вы не получите эти непонятные флаги.

hurufu
источник
cpuidрасширяет аббревиатуры. Я бы не стал называть его выходными объяснениями . Знание этого htозначает, что «Hyper Threading» объясняет это в некоторой степени, но знание того, что mmxозначает «набор инструкций MMX», не так много, и это mcaозначает, что «Архитектура проверки компьютера» вряд ли.
Жиль
6
@ Жиль ... и, тем не менее, «Проверка машинной архитектуры» - это, безусловно, лучший запрос Google, чем «mca»;)
Алоис Махдал