如何为不同的内核版本编译内核模块?

如何为不同的内核版本编译内核模块?

我安装了以下内核:

[root@localhost ~]# uname -r
2.6.32-573.el6.x86_64

以及以下内核源代码:

linux-2.6.32-573.1.1.el6.x86_64

我正在尝试使用该内核源代码为我自己的内核编译内核模块。

在内核源代码的 Makefile 中,我编辑了 EXTRAVERSION 设置:

[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# cat Makefile | grep "EXTRAVERSION ="
EXTRAVERSION = 2.6.32-573.el6.x86_64

并使用以下命令来编译模块:

[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# make M=~/hw/
  LD      /root/hw/built-in.o
  CC [M]  /root/hw/hello_world.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/hw/hello_world.mod.o
  LD [M]  /root/hw/hello_world.ko.unsigned
  NO SIGN [M] /root/hw/hello_world.ko

但是当我尝试安装它时,我收到以下错误:

[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# insmod ~/hw/hello_world.ko
insmod: error inserting '/root/hw/hello_world.ko': -1 Invalid module format

modinfo 的输出是:

[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# modinfo ~/hw/hello_world.ko
filename:       /root/hw/hello_world.ko
license:        GPL
srcversion:     A8BB878B88F36D3A046026C
depends:
vermagic:       2.6.32-573.el6.x86_64 SMP mod_unload modversions

我可以为当前内核编译模块而无需安装其内核源吗?

附加信息:

操作系统:最低 CentOS 6.7。分发二进制文件。

遵循本指南:http://wiki.centos.org/HowTos/I_need_the_Kernel_Source

并从这里下载了 linux-2.6.32-573.1.1.el6.x86_64 的源代码:

http://vault.centos.org/6.7/updates/Source/SPackages

我知道我可以下载特定内核的源代码,但最终我实际上想为我找不到源代码的内核版本构建模块(仍然是 2.6.32),所以这就是我想要的原因这样做。

答案1

其实这里有两点需要关心:

正在运行的内核版本是否与我们正在使用的源相同。由于先前编译的内核可能不具有最新版本中可能使用的所有依赖项,而使用最新内核源编译外部模块可能依赖于代码的任何部分,这些部分仅存在于最新版本中。因此,建议使用我们使用外部模块的最新版本内核。

二、用于内核编译的.config 文件 您可以将其从文件系统的/boot/config(current-version)* 复制到内核源代码顶层目录中的.config。当前版本我们可以从 uname -r 获取它

因此,如果运行版本(使用命令 uname -r 检查)不等于下载的源代码,那么您需要编译并使用新内核,或者下载与运行内核相同版本的内核。对于内核编译,请使用引导目录中存在的配置文件,按照上述方式复制它。

然后您可以继续以正常方式编译外部模块并加载正在运行的内核,没有任何问题。

相关内容