用户空间程序在读取 pmccntr_el0 时收到“非法指令”(启用用户模式访问)

用户空间程序在读取 pmccntr_el0 时收到“非法指令”(启用用户模式访问)

我的目标是使用 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

找出原因,需要正确启用用户模式访问位。

相关内容