内核二进制文件和内核模块构建源的位置?

内核二进制文件和内核模块构建源的位置?

我正在尝试在 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 上的工作原理是一样的。在构建和安装时,这些内容会自动出现在正确的位置。

相关内容