/ proc / cpuinfo中的标志是什么意思?


212

如何判断我的处理器是否具有特定功能?(64位指令集,硬件辅助虚拟化,密码加速器等),我知道文件中/proc/cpuinfo包含此信息flags,但是所有这些密码缩写是什么意思?

例如,从给出的以下摘录中/proc/cpuinfo,我是否有64位CPU?我有硬件虚拟化吗?

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

Answers:


275

x86

(32位又名i386–i686和64位又名amd64。换句话说,就是您的工作站,笔记本电脑或服务器。)

常见问题:我有…

  • 64位(x86_64 / AMD64 / Intel64)? lm
  • 硬件虚拟化(VMX / AMD-V)?vmx(英特尔),svm(AMD)
  • 加速AES(AES-NI)? aes
  • TXT(TPM)? smx
  • 管理程序(如此宣布)? hypervisor

其他大多数功能只有编译器或内核作者才感兴趣。

所有标志

完整列表位于内核源文件中arch/x86/include/asm/cpufeatures.h

英特尔定义的CPU功能,CPUID级别0x00000001(edx)

另请参阅“ 英特尔高级矢量扩展编程参考”中的Wikipedia和表2-27。

AMD定义的CPU功能,CPUID级别0x80000001

另请参阅WikipediaIntel Advanced Vector Extensions编程参考中的表2-23。

Transmeta定义的CPU功能,CPUID级别0x80860001

  • recovery:CPU处于恢复模式
  • 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:在UP上运行的SMP内核
  • art:始终运行的计时器
  • arch_perfmon:英特尔架构性能
  • pebs:基于精确事件的采样
  • bts:分支跟踪存储
  • rep_good:rep微码运作良好
  • acc_powerAMD累积动力机制
  • nopl:NOPL(0F 1F)指令
  • xtopology:cpu拓扑枚举扩展
  • tsc_reliable:众所周知,TSC是可靠的
  • nonstop_tscTSC不会在C状态下停止
  • cpuid:CPU本身具有CPUID指令
  • extd_apicid:具有扩展的APICID(8位)
  • amd_dcm:多节点处理器
  • aperfmperf:APERFMPERF
  • eagerfpu:非延迟FPU还原
  • nonstop_tsc_s3TSC不会在S3状态下停止
  • tsc_known_freqTSC的已知频率
  • mce_recovery:CPU具有可恢复的机器检查

英特尔定义的CPU功能,CPUID级别0x00000001(ecx)

另请参阅《英特尔高级矢量扩展编程参考》中的Wikipedia和表2-26

VIA / Cyrix / Centaur定义的CPU功能,CPUID级别0xC0000001

  • rng:存在随机数生成器(xstore)
  • rng_en:启用随机数生成器
  • ace:CPU上的加密(xcrypt)
  • ace_en:启用CPU上的加密
  • ace2:高级密码引擎v2
  • ace2_en:启用ACE v2
  • phe:PadLock哈希引擎
  • phe_en:已启用PHE
  • pmm:PadLock蒙哥马利乘数
  • pmm_en:启用PMM

更多扩展的AMD标志:CPUID级别0x80000001,ecx

  • lahf_lm:从标志(LAHF)加载AH,并以长模式将AH存储到标志(SAHF)
  • cmp_legacy:如果是,则超线程无效
  • svm:“安全虚拟机”:AMD-V
  • extapic:扩展的APIC空间
  • cr8_legacy:32位模式下的CR8
  • abm高级位处理
  • sse4aSSE-4A
  • misalignsse:表示当某些旧版SSE指令对未对齐的数据进行操作时是否生成一般保护异常(#GP)。也取决于CR0和对齐检查位
  • 3dnowprefetch:3DNow预取指令
  • osvw:表示OS Visible Workaround,它使OS可以处理处理器勘误。
  • ibs基于指令的采样
  • xop扩展的AVX指令
  • skinit:SKINIT / STGI指令
  • wdt看门狗定时器
  • lwp轻量化分析
  • fma44个操作数MAC指令
  • tce:翻译缓存扩展
  • nodeid_msr:NodeId MSR
  • tbm尾随位操作
  • topoext:拓扑扩展CPUID叶子
  • perfctr_core:核心性能计数器扩展
  • perfctr_nb:NB性能计数器扩展
  • bpext:数据断点扩展
  • ptsc:性能时间戳计数器
  • perfctr_l2:L2性能计数器扩展
  • mwaitxMWAIT扩展名(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:有效invpcidCR4.PCIDE=1
  • hw_pstate:AMD HW-PState
  • proc_feedback:AMD ProcFeedbackInterface
  • sme:AMD安全内存加密
  • pti内核页表隔离(Kaiser)
  • retpoline:缓解幽灵变体2(间接分支)的瑞波林
  • retpoline_amd:AMD Retpoline缓解
  • intel_ppin:英特尔处理器库存编号
  • avx512_4vnniw:AVX-512神经网络说明
  • avx512_4fmaps:AVX-512乘法累加单精度
  • mba:内存带宽分配
  • rsb_ctxsw:在上下文开关上填充RSB

虚拟化标志:Linux定义

  • tpr_shadow:英特尔TPR Shadow
  • vnmi:英特尔虚拟NMI
  • flexpriority:英特尔FlexPriority
  • ept:英特尔扩展页表
  • vpid:英特尔虚拟处理器ID
  • vmmcall:喜欢VMMCALLVMCALL

英特尔定义的CPU功能,CPUID级别0x00000007:0(ebx)

扩展状态功能,CPUID级别0x0000000d:1(eax)

  • xsaveopt: 优化 XSAVE
  • xsavecXSAVEC
  • xgetbv1XGETBVECX = 1
  • xsavesXSAVES/XRSTORS

英特尔定义的CPU QoS子页面,CPUID级别0x0000000F:0(edx)

  • cqm_llc:LLC QoS

英特尔定义的CPU QoS子叶,CPUID级别0x0000000F:1(edx)

  • cqm_occup_llc:LLC占用率监控
  • cqm_mbm_total:LLC总MBM监控
  • cqm_mbm_local:LLC本地MBM监视

AMD定义的CPU功能,CPUID级别0x80000008(ebx)

  • clzeroCLZERO说明
  • irperf:说明退役性能计数器
  • xsaveerptr:始终保存/恢复FP错误指针

热和电源管理叶,CPUID级别0x00000006(eax)

  • dtherm(以前dts):数字温度传感器
  • ida:英特尔动态加速
  • arat:始终运行APIC计时器
  • pln:英特尔功率限制通知
  • pts:英特尔封装散热状况
  • hwp:英特尔硬件P状态
  • hwp_notify:HWP通知
  • hwp_act_window:HWP活动窗口
  • hwp_epp:HWP能源绩效偏好
  • hwp_pkg_req:HWP包级请求

AMD SVM功能识别,CPUID级别0x8000000a(edx)

  • npt:AMD嵌套页面表支持
  • 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解码助手支持
  • pausefilter:AMD过滤的暂停拦截
  • pfthreshold:AMD暂停过滤器阈值
  • avic:虚拟中断控制器
  • vmsave_vmload:虚拟VMSAVE VMLOAD
  • vgif:虚拟GIF

英特尔定义的CPU功能,CPUID级别0x00000007:0(ecx)

  • avx512vbmi:AVX512矢量位操作说明
  • umip:用户模式指令保护
  • pku:用户空间的保护密钥
  • ospke:启用操作系统保护键
  • avx512_vbmi2:附加的AVX512矢量位操作说明
  • gfni:Galois Field新指令
  • vaes:矢量AES
  • vpclmulqdq:少进位乘法双四字
  • avx512_vnni:矢量神经网络说明
  • avx512_bitalg:VPOPCNT [B,W]和VPSHUF-BITQMB指令
  • avx512_vpopcntdq:用于DW / QW矢量的POPCNT
  • la57:5级页表
  • rdpid:RDPID指令

AMD定义的CPU功能,CPUID级别0x80000007(ebx)

  • overflow_recov:MCA溢出恢复支持
  • succor:无法纠正的错误包含和恢复
  • smca:可扩展的MCA

检测到的CPU错误(Linux定义)

  • f00f英特尔F00F
  • fdivCPU FDIV
  • comaCyrix 6x86昏迷
  • amd_tlb_mmatchtlb_mmatchAMD勘误表383
  • amd_apic_c1eapic_c1eAMD Erratum 400
  • 11ap:错误的本地APIC aka 11AP
  • fxsave_leak:FXSAVE泄漏FOP / FIP / FOP
  • clflush_monitor:MONITOR之前需要AAI65,CLFLUSH
  • sysret_ss_attrs:SYSRET无法修复SS属性
  • espfix:“” IRET到16位SS会破坏ESP / RSP高位
  • null_seg:取消选择器会保留基础
  • swapgs_fence:GS上没有输入深度的SWAPGS
  • monitor:需要IPI才能唤醒远程CPU
  • amd_e400:CPU受勘误400的影响
  • cpu_meltdown:CPU受崩溃攻击的影响,需要内核页表隔离
  • spectre_v1:CPU受具有条件分支的Spectre变体1攻击影响
  • spectre_v2:CPU受具有间接分支的Spectre变体2攻击的影响
  • spec_store_bypass:CPU受“ 推测性存储绕过”漏洞(Spectre变体4)的影响。

PS此清单来自arch/x86/include/asm/cpufeatures.h内核源代码。这些标志以与源代码相同的顺序列出。请提供帮助,方法是在缺少功能时添加指向功能说明的链接,为功能名称不简短的功能编写简短说明,并为新的内核版本更新列表。当前列表来自Linux 4.15以及以后的一些补充。


1
感谢@Gilles和编辑提供的信息性问题及其摘要和详细答案。现在,要检查任何CPU功能,我使用NixCraft中的以下内容,例如用于Intel CPU :$ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u。还有CLI / GUI出色的i-nex
tuk0z 2015年

出色的解释和链接集合;感谢所有贡献者。
保罗·基尔

错误数据来自哪里?它似乎未在cpufeatures.h文件中列出。
Drazisil

@Drazisil据我所知,所有条目均来自的指示版本cpufeatures.h。对描述进行了编辑,以使它们在有人尝试执行此操作时更易于理解和提供更多信息。
吉尔斯

@Gilles除错误外,所有情况似乎都是这样。撇开那些不是,features我在该文件中看不到它们。
Drazisil

71

在ARM处理器上,该features:行提到了一些功能。此处仅提及与ARM体系结构直接相关的功能,而没有针对芯片制造商或片上系统的特定功能。

这些特征是通过在编译时使用已知read_cpuid()处理器类型定义中查找CPU id 并对其进行查找而获得的,其中,这些特征表示为HWCAP_xxx标志的掩码。相应的字符串在hwcap_str等中setup.c

在下面的列表中,ARMv6引入了SIMD指令和数据类型。ARMv7提供了高级SIMD指令和数据类型。在32位ARM机器上,neon发出高级SIMD信号;而asimd在64位Arm机器上发出高级SIMD信号。

除此之外,该Hardware:行还指示处理器型号。根据型号,在/proc或下的其他文件中/sys,或在启动时内核日志消息中可能还有其他信息。不幸的是,每个ARM CPU制造商都有自己的方法来报告处理器功能(如果有)。



11

x86

在4.1.3 x86和英特尔手册中自行查找

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    |

笔记:

结论:

  • 大多数条目直接来自CPUID输出寄存器,并通过以下方式设置common.c

    c->x86_capability[0] = edx;
    

    这些内容很容易在Intel手册中找到有关CPUID的内容。

  • 其他的则分散在整个源中,并通过进行设置set_cpu_cap

    要找到它们,请使用git grep X86_FEATURE_XXXinside 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存储库中。它会转储有关您CPU的所有可能信息,并附有一些说明,因此您不会得到那些晦涩的标志。


cpuid扩展缩写。我真的不会称呼它的输出解释。知道这ht意味着“超线程”在某种程度上可以解释它,但是知道这mmx意味着“ MMX指令集”,而不是太多,这mca几乎意味着“机器检查体系结构”。
吉尔斯2014年

6
@Gilles ...但是,“ Machine Check Architecture”肯定比“ mca”更好的Google查询;)
Alois Mahdal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.