在Linux上,可以使用/proc/cpuinfo文件用来查询处理器支持的指令集。/proc/cpuinfo 文件在Linux系统中提供了关于CPU的详细信息,包括一系列的标志(flags),这些标志描述了CPU支持的特性和指令集扩展。

我们以NXP i.MX93系统为例,这个处理器支持2个Cortex-A55核和1个Cortex-M33核。

7fdbf1ef1e684965b51bb6b7935c01d0.png

在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 NameVendor ID
ARM0x41
Broadcom0x42
Cavium0x43
DigitalEquipment0x44
HiSilicon0x48
Infineon0x49
Freescale0x4D
NVIDIA0x4E
APM0x50
Qualcomm0x51
Marvell0x56
Intel0x69
  • 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检测代码将不起作用。

参考资料: 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐