Debian 9内核模块开发:无法找到kernel trace.h头文件求助
你在开发内核模块时想利用trace子系统的正则过滤功能,却碰到头文件找不到的问题,我来帮你一步步梳理解决:
1. 先明确内核中trace正则相关头文件的实际位置
Linux内核4.9版本里并没有直接名为trace.h的顶层头文件,trace子系统的相关头文件都集中在include/trace/目录下。而用于trace事件过滤的正则功能,实际依赖的是内核通用的正则实现,对应的核心头文件是<linux/regex.h>,trace子系统的过滤逻辑相关头文件则是<trace/events/filter.h>。
你可以在终端执行这条命令,确认系统里这些文件的位置:
find /usr/src/linux-headers-4.9.0-3-*/include -name "regex.h" -o -name "*filter*.h"
正常情况下会输出:
/usr/src/linux-headers-4.9.0-3-common/include/linux/regex.h/usr/src/linux-headers-4.9.0-3-amd64/include/trace/events/filter.h
2. 检查内核头文件是否完整安装
如果执行上面的命令找不到文件,说明你的内核头文件包可能不全。Debian 9中,除了你已安装的linux-headers-4.9.0-3-amd64和linux-headers-4.9.0-3-common,还可以安装内核源码包来获取完整头文件:
sudo apt-get install linux-source-4.9
安装后源码会放在/usr/src/linux-source-4.9/目录下,解压这个tar.xz包后,里面的include/目录包含所有完整的内核头文件。
3. 配置IDE的头文件路径
IDE提示找不到头文件,大概率是因为它没正确识别内核头文件的路径。你需要把以下两个路径添加到IDE的C/C++包含路径中:
/usr/src/linux-headers-4.9.0-3-amd64/include/usr/src/linux-headers-4.9.0-3-common/include
如果安装了内核源码,也可以加上解压后的/usr/src/linux-source-4.9/include路径。
4. 内核模块中正确的头文件引用
在你的内核模块代码里,要使用trace子系统的正则过滤功能,应该这样引用头文件:
#include <linux/regex.h> #include <trace/events/filter.h>
之前你想找的trace.h其实并不存在,是对内核头文件结构的一点小误解~
额外提示
内核态的正则实现和用户态regex.h差异很大,支持的语法也更有限,开发时可以参考内核源码里的示例(比如trace/filter.c中的代码),避免踩不必要的坑。
内容的提问来源于stack exchange,提问作者wiKon

