2015-04-21 57 views
2

我想訪問內核中的性能計數器。我發現了許多在用戶空間中使用性能計數器的方法,但是能否告訴我一些在內核空間中使用這些方法的方法。如何在內核中使用性能計數器?

不指定工具名稱,我想寫我自己的代碼,最好是內核模塊。我在內核3.18.1上使用Ubuntu。

回答

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 /弓/ arm64 /內核/ perf_regs.c你可以找到武裝的具體細節。

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

您正試圖通過指令來獲取L2訪問請求擊穿。對 ??? – Ankit

+0

爲什麼只使用perfeveset0寄存器而不使用perfctr0?或者我們將在哪裏以及如何使用這兩個?此外,你可以編寫一個完整的工作示例,因爲它會對稍後搜索它的人員有所幫助。 – Ankit

+0

你可以在內核模塊中使用它或直接修改linux內核。 – njn1234