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
(32 位又名 i386–i686 和 64 位又名 amd64。换句话说,您的工作站、笔记本电脑或服务器。)
lmvmx(英特尔), svm(AMD)aessmxhypervisor大多数其他功能只对编译器或内核作者感兴趣。
完整列表位于内核源代码中的文件arch/x86/include/asm/cpufeatures.h.
另请参阅Wikipedia和Intel Advanced Vector Extensions Programming Reference 中的表 2-27
fpu:板载FPU(浮点支持)vme:虚拟 8086 模式增强de: 调试扩展 ( CR4.DE )pse:页面大小扩展(4MB内存页面)tsc:时间戳计数器(RDTSC)msr:特定于模型的寄存器(RDMSR、WRMSR)pae:物理地址扩展(支持超过 4GB 的 RAM)mce:机器检查异常cx8:CMPXCHG8 指令(64 位比较和交换)apic: 板载APICsep: SYSENTER / SYSEXITmtrr:内存类型范围寄存器pge:页面全局启用(PDE 和 PTE 中的全局位)mca:机器检查架构cmov: CMOV 指令(条件移动)(还有FCMOV)pat:页面属性表pse36:36 位 PSE(大页面)pn:处理器序列号clflush: Cache Line Flush指令dts:调试存储(用于调试和分析指令的缓冲区)acpi: ACPI通过 MSR(温度监控和时钟速度调制)mmx:多媒体扩展fxsr: FXSAVE/FXRSTOR, CR4.OSFXSRsse: 英特尔SSE矢量指令sse2: SSE2ss:CPU自探ht:超线程和/或多核tm: 自动时钟控制 (Thermal Monitor)ia64:英特尔安腾架构64 位(不要与英特尔的 64 位 x86 架构混淆,标志x86-64或“AMD64”位由标志指示lm)pbe:Pending Break Enable (PBE# pin) 唤醒支持另请参阅Wikipedia和Intel Advanced Vector Extensions Programming Reference 中的表 2-23
syscall: SYSCALL(快速系统调用)和SYSRET(从快速系统调用返回)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竞争)recovery: CPU 处于恢复模式longrun: 龙润动力控制lrti: LongRun 表界面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:英特尔架构性能监控器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: APERFMPERFeagerfpu: 非惰性 FPU 还原nonstop_tsc_s3: TSC不会停止在 S3 状态tsc_known_freq: TSC已知频率mce_recovery: CPU 有可恢复的机器检查另请参阅Wikipedia和Intel Advanced Vector Extensions Programming Reference 中的表 2-26
pni:SSE-3(“普雷斯科特新指令”)pclmulqdq:执行四字 指令的无进位乘法- GCM 的加速器)dtes64: 64 位调试商店monitor:Monitor/Mwait 支持(英特尔 SSE3 补充)ds_cpl: CPL 资格。调试商店vmx: 硬件虚拟化:Intel VMXsmx:更安全的模式:TXT(TPM支持)est:增强的SpeedSteptm2:热监控器 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 转换 ( CVT16 )rdrand:从硬件随机数生成器指令中读取随机数hypervisor: 在管理程序上运行rng:随机数生成器(xstore)rng_en:启用随机数生成器ace: 在 CPU 上加密 (xcrypt)ace_en: 在 CPU 上加密启用ace2: 高级密码引擎 v2ace2_en: ACE v2 已启用phe: PadLock 哈希引擎phe_en: 启用 PHEpmm: PadLock 蒙哥马利乘数pmm_en: 启用 PMMlahf_lm: 在长模式下从标志 (LAHF) 加载 AH 并将 AH 存储到标志 (SAHF)cmp_legacy: 如果是 超线程无效svm:“安全虚拟机”:AMD-Vextapic: 扩展 APIC 空间cr8_legacy: 32 位模式下的 CR8abm:高级位操作sse4a: SSE-4Amisalignsse: 指示当一些传统 SSE 指令对未对齐的数据进行操作时是否会生成一般保护异常 (#GP)。还取决于 CR0 和对齐检查位3dnowprefetch: 3DNow 预取指令osvw:表示OS Visible Workaround,它允许操作系统解决处理器勘误表。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)ring3mwait: 环 3 MONITOR/MWAITcpuid_fault: 英特尔 CPUID 故障cpb: AMD 核心性能提升epb: IA32_ENERGY_PERF_BIAS 支持cat_l3: 缓存分配技术L3cat_l2:缓存分配技术L2cdp_l3: 代码和数据优先级 L3invpcid_single: 有效invpcid和CR4.PCIDE=1hw_pstate: AMD HW-PStateproc_feedback: AMD ProcFeedbackInterfacesme: AMD 安全内存加密pti:内核页表隔离(Kaiser)retpoline: Spectre变体 2(间接分支)的Retpoline缓解retpoline_amd: AMD Retpoline 缓解intel_ppin:英特尔处理器库存编号avx512_4vnniw: AVX-512 神经网络使用说明avx512_4fmaps: AVX-512 乘法累加单精度mba: 内存带宽分配rsb_ctxsw: 在上下文切换时填充 RSBtpr_shadow: 英特尔 TPR 阴影vnmi: 英特尔虚拟 NMIflexpriority: 英特尔 FlexPriorityept: Intel 扩展页表vpid:英特尔虚拟处理器 IDvmmcall:喜欢VMMCALL到VMCALLfsgsbase: {RD/WR}{FS/GS}BASE 指令tsc_adjust: TSC 调整 MSRbmi1: 第一组位操作扩展hle:硬件锁消除avx2: AVX2 指令smep: 监督模式执行保护bmi2: 第二组位操作扩展erms: 增强型 REP MOVSB/STOSBinvpcid:使处理器上下文 ID 无效rtm: 受限事务内存cqm: 缓存QoS监控mpx: 内存保护扩展rdt_a: 资源总监技术分配avx512f: AVX-512 基础avx512dq: AVX-512 双/四指令rdseed: RDSEED 指令adx: ADCX 和 ADOX 指令smap: 管理员模式访问预防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 矢量长度扩展xsaveopt: 优化 XSAVExsavec: XSAVECxgetbv1:XGETBVECX = 1xsaves:XSAVES/XRSTORScqm_llc:有限责任公司服务质量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 信号。
swp:SWP指令(原子读-修改-写)half:半字加载和存储thumb: Thumb(16 位指令集)26bit:“26 位”模型(处理器状态寄存器折叠到程序计数器中)fastmult: 32×32?64 位乘法fpa:浮点加速器vfp: VFP(早期的SIMD向量浮点指令)edsp: DSP 扩展(ARM9 CPU 的“e”变体,以及以上所有其他的)java: Jazelle (Java 字节码加速器)iwmmxt: SIMD指令类似于 Intel MMXcrunch:MaverickCrunch协处理器(如果启用内核支持)thumbee:大拇指neon:高级 SIMD/NEON(asimd在 AArch64 旧内核上)vfpv3: VFP 版本 3vfpv3d16:具有 16 个 D 寄存器的 VFP 版本 3tls: TLS寄存器vfpv4:具有快速上下文切换的 VFP 版本 4idiva:SDIV和UDIVARM模式下的硬件划分idivt:SDIV和UDIVThumb 模式下的硬件划分vfpd32:具有 32 个 D 寄存器的 VFPlpae:大型物理地址扩展(32 位架构上>4GB 物理内存)evtstrm:使用通用架构定时器的内核事件流aes: 硬件加速AES(秘钥加密)pmull{2}: 64×64?128-bit F 2 m乘法——加速认证加密的 GCM 模式sha1: 硬件加速的SHA-1sha2: 硬件加速的SHA-256crc32: 硬件加速的CRC-32除此之外,该Hardware:线表示处理器型号。根据型号的不同,有可能是下其他文件等信息/proc或/sys,或在启动时内核日志消息。不幸的是,每个 ARM CPU 制造商都有自己的报告处理器功能的方法(如果有的话)。
Cir*_*郝海东 11
在 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_datax86/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)
笔记:
index: 是 的索引x86_capability,例如x86_capability[0]eax和exc: 是十六进制 CPUID 的输入值。使用exc较少的输入将其称为子叶(eax以根为根的 2 级树)。output: 是从中获取 CPUID 输出的寄存器file: 是定义这些字段的文件。路径是相对于arch/x86/kernel/cpu/.transmeta:是被 Novafora 收购的 CPU 供应商的名称https://en.wikipedia.org/wiki/Transmeta https://www.crunchbase.com/organization/novaforacentaur: 是 CPU 供应商的名称https://en.wikipedia.org/wiki/Centaur_Technology被 VIA https://en.wikipedia.org/wiki/VIA_Technologies收购。Cyrix 是另一个。结论:
大多数条目直接来自 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全球的数据
小智 10
或者你可以使用cpuid程序,它必须在 debian 存储库中。它通过一些解释转储有关 CPU 的所有可能信息,因此您不会得到那些晦涩的标志。