我的目标是使用 ARMv8 寄存器读取 CPU 周期,并且 kmod 和我的测试程序在我的 ARM 笔记本电脑上运行良好。但是,在我的 db410c 板上加载 kmod 后,执行二进制文件访问时pmccntr_el0
收到非法指令。
任何人都可以帮助我理解为什么?因为我已经通过PMUSERENR_EL0_EN
位启用了用户模式访问。
这是测试程序的示例代码
#include <stdio.h>
#include <stdint.h>
static inline uint64_t
read_pmccntr(void)
{
uint64_t val;
asm volatile("mrs %0, pmccntr_el0" : "=r"(val));
return val;
}
int main(){
uint64_t counter = read_pmccntr();
printf("value:%lu\n",counter);
return 0;
}
操作系统版本:
- 笔记本电脑:Linux debian-gnu-linux-10 4.19.0-18-arm64
- db410c:Linux linaro-developer 5.15.0-stm-qcomlt-arm64
答案1
db410c 支持该指令吗?
另外,你用的是64位吗?我认为 32 位不支持 pmccntr_el0。
您可以尝试以下代码,检查问题是否是db410c不支持该指令。 (以下代码适用于 32 位):
unsigned int cc;
asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(cc));
return cc;
在这里您可以找到更多监控性能的方法 http://wiki.dreamrunner.org/public_html/Embedded-System/Cortex-A8/PerformanceMonitorControlRegister.html
另外,请记住,在编译时,添加标志 -O3 将产生截然不同的性能结果。
答案2
找出原因,需要正确启用用户模式访问位。