ARM 的时钟周期计数保存在PMCCNTR 寄存器,不像x86用户态可以直接读取,需内核态使能,一种是在内核中使能,比如init,比较简单的是在模块中使能。
本来写了两个,arm32一个,arm64一个,方便对比合在了一起。
只测试了32位cortex-a9双核, 还有 个64位a76 a55。
enpmu.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/smp.h>
MODULE_AUTHOR("cn");
MODULE_LICENSE("GPL");
MODULE_VERSION("0.0");
#if !defined(__arm__) && !defined(__aarch64__)
#error module only support arm32 arm64.
#endif
#ifdef __aarch64__
typedef unsigned long ulint; //64
#elif defined __arm__
typedef unsigned int ulint; //32
#endif
static void en_access(void*)
{
ulint i=0,tmpvar=0;
#ifdef __aarch64__
asm volatile("mrs %0, mpidr_el1 ":"=r"(i));
i = (i >>8) &0xff;
#else
asm volatile("mrc p15,0,%0,c0,c0,5 ":"=r"(i));
i = i & 3;
#endif
asm