如何在内核中使用性能计数器?

时间:2015-04-21 07:10:15

标签: linux ubuntu linux-kernel kernel-module performancecounter

我想访问内核中的性能计数器。我找到了许多在用户空间中使用性能计数器的方法,但是你能告诉我一些在内核空间中使用它们的方法。

不要指定工具名称,我想编写自己的代码,最好是内核模块。我在内核3.18.1上使用Ubuntu。

2 个答案:

答案 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的详细信息。