使用/proc/cpuinfo进行运行时CPU特性检测
一些标志可能是特定于ARM架构的,而其他一些可能是通用的或特定于其他CPU架构的。另外,不同的内核版本返回的标志也可能不同,比如ARMv8-A 64位内核使用 'asimd' 来支持高级SIMD,而ARMv7-A 32位内核使用 'neon'。因此,在ARMv8-A 64位内核上,查找 /proc/cpuinfo 中 "neon" 字符串的NEON检测代码将不起作用。文件在Linux系统中提供了关
在Linux上,可以使用/proc/cpuinfo
文件用来查询处理器支持的指令集。/proc/cpuinfo
文件在Linux系统中提供了关于CPU的详细信息,包括一系列的标志(flags),这些标志描述了CPU支持的特性和指令集扩展。
我们以NXP i.MX93系统为例,这个处理器支持2个Cortex-A55核和1个Cortex-M33核。
在NXP i.MX93系统上使用cat /proc/cpuinfo命令可以得到如下信息。
root@atk-imx93:~# cat /proc/cpuinfo
processor : 0
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x2
CPU part : 0xd05
CPU revision : 0
processor : 1
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x2
CPU part : 0xd05
CPU revision : 0
这些信息表示系统有2个处理器核(Cortex-M33不支持Linux,所以看不到)。
ARM CPU的CPU型号、Vendor、版本等信息存于MIDR_EL1
寄存器中。
- CPU implementer是厂商编号,0x41表示是ARM。
厂商编号如下表所示:
Vendor Name | Vendor ID |
---|---|
ARM | 0x41 |
Broadcom | 0x42 |
Cavium | 0x43 |
DigitalEquipment | 0x44 |
HiSilicon | 0x48 |
Infineon | 0x49 |
Freescale | 0x4D |
NVIDIA | 0x4E |
APM | 0x50 |
Qualcomm | 0x51 |
Marvell | 0x56 |
Intel | 0x69 |
- CPU architecture表示架构,
0x8
即ARMv8 - CPU variant架构版本,0x02表示ARMv8.2。
- CPU part是具体型号,0xd05表示Cortex-A55 架构
以下是上面的cpuinfo
标志列表及其通常含义的简要概述:
- fp: 表示CPU支持浮点运算(Floating Point)。
- asimd: 表示CPU支持高级SIMD指令集(Advanced SIMD),这是ARM架构中用于SIMD操作的指令集。
- evtstrm: 表示CPU支持事件流计数器,用于性能监控。
- aes: 表示CPU支持AES(高级加密标准)指令集,用于加密和解密操作。
- pmull: 表示CPU支持多项式乘法指令,通常用于加密算法。
- sha1: 表示CPU支持SHA-1散列算法的硬件加速。
- sha2: 表示CPU支持SHA-2(包括SHA-256和SHA-512)散列算法的硬件加速。
- crc32: 表示CPU支持CRC32(循环冗余校验)指令集,用于数据校验。
- atomics: 表示CPU支持原子操作指令集,用于多线程编程中的同步操作。
- fphp: 表示CPU支持半精度浮点(Half Precision Floating Point)指令集。
- asimdhp: 表示CPU支持高级SIMD半精度指令集,进一步扩展了SIMD功能。
- cpuid: 表示CPU支持CPUID指令,用于识别CPU的型号和制造商。
- asimdrdm: 表示CPU支持高级SIMD可重定向调试模式,用于调试目的。
- lrcpc: 表示CPU支持远程过程调用(RPC)的本地调用优化。
- dcpop: 表示CPU支持释放一致性(Release Consistency)操作,用于内存排序和同步。
- asimddp: 表示CPU支持高级SIMD调试指针,用于调试SIMD操作。
请注意,这些标志的具体含义可能会根据不同的CPU架构和实现有所变化。一些标志可能是特定于ARM架构的,而其他一些可能是通用的或特定于其他CPU架构的。另外,不同的内核版本返回的标志也可能不同,比如ARMv8-A 64位内核使用 'asimd' 来支持高级SIMD,而ARMv7-A 32位内核使用 'neon'。因此,在ARMv8-A 64位内核上,查找 /proc/cpuinfo 中 "neon" 字符串的NEON检测代码将不起作用。
参考资料:
- From a diary of AArch64 porter — Arm CPU features table – Marcin Juszkiewicz
- ARM CPU Vendor 及 Part ID 映射关系(持续更新) - Kunpeng Compute Team Blog
- Runtime detection of CPU features on an ARMv8-A CPU - Operating Systems blog - Arm Community blogs - Arm Community
- 了解ARM架构下的芯片信息 - 掘金 (juejin.cn)
- Arm Cortex-A55 Core Technical Reference Manual
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)