致命:找不到模块 hello.ko

致命:找不到模块 hello.ko

我正在使用CentOS-6.5,默认内核是2.6.32-431.11.2.el6.x86_64.我下载2.6.32并构建了该内核(在 下/lib/modules/2.6.32)。

我为简单程序编写了一个模块hello world。该程序在以下情况下工作:

Makefile:(/lib/modules/$(shell uname -r)/build 默认内核)

$ sudo insmod hello.ko

$ dmesg
module inserted..
hello world..

我的程序不适用于以下情况:

Makefile:(/lib/modules/3.2.32/build 新建内核)

$ sudo insmod hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format

dmesg: 
hello: disagrees about version of symbol module_layout

我尝试了modprobe这两种情况,它显示以下错误

FATAL: Module hello not found.

如何使用2.6.32内核编译我的模块?

答案1

Linux 内核包含的数据结构的布局不仅因版本而异,而且还取决于编译选项。因此,当您编译内核模块时,您不仅需要内核源代码中的头文件,还需要内核编译期间生成的一些头文件。仅仅解压内核源代码是不够的。

对于使用 构建的内核CONFIG_MODVERSIONS,版本号可以不同,但​​数据结构的布局必须相同。该选项在 Ubuntu 内核中被激活。使用此选项,除了标头之外,还需要根据正确的Module.symvers文件编译模块。 CentOS 与大多数发行版一样,将此文件包含在与编译生成的内核头文件相同的包中。 CentOS内核头包称为kernel-headers;确保安装与您正在编译的内核相匹配的版本。也可以看看内核包概述在 CentOS 文档中和您不需要完整的内核源代码在维基上。

对于没有构建的内核CONFIG_MODVERSIONS(如果您编译了自己的内核,则可能是这种情况),加载模块时的检查是简单的版本检查。您可以获取解压的内核源代码,复制.config在编译运行的内核期间使用的内核源代码,然后运行make modules_prepare​​.您有责任验证对内核所做的任何修补程序不会影响二进制兼容性。

答案2

你在哪里下载2.6.32内核?

2.6.32-431.11.2.el6.x86_64如果您使用 CentOS,则只需从 CentOS 存储库安装内核源代码,因为 RedHat 使用修补后的内核。还请确保您构建的内核源代码树的配置与运行内核的配置完全相同。

config-*通常目录中有文件/boot/,或者您可以尝试从/proc/config.gz.

您还可以参考 CentOS 官方 HowTos:

相关内容