Как использовать счетчики производительности внутри ядра?
Я хочу получить доступ к счетчикам производительности внутри ядра. Я нашел много способов использовать счетчики производительности в пространстве пользователя, но не могли бы вы рассказать мне, как использовать их в пространстве ядра.
Пожалуйста , не указывайте имя инструмента, я хочу написать свой собственный код, предпочтительно модуль ядра. Я использую Ubuntu с ядром 3.18.1.
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;
}
Вы должны проверить, если ваш процессор и другие HW поддержки вам нужны. Попробуйте заглянуть в исходный код oprofile. Он имеет модуль ядра и пользовательский интерфейс API. Например, вы можете вырезать часть интересного кода из части модуля ядра oprofile и использовать его в своем модуле. Я полагаю, у вашего модуля должно быть несколько читателей или слушателей с буферами окружности для хранения событий. Вы также можете заглянуть внутрь linux / drivers / oprofile и соответствовать linux / arch /.../ oprofile. Внутри make menuconfig вы можете настроить его как модуль или встроенный модуль и добавить дополнительные таймеры. Доступные события и счетчики вы можете найти в разделе oprofile / events / инструмента oprofile (TLB_MISS, CPU_CYCLES, CYCLES_DATA_STALL, ...).
Регистр мониторинга производительности ARM
В linux/arch/arm64/kernel/perf_regs.c вы можете найти конкретные детали для arm.