【发布时间】:2015-06-28 04:55:10
【问题描述】:
我想访问内核中的性能计数器。我找到了很多在用户空间使用性能计数器的方法,但是你能告诉我一些在内核空间中使用它们的方法吗?
请不要指定工具名,我想自己写代码,最好是内核模块。我正在使用带有内核 3.18.1 的 Ubuntu。
【问题讨论】:
标签: linux ubuntu linux-kernel kernel-module performancecounter
我想访问内核中的性能计数器。我找到了很多在用户空间使用性能计数器的方法,但是你能告诉我一些在内核空间中使用它们的方法吗?
请不要指定工具名,我想自己写代码,最好是内核模块。我正在使用带有内核 3.18.1 的 Ubuntu。
【问题讨论】:
标签: linux ubuntu linux-kernel kernel-module performancecounter
http://www.cise.ufl.edu/~sb3/files/pmc.pdf http://www.cs.inf.ethz.ch/stricker/lab/doc/intel-part4.pdf 第一个 pdf 包含有关如何使用 pmc 的说明。
第二个包含 perfeventsel0 和 perfeventsel1 的地址。 我在下面展示了一个示例。您需要根据您的要求设置事件编号和 umask。
void SetUpEvent(void){
int reg_addr=0x186;
int event_no=0x0024;
int umask=0x3F00;
int enable_bits=0x430000;
int event=event_no | umask | enable_bits;
__asm__ ("wrmsr" : : "c"(reg_addr), "a"(event), "d"(0x00));
}
/* Read the performance monitor counter */
long int ReadCounter(void){
long int count;
long int eax_low, edx_high;
int reg_addr=0xC1;
__asm__("rdmsr" : "=a"(eax_low), "=d"(edx_high) : "c"(reg_addr));
count = ((long int)eax_low | (long int)edx_high<<32);
return count;
}
【讨论】:
您应该检查您是否需要 CPU 和其他硬件支持。尝试查看 oprofile 源代码。它有内核模块和用户空间 api。例如,您可以从 oprofile 内核模块部分中剪切部分有趣的代码并将其用于您的模块中。我猜你的模块应该有几个带有圆形缓冲区的读取器或侦听器来保存事件。您还可以查看 linux/drivers/oprofile 内部并对应 linux/arch/.../oprofile。在 make menuconfig 中,您可以像模块或内置一样对其进行配置,并添加额外的计时器。您可以在 oprofile 工具(TLB_MISS、CPU_CYCLES、CYCLES_DATA_STALL、...)的 oprofile/events/ 下找到可用的事件和计数器。
ARM Performance monitoring register
在 linux/arch/arm64/kernel/perf_regs.c 下你可以找到 arm 的具体细节。
【讨论】: