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

Gil*_*il' 242 linux cpu arm x86

如何判断我的处理器是否具有特定功能?(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
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 317

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.

Intel 定义的 CPU 特性,CPUID 级别 0x00000001 (edx)

另请参阅WikipediaIntel Advanced Vector Extensions Programming Reference 中的表 2-27

AMD 定义的 CPU 特性,CPUID 级别 0x80000001

另请参阅WikipediaIntel Advanced Vector Extensions Programming Reference 中的表 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: SMP 内核在 UP 上运行
  • art:始终运行的计时器
  • arch_perfmon:英特尔架构性能监控器
  • pebs: 基于事件的精确采样
  • bts: 分行追踪商店
  • rep_good: rep 微码运行良好
  • acc_power: AMD 累积动力机制
  • nopl: NOPL (0F 1F) 指令
  • xtopology: cpu 拓扑枚举扩展
  • 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: CPU 有可恢复的机器检查

Intel 定义的 CPU 特性,CPUID 级别 0x00000001 (ecx)

另请参阅WikipediaIntel Advanced Vector Extensions Programming Reference 中的表 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:高级位操作
  • sse4a: SSE-4A
  • misalignsse: 指示当一些传统 SSE 指令对未对齐的数据进行操作时是否会生成一般保护异常 (#GP)。还取决于 CR0 和对齐检查位
  • 3dnowprefetch: 3DNow 预取指令
  • osvw:表示OS Visible Workaround,它允许操作系统解决处理器勘误表。
  • 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 性能计数器扩展
  • mwaitx:MWAIT扩展名 ( MONITORX/ MWAITX)

辅助标志:Linux 定义 - 用于分散在各种 CPUID 级别的功能

  • ring3mwait: 环 3 MONITOR/MWAIT
  • cpuid_fault: 英特尔 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: Spectre变体 2(间接分支)的Retpoline缓解
  • retpoline_amd: AMD Retpoline 缓解
  • intel_ppin:英特尔处理器库存编号
  • avx512_4vnniw: AVX-512 神经网络使用说明
  • avx512_4fmaps: AVX-512 乘法累加单精度
  • mba: 内存带宽分配
  • rsb_ctxsw: 在上下文切换时填充 RSB

虚拟化标志:Linux 定义

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

Intel 定义的 CPU 特性,CPUID 级别 0x00000007:0 (ebx)

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

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

Intel 定义的 CPU QoS 子叶,CPUID 级别 0x0000000F:0 (edx)

  • cqm_llc:有限责任公司服务质量
    • 感谢@Gilles 和编辑提供信息丰富的问题​​及其总结和详细的答案。现在,为了检查任何 CPU 功能,我使用从 NixCraft 获取的以下内容,例如对于 Intel CPU:`$ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/ cpuinfo --color | 排序 -u`。还有很棒的 CLI/GUI [i-nex](http://sourceforge.net/projects/i-nex/)。 (2认同)

Gil*_*il' 82

手臂

在 ARM 处理器上,该features:行中提到了一些功能。那里只提到了与 ARM 架构直接相关的功能,而不是特定于芯片制造商或片上系统的功能。

这些特性是通过在编译时已知read_cpuid()处理器类型定义中查找CPU id和查找它来获得的,其中特性表示为HWCAP_xxx标志掩码。对应的字符串在 in hwcap_stretc. in 中setup.c

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

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


Cir*_*郝海东 11

x86

在 4.1.3 x86 和 Intel 手册中自行查找

arch/x86/include/asm/cpufeature.h 包含完整列表。

定义值属于以下类型:

X*32 + Y
Run Code Online (Sandbox Code Playgroud)

例如:

#define X86_FEATURE_FPU     ( 0*32+ 0) /* Onboard FPU */
Run Code Online (Sandbox Code Playgroud)

从 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    |
Run Code Online (Sandbox Code Playgroud)

笔记:

结论:

  • 大多数条目直接来自 CPUID 输出寄存器,common.c并由以下内容设置:

    c->x86_capability[0] = edx;
    
    Run Code Online (Sandbox Code Playgroud)

    这些很容易在 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]);
    
    Run Code Online (Sandbox Code Playgroud)

    在哪里:

    • cpu_has 对功能进行主要检查。
    • x86_cap_flags[i] 包含与每个标志对应的字符串。

    这作为回调传递给proc系统设置。入口点在fs/proc/cpuinfo.c

  • x86_cap_flags字符串是由arch/x86/kernel/cpu/mkcapflags.h直接 fromarch/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",
    
    Run Code Online (Sandbox Code Playgroud)

    所以例如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))
    
    Run Code Online (Sandbox Code Playgroud)

    他们是:

    • __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!
      
      Run Code Online (Sandbox Code Playgroud)

      由于那些在编译时已知(内核要求),已经在启动时检查过,如果bit在编译时已知,则可以在编译时解决检查。

      因此__builtin_constant_p(bit)which 检查是否bit是编译时常量。

    • test_cpu_cap: 这使用了CPUID来自struct cpuinfo_x86 boot_cpu_data全球的数据

  • 您已经解释了如何从缩写变为更长的名称,但通常更长的名称并不是更容易理解,`cpuid` 以更方便的方式做到这一点。我问这个问题是为了有一个记录名字的地方。 (3认同)

小智 10

或者你可以使用cpuid程序,它必须在 debian 存储库中。它通过一些解释转储有关 CPU 的所有可能信息,因此您不会得到那些晦涩的标志。

  • @Gilles ...然而,“机器检查架构”肯定比“mca”更好的谷歌查询;) (6认同)