我正在使用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: