Assembly armv8中是否有类似CPUID的指令?

Assembly armv8中是否有类似CPUID的指令?,assembly,arm,armv8,Assembly,Arm,Armv8,所以我在汇编ARMv8中编程,我想知道是否有任何指令,如x86中的指令,用于恢复有关CPU的信息。这是我需要的信息: (CPUID)签名:660f01 (CPUID)功能:MMX、AMD64、SSE、SSE2、SSE3、SSE3、SSE4.1、SSE4.2、AES、AVX、CLMUL、FMA、FMA4、XOP、PSE、PSE-36、NX、SVM (CPUID)缓存一级:4 x 32 KB数据,4 x 96 KB指令 (CPUID)缓存二级:4 x 1 MB统一 (CPUID)缓存L3:无 或者手

所以我在汇编ARMv8中编程,我想知道是否有任何指令,如x86中的指令,用于恢复有关CPU的信息。这是我需要的信息:

(CPUID)签名:660f01

(CPUID)功能:MMX、AMD64、SSE、SSE2、SSE3、SSE3、SSE4.1、SSE4.2、AES、AVX、CLMUL、FMA、FMA4、XOP、PSE、PSE-36、NX、SVM

(CPUID)缓存一级:4 x 32 KB数据,4 x 96 KB指令 (CPUID)缓存二级:4 x 1 MB统一 (CPUID)缓存L3:无


或者手臂上有类似的东西。例如,我知道ARMS不支持MMX,但它支持NEON。如何检查该处理器是否支持它?

您通常只需要检查是否支持所有单独的功能。 aarch64包括霓虹灯。 对于linux上的arm32,您通常从
/proc/self/auxv
参见

在windows msvc上,您通常只需检查
ifdef平台\u windows\u手机
。这保证了霓虹灯。类似的叮当声检查功能只有
\uuuuu ARM\uu NEON\uuu
和通过静态定义的各种功能

有一个状态寄存器,您可以从中读取。 我也有一些特定于arm的asm本质,但它们太脆弱了。该库可以提供更好的帮助。

(此答案适用于AArch64。)

基于一些读取和实验,您可以使用
mrs
指令读取一些系统寄存器,以获取有关CPU及其功能的信息。这方面的参考是Armv8架构参考手册;第K14.3.3节有一个ID寄存器列表(在我的修订版中,可能不是最新版本)

一对可能特别感兴趣的夫妇:

  • MIDR_EL1
    包含有关CPU的一般信息:实施者(如Arm、Broadcom、NVidia)、变体、体系结构、零件号、版本

  • REVIDR\u EL1
    包含实施修订信息。(我的树莓皮4是零。)

  • IID_AA64_ISAR{0,1}\u EL1
    有关于在设备上实现哪些指令的信息:CRC。SHA、原子数、随机数等

似乎没有任何东西可以直接与x86的CPUID产生的人类可读的品牌字符串相比

下面是我在Linux下使用gcc测试的一些代码。一些寄存器在用户空间中可能不可读,并导致异常,因此程序处理产生的信号,以便在这种情况下能够继续

我还不能很好地理解异常级系统,以确定它们是否真的直接读取硬件寄存器,或者它们是否陷阱,以便内核和/或虚拟机监控程序能够模拟和/或检查结果

#包括
#包括
#包括
#包括
#包括
在这里签名;
无效信号处理器(int信号){
(无效)签名;
siglongjmp(在这里,1);
}
#定义打印注册\
做{\
if(sigsetjmp(go_here,1)){\
printf(“%s:\tSIGILL\n”,s)\
}否则{\
无符号长ret\
asm(“mrs%0,s:=r”(ret))\
printf(“%s:\t%#lx\n”,s,ret)\
}                                                       \
}而(0)
内部主(空){
struct-sigaction-sa;
sigemptyset(和sa.sa_面具);
sa.sa_标志=0;
sa.sa_handler=sigill_handler;
if(sigaction(SIGILL,&sa,NULL)<0){
佩罗尔(“sigaction”);
出口(2);
}
打印注册(“MIDR EL1”);
打印注册(“VPIDR EL2”);
打印注册(“修订注册1”);
打印注册(“ID\U AA64ISAR0\U EL1”);
打印注册(“ID\U AA64ISAR1\U EL1”);
打印注册(“MVFR0\U EL1”);
打印注册(“MVFR1\U EL1”);
打印注册(“MVFR2\U EL1”);
返回0;
}

arm中没有任何指令提供CPU实现的功能。但有一些系统寄存器指示CPU支持哪些功能。这些通常以ID_*开始,例如,ID_AA64PFR0_EL1是体系结构处理器功能寄存器。您可以参考ARM体系结构参考手册以获取系统注册列表和有关支持功能的详细信息。这些不能从用户应用程序访问,只能使用MRS指令从更高的异常级别访问。还要注意,体系结构还提供了捕获访问的方法。

有这样一种方法。查看架构参考手册。不幸的是,我不知道细节。只需在《体系结构参考手册》中查找CPUID。@old_timer:我这样做了,但唯一的点击似乎是指AArch32,如果没有更多的背景,就很难理解。好的,这是一系列寄存器,为您提供了大量cpu信息,什么类型的指令或有时特定的指令可用,等等。是的,但很难理解在哪里可以找到什么,而且我没有看到任何与Intel的CPUID直接等价的东西。这看起来确实像是一个问题,专家的总结可以为一个人节省大量的腿部工作和盲区。实际上,除了ARMv8上的NEON之外,还有更多相关的指令集扩展。Linux如何理解CPU的功能,因此,它可以在ARMv7和更早版本上填充
/proc/self/auxv
/proc/cpuinfo
?@PeterCordes,Linux需要编译它,因为在运行时显然没有机制可以发现(可能有一种机制只对特权代码可用,但我不知道细节)@fuz:也许捕获无效的指令异常,然后尝试执行一些事情?您可以使用SIGILL的信号处理程序在用户空间中实现这一点。但只针对可以通过异常或缺少异常来检测的功能,而不是原子性保证之类的东西。(如果2寄存器
ldm有任何