Как использовать счетчики производительности внутри ядра?

Я хочу получить доступ к счетчикам производительности внутри ядра. Я нашел много способов использовать счетчики производительности в пространстве пользователя, но не могли бы вы рассказать мне, как использовать их в пространстве ядра.

Пожалуйста , не указывайте имя инструмента, я хочу написать свой собственный код, предпочтительно модуль ядра. Я использую 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.

Другие вопросы по тегам