【问题标题】:How do I use performance counters inside of the kernel?如何在内核内部使用性能计数器?
【发布时间】:2015-06-28 04:55:10
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 你为什么只使用 perfeveset0 寄存器而不使用 perfctr0 ?或者我们将在哪里以及如何使用这两个?此外,您能否编写一个完整的工作示例,因为这将对以后搜索它的人有所帮助。
    • 你可以在内核模块中使用它或者直接修改linux内核。
    • 0xc1 是 perfctr0 我们使用 perfeventsel0 设置事件并从 perfctr0 读取 ctr 值。
    【解决方案2】:

    您应该检查您是否需要 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 的具体细节。

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 2014-02-19
      • 2014-10-29
      • 1970-01-01
      • 2019-06-20
      • 2023-03-10
      • 2019-08-01
      • 2013-06-08
      • 1970-01-01
      相关资源
      最近更新 更多