自定义eBPF kfunc调用失败:内核函数不允许调用问题排查及解决
eBPF调用自定义kfunc触发内核验证器报错:'calling kernel function %s is not allowed'
问题背景
- 环境:Ubuntu 24.04.1 LTS,内核版本6.8.0-48-generic
- 操作:为论文编写eBPF代码,需调用自定义kfunc,已按eunomia教程和内核文档实现LKM,模块加载时dmesg无报错,但运行时内核验证器抛出
calling kernel function %s is not allowed错误 - 验证:尝试官方示例也出现相同问题
原因分析
通过查看内核验证器源码定位到:
- 验证器无法获取kfunc的元数据,进而无法检索kfunc的权限标志
- 根本原因是程序类型不兼容:使用
SEC("tracepoint/syscalls/*")声明的程序属于BPF_PROG_TYPE_TRACEPOINT类型,而kfunc仅支持BPF_PROG_TYPE_TRACING等特定类型的eBPF程序
解决方案
将eBPF程序的挂载类型从tracepoint切换为kprobes(使用SEC("kprobe/[目标函数名]")声明程序),即可解决验证器报错问题。
内容的提问来源于stack exchange,提问作者hellothere
相关产品推荐
相关产品推荐

