我想访问内核中的性能计数器。我找到了许多在用户空间中使用性能计数器的方法,但是你能告诉我一些在内核空间中使用它们的方法。
请不要指定工具名称,我想编写自己的代码,最好是内核模块。我在内核3.18.1上使用Ubuntu。
答案 0 :(得分:2)
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;
}
答案 1 :(得分:1)
您应该检查您是否需要CPU和其他硬件支持。尝试查看oprofile源代码。它有内核模块和用户空间api。例如,您可以从oprofile内核模块部件中删除部分有趣的代码,并将其用于您的模块。我猜你模块应该有几个读者或听众用圆形缓冲区来保存事件。您还可以查看linux / drivers / oprofile并与linux / arch /.../ oprofile对应。在make menuconfig中,您可以将其配置为模块或内置,并添加其他计时器。您可以在oprofile / events / oprofile工具(TLB_MISS,CPU_CYCLES,CYCLES_DATA_STALL,...)下找到可用的事件和计数器。
ARM Performance monitoring register
在linux / arch / arm64 / kernel / perf_regs.c下,您可以找到特定于ARM的详细信息。