Що означають прапори в / 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, рівень CPUID 0x00000001 (edx)

Дивіться також Вікіпедію та таблицю 2-27 в Довідці з програмування розширень векторних розробок Intel

Особливості процесора, визначені AMD, рівень CPUID 0x80000001

Дивіться також Вікіпедію та таблицю 2-23 в Довідці з програмування розширень векторних розробок Intel

Функції процесора, визначені Transmeta, рівень CPUID 0x80860001

  • recovery: ЦП у режимі відновлення
  • longrun: Контроль потужності Longrun
  • lrti: Інтерфейс таблиці LongRun

Інші функції, картографічне відображення, визначене Linux

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

Особливості процесора, визначені Intel, рівень CPUID 0x00000001 (ecx)

Дивіться також Вікіпедію та таблицю 2-26 в Довідці з програмування розширень векторних розробок Intel

Особливості процесора, визначені VIA / Cyrix / Centaur, рівень CPUID 0xC0000001

  • rng: Генератор випадкових чисел присутній (xstore)
  • rng_en: Увімкнено генератор випадкових чисел
  • ace: крипто-процесор (xcrypt)
  • ace_en: увімкнено криптовалюту на центральному процесорі
  • ace2: Розширений механізм криптографії v2
  • ace2_en: Увімкнено ACE v2
  • phe: Двигун PadLock Hash
  • 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: Кільце 3 MONITOR / MWAIT
  • cpuid_fault: Несправність процесора Intel CPUID
  • cpb: Підвищення продуктивності AMD
  • 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
  • pti: Ізольована таблиця сторінки ядра (кайзер)
  • retpoline: Повторне зменшення ефекту для Spectre варіант 2 (непрямі гілки)
  • retpoline_amd: Пом'якшення зворотної лінії AMD
  • intel_ppin: Інвентарний номер процесора Intel
  • avx512_4vnniw: Інструкції з нейронної мережі AVX-512
  • avx512_4fmaps: AVX-512 множинне накопичення Одноточна точність
  • mba: Виділення пропускної здатності пам'яті
  • rsb_ctxsw: Заповніть RSB на контекстних комутаторах

Прапори віртуалізації: визначено Linux

  • tpr_shadow: Тінь Intel TPR
  • vnmi: Intel Virtual NMI
  • flexpriority: Intel FlexPriority
  • ept: Таблиця розширених сторінок Intel
  • vpid: Ідентифікатор віртуального процесора Intel
  • vmmcall: Воліють , VMMCALLщобVMCALL

Особливості процесора, визначені Intel, рівень CPUID 0x00000007: 0 (ebx)

Особливості розширеного стану, рівень CPUID 0x0000000d: 1 (eax)

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

Підлісток QoS, визначений Intel, рівень CPUID 0x0000000F: 0 (edx)

  • cqm_llc: ТОВ QoS

Підлісток QoS процесора, визначений Intel, рівень CPUID 0x0000000F: 1 (edx)

  • cqm_occup_llc: Моніторинг заповнення ТОВ
  • cqm_mbm_total: ТОВ повний моніторинг MBM
  • cqm_mbm_local: ТОВ локальний моніторинг MBM

Особливості процесора, визначені AMD, рівень CPUID 0x80000008 (ebx)

  • clzero: CLZEROінструкція
  • irperf: вказівник лічильника ефективності роботи на пенсії
  • xsaveerptr: Завжди зберігайте / відновлюйте покажчики помилок FP

Лист керування тепловою енергією та електроенергією, рівень CPUID 0x00000006 (eax)

  • dtherm(раніше dts): цифровий тепловий датчик
  • ida: Intel Dynamic Acceleration
  • arat: Завжди працює таймер APIC
  • pln: Повідомлення про обмеження потужності Intel
  • pts: Тепловий стан пакета Intel
  • hwp: ПЗ-апаратні засоби Intel
  • hwp_notify: Повідомлення HWP
  • hwp_act_window: Вікно активності HWP
  • hwp_epp: Налаштування енергоефективності ГВП
  • hwp_pkg_req: Запит на рівні пакету HWP

Ідентифікація функції AMD SVM, рівень CPUID 0x8000000a (edx)

  • npt: Підтримка AMD вкладених таблиць сторінок
  • lbrv: Підтримка віртуалізації AMD LBR
  • svm_lock: Блокування MSR від AMD SVM
  • nrip_save: AMD SVM next_rip save
  • tsc_scale: Підтримка масштабування AMD TSC
  • vmcb_clean: Підтримка чистих бітів AMD VMCB
  • flushbyasid: Підтримка AMD флеш-під-ASID
  • decodeassists: Підтримка декодування AMD
  • 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, рівень CPUID 0x80000007 (ebx)

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

Виявлені помилки CPU (визначено 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 потрібно перед MONITOR
  • sysret_ss_attrs: SYSRET не виправляє SS аттри
  • espfix: "" IRET до 16-розрядних SS пошкоджує високі біти ESP / RSP
  • null_seg: Зміна селектора зберігає основу
  • swapgs_fence: SWAPGS без вхідного відображення на GS
  • monitor: IPI необхідний для пробудження віддаленого процесора
  • amd_e400: CPU є одним із постраждалих від Erratum 400
  • cpu_meltdown: CPU впливає на атаку зриву і потребує ізоляції таблиці ядра сторінки
  • spectre_v1: ЦП впливає на атаку Spectre 1 варіанта з умовними гілками
  • spectre_v2: CPU впливає на атаку Spectre варіант 2 з непрямими гілками
  • spec_store_bypass: На процесор впливає вразливість Specurative 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. А ще є чудовий i-nex CLI / GUI .
tuk0z

Видатний збірник пояснень та посилань; дякую всім, хто зробив свій внесок.
Пол Гір

Звідки беруться дані про помилки? Схоже, це не вказано у файлі cpufeatures.h.
Дразісіль

@Drazisil Наскільки я пам'ятаю, всі записи є із зазначеної версії cpufeatures.h. Описи редагуються, щоб зробити їх більш зрозумілими та більш інформативними, коли хтось доклав зусиль для цього.
Жиль

@Gilles Це, мабуть, стосується всіх, крім помилок. Якщо featuresвідмітити, що це не так, я не бачу їх у цьому файлі.
Дразісіль

71

ARM

У процесорах 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на 2 рівні з коренем).
  • 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глобального рівня


3
Ви пояснили, як перейти від абревіатури до більш довгої назви, але часто це довше ім'я не набагато зрозуміліше, і cpuidце робиться більш зручним способом. Я запитав це питання, щоб було місце, де зафіксовані імена.
Жиль

@ Gilles це в основному для тих, хто хоче скласти таблиці / не може знайти їхню функцію в таблиці, як я :-) Але все ж у більшості випадків, коли ви подивитесь на потрібну точку джерела, карта на CPUID є негайне.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

10

Або ви можете використовувати cpuidпрограму, вона повинна бути в сховищі debian. Він скидає всю можливу інформацію про ваш процесор з деякими поясненнями, тому ви не отримаєте цих незрозумілих прапорів.


cpuidрозширює абревіатури. Я б не дуже називав його вихідні пояснення . Знаючи, що це htозначає "Hyper Threading", це певною мірою пояснює це, але знаючи, що це mmxозначає "набір інструкцій MMX", не так вже й багато, а це mcaозначає "Machine Check Architecture", навряд чи.
Жиль

6
@Gilles ... і все ж, "Machine Check Architecture", безумовно, кращий запит Google, ніж "mca";)
Alois Mahdal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.