x86

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

答案1

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)

也可以看看维基百科和表 2-27英特尔高级矢量扩展编程参考

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

也可以看看维基百科和表 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:英特尔架构 PerfMon
  • pebs:基于事件的精确采样
  • bts: 分店追踪店
  • rep_good:代表微码效果很好
  • acc_powerAMD累积电量机制
  • nopl:NOPL(0F 1F)指令
  • xtopology: cpu 拓扑枚举扩展
  • tsc_reliableTSC众所周知是可靠的
  • 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有可恢复的机器检查

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

也可以看看维基百科和表 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: 启用板式换热器
  • pmm:挂锁蒙哥马利乘数
  • 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: 表示操作系统可见的解决方法,这允许操作系统解决处理器勘误表。
  • 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 监控/等待
  • 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-P状态
  • proc_feedback:AMD ProcFeedback接口
  • sme:AMD 安全内存加密
  • pti内核页表隔离(凯撒)
  • retpoline雷特波林缓解幽灵变体 2(间接分支)
  • 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: 较VMMCALL喜欢VMCALL

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:有限责任公司服务质量

Intel 定义的 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

Intel 定义的 CPU 功能,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: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 勘误 400
  • 11ap: 错误的本地 APIC 又名 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:SWAPGS 不依赖 GS 输入
  • monitor:唤醒远程CPU需要IPI
  • amd_e400:CPU 受到 Erratum 400 的影响
  • cpu_meltdown:CPU 受到影响崩溃攻击并且需要内核页表隔离
  • spectre_v1:CPU 受到影响幽灵带有条件分支的变体 1 攻击
  • spectre_v2:CPU 受到影响幽灵使用间接分支的变体 2 攻击
  • spec_store_bypass: CPU 受到影响投机商店绕过漏洞(Spectre 变体 4)。

PS 此列表源自arch/x86/include/asm/cpufeatures.h内核源代码。这些标志的列出顺序与源代码相同。请通过以下方式提供帮助:在功能缺失时添加功能描述的链接,为名称不明确的功能编写简短描述,以及更新新内核版本的列表。目前的名单来自Linux 4.15加上一些后来的补充。

答案2

手臂

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

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

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

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

答案3

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    |

笔记:

结论:

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

    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.hsed

    输出将转到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

答案4

受到@Gilles 最佳答案的启发,这里有一个 bash 脚本(需要 bash v4 或更高版本、网络连接和最近的 wget)来注释当前的 CPU 标志:

#! /bin/bash

CPUFEATURES="$(wget -qO- "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/plain/arch/x86/include/asm/cpufeatures.h")" 
grep "^flags" /proc/cpuinfo |
        uniq |
        sed 's/^.*: //' |
        tr ' ' '\n' |
        while read line; do
                echo -n "${line}: "
                echo "$CPUFEATURES" |
                grep "FEATURE_${line^^}" |
                        sed 's|.*) /\* ||' |
                        sed 's| \*/$||'
        done

相关内容