Подтвердить что ты не робот

Perf: Не удалось записать символ перемещения ссылки ядра

Я скомпилировал perf для моего ядра (3.11.10). Во время компиляции некоторые библиотеки отсутствовали, поэтому я их установил.

Но теперь, когда я запускаю perf, я получаю следующее сообщение:

Couldn't record kernel reference relocation symbol
Symbol resolution may be skewed if relocation was used (e.g. kexec).
Check /proc/kallsyms permission or run as root.

Kernel address maps (/proc/{kallsyms,modules}) were restricted.
Check /proc/sys/kernel/kptr_restrict before running 'perf record'
If some relocation was applied (e.g. kexec) symbols may be misresolved.
Samples in kernel modules can't be resolved as well.

Поскольку я использую собственное ядро ​​сборки, самым очевидным объяснением для меня является то, что в моем ядре отсутствует какая-то опция. Если да, то как я могу узнать, чего не хватает?

Я не уверен, о чем жалуется perf. Как я могу это исправить?

EDIT:

/proc/kallsyms не существует и /proc/sys/kernel/kptr_restrict содержит 0:

$ cat /proc/sys/kernel/kptr_restrict
0

Я сам скомпилировал ядро, и возможно, что у него отсутствует какой-то вариант. Что это за /proc/kallsyms? Как включить его в ядре?

4b9b3361

Ответ 1

Каково ваше ядро? Это из дистрибутива linux, который вы используете или он скомпилирован вами (как вы его установили)?

В первой части предупреждения говорится о /proc/kallsyms - вы можете показать вывод команды (начатой ​​с того же пользователя, с которого вы запускали perf)

ls -l  /proc/kallsyms
cat /proc/kallsyms | head

Вторая часть сообщения perf говорит о настройке kptr_restrict sysctl. Можете ли вы сделать

cat /proc/sys/kernel/kptr_restrict

чтобы проверить настройку. В принципе, для профилирования символов ядра вы должны либо отключить kptr_restrict, установив его на ноль (как описано в https://lwn.net/Articles/420403/ или https://code.google.com/p/dart/wiki/Profiling):

# Run as root user - e.g. after doing "sudo bash"
echo 0 > /proc/sys/kernel/kptr_restrict

или (fooobar.com/questions/310359/...)

sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"

или

echo 0 | sudo tee /proc/sys/kernel/kptr_restrict

или вы всегда можете запустить perf от пользователя root.

После установки kptr_restrict в ноль или при запуске perf из root вы не должны получать предупреждения о kallsyms и сможете профилировать функции ядра.

Обновление: кажется, что perf record всегда хочет получить доступ к kallsyms/ограниченным kptrs, даже с событием только для пользователей (-e cycles:u)