Когда мы включаем запись perf call-графа (например, perf запись -g), инструмент perf может детально разбивать измерения каждой маленькой функции на пути вызова, независимо от того, ядро это или пользовательские функции.
Мне интересно, как perf может добиться этого для функций ядра. Я предполагаю, что perf использует kprobe
для обратного вызова при каждом вызове функции ядра. Как то так:
- Позвоните в foo ()
- Ловушка для основного слоя kprobe
- kprobe обратный вызов обработчика perf, который настраивает PMC
- Run foo ()
- ret of foo ()
- Снова перехватить слой ядра kprobe
- kprobe обратный вызов обработчика perf, который читает PMC
- Вернуться к звонящему
Это правильно? Или Linux на самом деле использует какую-то другую магию? Спасибо.