我正在尝试在 Linux 中设置内核模块开发环境。我已经在主文件夹中构建了内核,并且希望将源代码和二进制文件放置到正确的位置,以便正确包含。
构建内核模块的示例包括以下内容:
#include <linux/init.h>
#include <linux/module.h>
链接器寻找这些标头的绝对路径是什么?
答案1
我一般是这样处理这个问题的。我使用的是 Fedora 19 系统,但这适用于任何提供locate
服务的发行版。
$ locate "linux/init.h" | grep include
/usr/src/kernels/3.13.6-100.fc19.x86_64.debug/include/linux/init.h
/usr/src/kernels/3.13.7-100.fc19.x86_64.debug/include/linux/init.h
/usr/src/kernels/3.13.9-100.fc19.x86_64/include/linux/init.h
/usr/src/kernels/3.13.9-100.fc19.x86_64.debug/include/linux/init.h
您的路径会有所不同,但关键是您想要locate
查找所包含的内容(“linux/init.h”)并过滤这些结果以查找关键字include
。
还有一些特定于发行版的方法可以使用 RPM (Redhat) 或 APT (Debian/Ubuntu) 来搜索这些位置。
海湾合作委员会
但请注意,C/C++ 文件中的路径是相对的:
#include <linux/init.h>
这样,当您调用编译器时gcc
,您可以覆盖您想要使用的包含文件的位置。这是通过开关控制的-I <dir>
。
摘自 man gcc
-I dir
Add the directory dir to the list of directories to be searched for
header files. Directories named by -I are searched before the
standard system include directories. If the directory dir is a
standard system include directory, the option is ignored to ensure
that the default search order for system directories and the special
treatment of system headers are not defeated . If dir
begins with "=", then the "=" will be replaced by the sysroot
prefix; see --sysroot and -isysroot.
外部模块
有一篇文章讨论了如何将自己的内核模块的开发合并到 Linux 内核附带的“构建环境”中。文章标题为:驱动移植:编译外部模块。本文还介绍了内核 makefile 的组织:生成文件.txt。
对于内核新手来说,还有这篇文章:内核头文件来自 kernelnewbies.org 网站。
笔记:内核使用 KBuild 系统,该系统在此处作为内核附带的文档的一部分进行介绍。
参考
答案2
答案通常是特定于发行版的,因为它们可能有特定的机制来执行此操作。对于 Debian 来说有Debian Linux 内核手册。由于 Ubuntu 本质上是 Debian,所以所有这些都应该适用。如果我理解正确的话,您是在询问安装内核。一种方法,一种好的方法,是为内核和内核头文件构建一个二进制包,并安装它们,本手册向您展示了如何操作。也可以看看我对“如何离线升级 Debian Wheezy 内核?”的回答。这个答案确实需要一些清理工作。
请注意,使用现有的 Debian/Ubuntu 内核和内核头二进制包是完全合理的事情,并且不需要编译。
答案3
内核有一个deb-pkg
目标。在 debian 上,make deb-pkg
使用sudo dpkg -i
两个生成的包(在../
)对我来说就像一个魅力。我认为它在 Ubuntu 上的工作原理是一样的。在构建和安装时,这些内容会自动出现在正确的位置。