我正在阅读 Salzman 的《Linux 内核模块编程指南》,我想知道文件 linux/kernel.h 的位置。我用 找不到它find
。或者更确切地说,我发现的文件printk
中没有任何优先级宏。
答案1
linux/kernel.h
用于模块构建的标头是部分内核源码。当模块在内核源代码树中构建时,这就是所使用的版本。
对于外部模块构建,构建过程会在/lib/modules/$(uname -r)/build/include/linux/sched.h
.该文件由内核头包提供,例如在 Debian 衍生品上,该linux-headers-$(uname -r)
软件包。
它/usr/include/linux/kernel.h
适用于用户进程,而不是内核模块。
优先printk
宏现在位于linux/printk.h
和linux/kern_levels.h
。我猜你正在阅读原始指南,基于2.6内核系列;对于现代内核,你应该阅读更新后的指南(目前用于5.6.7)。
答案2
在我的 Mint 18.x 系统上,但build-essential
没有安装任何完整的源代码树 -
user@localhost:~ $ locate kernel.h | grep \/kernel.h$
/usr/include/linux/kernel.h
/usr/src/linux-headers-4.4.0-21/include/linux/kernel.h
/usr/src/linux-headers-4.4.0-21/include/uapi/linux/kernel.h
/usr/src/linux-headers-4.4.0-21-generic/include/config/debug/kernel.h
/usr/src/linux-headers-4.4.0-21-generic/include/config/firmware/in/kernel.h
/usr/src/linux-headers-4.4.0-53/include/linux/kernel.h
/usr/src/linux-headers-4.4.0-53/include/uapi/linux/kernel.h
/usr/src/linux-headers-4.4.0-53-generic/include/config/debug/kernel.h
/usr/src/linux-headers-4.4.0-53-generic/include/config/firmware/in/kernel.h
/usr/src/linux-headers-4.8.0-53/include/linux/kernel.h
/usr/src/linux-headers-4.8.0-53/include/uapi/linux/kernel.h
/usr/src/linux-headers-4.8.0-53-generic/include/config/debug/kernel.h
/usr/src/linux-headers-4.8.0-53-generic/include/config/firmware/in/kernel.h
根据杰夫对你的问题的评论,我认为最多times/usr/include/linux/kernel.h
将被使用,
我确信如果您提取内核树 tarball,它的目录结构中也可能有另一个副本。快速检查显示它们都是不同大小的......或者是空文件。
答案3
这个问题的答案可能很大程度上取决于Linux发行版... SUSE/SLES vs RHEL/Centos/Fedora vs debian vs mint 等等,
它是否也会根据 linux 发行版与 debian 的 RPM 风格而有所不同?
无论如何,我的经验主要是使用 SLES 11.4 版,为此我可以保证
/usr/src/linux/include/linux/kernel.h
where for me /usr/src/linux -> /usr/src/linux-3.0.101-108.21
uname -r for me returns 3.0.101-108.21-default
当我将内核更新到较新版本时,软链接会随着 kernel.h 一起发生相应变化。我认为可以肯定地说,如果您正在寻找内核模块它的版本kernel.h
将位于与相关的某个文件夹下uname -r
,并成为其一部分内核源代码适用于您的 Linux 发行版的软件包。