如何判断我的处理器是否具有特定功能? (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英特尔高级矢量扩展编程参考
fpu
: 在船上浮点单元(浮点支持)vme
:虚拟 8086 模式增强de
:调试扩展(CR4.DE)pse
:页面大小扩展(4MB内存页)tsc
:时间戳计数器(RDTSC)msr
:特定于型号的寄存器(RDMSR、WRMSR)pae
:物理地址扩展(支持4GB以上内存)mce
:机器检查异常cx8
:CMPXCHG8指令(64 位比较和交换)apic
: 在船上APICsep
:系统中心/系统退出mtrr
:内存类型范围寄存器pge
:页面全局启用(PDE 和 PTE 中的全局位)mca
:机器检查架构cmov
:CMOV指令(有条件移动)(也FCMOV)pat
:页面属性表pse36
:36 位 PSE(大页)pn
:处理器序列号clflush
:缓存行刷新操作说明dts
:调试存储(用于调试和分析指令的缓冲区)acpi
:ACPI通过 MSR(温度监控和时钟速度调制)mmx
:多媒体扩展fxsr
:FXSAVE/FXRSTOR,CR4.OSFXSRsse
:英特尔上证所矢量指令sse2
:上证2ss
:CPU自身窥探ht
:超线程和/或多核tm
:自动时钟控制(热监视器)ia64
:英特尔安腾架构x86-64
64 位(不要与带有 flag 的 Intel 64 位 x86 架构或由 flag 指示的“AMD64”位混淆lm
)pbe
:待定中断启用(PBE# 引脚)唤醒支持
AMD定义的CPU特性,CPUID级别0x80000001
也可以看看维基百科和表 2-23英特尔高级矢量扩展编程参考
syscall
:系统调用(快速系统调用)和西斯特(从快速系统调用返回)mp
:多重处理有能力的。nx
:执行禁用mmxext
:AMD MMX 扩展fxsr_opt
:FXSAVE/FXRSTOR 优化pdpe1gb
:1 GB页面(允许hugepagesz=1G
)rdtscp
:读取时间戳计数器和处理器 IDlm
:长模式(x86-64:amd64,也称为Intel 64,即支持64位)3dnowext
:AMD 3D现在!扩展3dnow
:3D现在!(AMD向量指令,与Intel的SSE1竞争)
Transmeta定义的CPU特性,CPUID级别0x80860001
recovery
:CPU 处于恢复模式longrun
:龙润电源控制lrti
:LongRun表接口
其他功能,Linux 定义的映射
cxmmx
:Cyrix MMX 扩展k6_mtrr
:AMD K6 非标准 MTRRcyrix_arr
:Cyrix ARR(= MTRR)centaur_mcr
:半人马座 MCR(= MTRR)constant_tsc
:TSC 以恒定速率滴答up
:SMP内核运行在UP上art
:始终运行的计时器arch_perfmon
:英特尔架构 PerfMonpebs
:基于事件的精确采样bts
: 分店追踪店rep_good
:代表微码效果很好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
: APERFMPERFeagerfpu
:非惰性 FPU 恢复nonstop_tsc_s3
:TSC不停止在S3状态tsc_known_freq
:TSC已知频率mce_recovery
:CPU有可恢复的机器检查
Intel 定义的 CPU 特性,CPUID 级别 0x00000001 (ecx)
也可以看看维基百科和表 2-26英特尔高级矢量扩展编程参考
pni
:SSE-3(“普雷斯科特新指令”)pclmulqdq
:执行四字的无进位乘法 操作说明— 加速器气相色谱法)dtes64
:64位调试存储monitor
:监控/Mwait 支持(英特尔 SSE3 补充)ds_cpl
:CPL 资格。调试存储vmx
:硬件虚拟化:英特尔虚拟MXsmx
:更安全模式:TXT(全员生产管理支持)est
:增强速度步tm2
:热监控器2ssse3
:补充 SSE-3cid
:上下文IDsdbg
:硅调试fma
:乘加融合cx16
:CMPXCHG16Bxtpr
:发送任务优先级消息pdcm
:性能能力pcid
:进程上下文标识符dca
:直接缓存访问sse4_1
:SSE-4.1sse4_2
:SSE-4.2x2apic
:x2APICmovbe
:交换字节后移动数据操作说明popcnt
:返回设置为 1 的位数计数 操作说明(汉明重量,即位数)tsc_deadline_timer
: Tsc 截止计时器aes
/aes-ni
:高级加密标准(新指令)xsave
:保存处理器扩展状态: 还提供XGETBY,XRSTOR,XSETBYavx
:高级矢量扩展f16c
:16 位 fp 转换(无级变速16)rdrand
:读取随机数来自硬件随机数生成器操作说明hypervisor
: 运行在管理程序
VIA/Cyrix/Centaur定义的CPU特性,CPUID级别0xC0000001
rng
:随机数生成器现在(xstore)rng_en
:随机数生成器已启用ace
:CPU 上加密 (xcrypt)ace_en
:启用 CPU 上加密ace2
:高级加密引擎 v2ace2_en
:启用 ACE v2phe
: PadLock 哈希引擎phe_en
: 启用板式换热器pmm
:挂锁蒙哥马利乘数pmm_en
:PMM 启用
更多扩展的 AMD 标志:CPUID 级别 0x80000001、ecx
lahf_lm
:在长模式下从标志(LAHF)加载AH并将AH存储到标志(SAHF)cmp_legacy
:如果是的话超线程无效svm
:“安全虚拟机”:AMD-Vextapic
:扩展APIC空间cr8_legacy
:32位模式下的CR8abm
:高级位操作sse4a
:SSE-4Amisalignsse
:指示当某些旧版 SSE 指令对未对齐数据进行操作时是否会生成一般保护异常 (#GP)。还取决于 CR0 和对齐检查位3dnowprefetch
:3DNow预取指令osvw
: 表示操作系统可见的解决方法,这允许操作系统解决处理器勘误表。ibs
:基于指令的采样xop
:扩展AVX指令skinit
:SKINIT/STGI 说明wdt
:看门狗定时器lwp
:轻量级分析fma4
:4个操作数MAC指令tce
:翻译缓存扩展nodeid_msr
:NodeId MSRtbm
:尾随位操作topoext
:拓扑扩展 CPUID 叶perfctr_core
:核心性能计数器扩展perfctr_nb
: NB 性能计数器扩展bpext
:数据断点扩展ptsc
:性能时间戳计数器perfctr_l2
:L2 性能计数器扩展mwaitx
:MWAIT
扩大 (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
:代码和数据优先级 L3invpcid_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
:英特尔虚拟 NMIflexpriority
:英特尔 FlexPriorityept
:Intel扩展页表vpid
:英特尔虚拟处理器 IDvmmcall
: 较VMMCALL
喜欢VMCALL
Intel 定义的 CPU 功能,CPUID 级别 0x00000007:0 (ebx)
fsgsbase
:{RD/WR}{FS/GS}BASE指令tsc_adjust
:TSC调整MSRbmi1
:第一组位操作扩展hle
:硬件锁消除avx2
:AVX2指令smep
:Supervisor模式执行保护bmi2
:第二组位操作扩展erms
:增强型 REP MOVSB/STOSBinvpcid
:使处理器上下文 ID 无效rtm
:受限事务内存cqm
:缓存QoS监控mpx
:内存保护扩展rdt_a
:资源总监技术配置avx512f
:AVX-512基础avx512dq
:AVX-512 双/四指令rdseed
:RDSEED 指令adx
:ADCX 和 ADOX 指令smap
:管理员模式访问预防avx512ifma
:AVX-512 整数融合乘加指令clflushopt
:CLFLUSHOPT
操作说明clwb
:CLWB
操作说明intel_pt
:英特尔处理器跟踪avx512pf
:AVX-512 预取avx512er
:AVX-512 指数和倒数avx512cd
:AVX-512 冲突检测sha_ni
:SHA1/SHA256 指令扩展avx512bw
:AVX-512 字节/字指令avx512vl
:AVX-512 128/256 矢量长度扩展
扩展状态功能,CPUID 级别 0x0000000d:1 (eax)
xsaveopt
: 优化XSAVE
xsavec
:XSAVEC
xgetbv1
:XGETBV
ECX = 1xsaves
:XSAVES
/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)
clzero
:CLZERO
操作说明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 锁定 MSRnrip_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 VMLOADvgif
: 虚拟 GIF
Intel 定义的 CPU 功能,CPUID 级别 0x00000007:0 (ecx)
avx512vbmi
:AVX512向量位操作指令umip
:用户模式指令保护pku
:用户空间的保护密钥ospke
:操作系统保护键启用avx512_vbmi2
:附加 AVX512 向量位操作指令gfni
: 伽罗瓦域新指令vaes
:矢量AESvpclmulqdq
:无进位乘法双四字avx512_vnni
:向量神经网络指令avx512_bitalg
:VPOPCNT[B,W] 和 VPSHUF-BITQMB 指令avx512_vpopcntdq
:DW/QW 向量的 POPCNTla57
:5级页表rdpid
:RDPID指令
AMD 定义的 CPU 功能,CPUID 级别 0x80000007 (ebx)
overflow_recov
:MCA溢出恢复支持succor
:不可纠正的错误遏制和恢复smca
:可扩展的MCA
检测到的 CPU 错误(Linux 定义)
f00f
:英特尔F00Ffdiv
:CPU FDIVcoma
:Cyrix 6x86 昏迷amd_tlb_mmatch
:tlb_mmatch
AMD 勘误 383amd_apic_c1e
:apic_c1e
AMD 勘误 40011ap
: 错误的本地 APIC 又名 11APfxsave_leak
:FXSAVE 泄露 FOP/FIP/FOPclflush_monitor
:在 MONITOR 之前需要 AAI65、CLFLUSHsysret_ss_attrs
:SYSRET 无法修复 SS 属性espfix
: "" IRET 到 16 位 SS 损坏 ESP/RSP 高位null_seg
:清空选择器会保留基数swapgs_fence
:SWAPGS 不依赖 GS 输入monitor
:唤醒远程CPU需要IPIamd_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。
swp
:SWP
操作说明(原子读-修改-写)half
:半字加载和存储thumb
:拇指(16位指令集)26bit
:“26 位”型号(处理器状态寄存器合并到程序计数器中)fastmult
:32×32→64位乘法fpa
:浮点加速器vfp
:VFP(早期的单指令多数据流向量浮点指令)edsp
:DSP 扩展(ARM9 CPU 的“e”变体,以及上述所有其他 CPU)java
:贾泽勒(Java字节码加速器)iwmmxt
:单指令多数据流指示类似于英特尔MMXcrunch
:特立独行的紧缩协处理器(如果启用内核支持)thumbee
:拇指电子版neon
:高级 SIMD/NEON(asimd
在 AArch64 较旧的内核上)vfpv3
:VFP版本3vfpv3d16
:VFP 版本 3,带 16 个 D 寄存器tls
:传输层安全协议登记vfpv4
:具有快速上下文切换功能的 VFP 版本 4idiva
:SDIV
以及UDIV
ARM 模式下的硬件除法idivt
:SDIV
以及UDIV
Thumb模式下的硬件划分vfpd32
:具有 32 个 D 寄存器的 VFPlpae
:大物理地址扩展(32 位架构上>4GB 物理内存)evtstrm
:使用通用架构定时器的内核事件流aes
:硬件加速AES(秘密密钥密码学)pmull{2}
:64×64→128位F 2 m乘法— 加速认证加密的 GCM 模式sha1
:硬件加速SHA-1sha2
:硬件加速SHA-256sha512
:硬件加速SHA-512sha3
:硬件加速SHA-3sm3
:硬件加速SM3sm4
:硬件加速SM4crc32
:硬件加速CRC-32
除此之外,该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 |
笔记:
- 空条目的意思是:“来自不同地方”或“不可用”
index
: 是 的索引x86_capability
,例如x86_capability[0]
eax
和exc
: 是十六进制 CPUID 的输入值。使用 的输入exc
较少,称为子叶eax
(位于根部的2 层树)。output
:是从中获取 CPUID 输出的寄存器file
: 是定义这些字段的文件。路径是相对于arch/x86/kernel/cpu/
.transmeta
:是 CPU 供应商的名称https://en.wikipedia.org/wiki/Transmeta被 Novafora 收购https://www.crunchbase.com/organization/novaforacentaur
:是 CPU 供应商的名称https://en.wikipedia.org/wiki/Centaur_Technology被VIA收购了https://en.wikipedia.org/wiki/VIA_Technologies。西里克斯是另一位。
结论:
common.c
大多数条目直接来自 CPUID 输出寄存器,并通过以下方式设置:c->x86_capability[0] = edx;
这些很容易在 Intel 的 CPUID 手册中批量找到。
其他的分散在整个源代码中,并通过 一点一点地设置
set_cpu_cap
。要找到它们,请使用
git grep X86_FEATURE_XXX
insidearch/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
答案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