Kernel 性能:无法';t记录内核引用重新定位符号

Kernel 性能:无法';t记录内核引用重新定位符号,kernel,perf,Kernel,Perf,我已经为我的内核(3.11.10)编译了perf。在编译过程中,一些库丢失了,所以我安装了它们 但现在,当我运行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 add

我已经为我的内核(3.11.10)编译了
perf
。在编译过程中,一些库丢失了,所以我安装了它们

但现在,当我运行
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
到底在抱怨什么。如何解决此问题?

编辑:

/proc/kallsyms
不存在,并且
/proc/sys/kernel/kptr\u restrict
包含
0

$ cat /proc/sys/kernel/kptr_restrict
0

我自己编译了内核,它可能缺少一些选项。这是什么?如何在我的内核中启用它?

您的内核是什么?它是来自您使用的linux分发版还是由您编译的(您是如何安装的)

警告的第一部分是关于/proc/kallsyms的-您能显示命令的输出吗(从您用来运行perf的同一个用户开始)

perf
消息的第二部分说明了kptr\u restrict sysctl设置。你能做什么

cat /proc/sys/kernel/kptr_restrict
检查设置。基本上,要分析内核符号,您应该通过将其设置为零来禁用kptr_restrict(如或中所述):

或()

或者您可以始终从root用户运行
perf

在将kptr_restrict设置为零或从根目录运行perf时,您应该不会得到关于kallsyms的警告,并且能够评测内核函数


更新:似乎
perf record
总是希望访问kallsyms/restricted kptrs,即使只有用户空间事件(
-e cycles:u

本教程对我来说非常有效

从教程中复制:

$ cat /proc/sys/kernel/kptr_restrict
1
$ echo 0 > /proc/sys/kernel/kptr_restrict
$ cat /proc/sys/kernel/kptr_restrict
0
# Run as root user - e.g. after doing "sudo bash"
echo 0 > /proc/sys/kernel/kptr_restrict
sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"
echo 0 | sudo tee /proc/sys/kernel/kptr_restrict
$ cat /proc/sys/kernel/kptr_restrict
1
$ echo 0 > /proc/sys/kernel/kptr_restrict
$ cat /proc/sys/kernel/kptr_restrict
0