无法加载模块:不同意符号module_layout的版本


12

按照本教程编写我的第一个驱动程序。

Makefile是:

# Makefile – makefile of our first driver

# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
    obj-m := ofd.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
    KERNEL_SOURCE := /usr/src/linux 3.8
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif

驱动程序代码为:

* ofd.c – Our First Driver code */
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>

static int __init ofd_init(void) /* Constructor */
{
    printk(KERN_INFO "Namaskar: ofd registered");
    return 0;
}

static void __exit ofd_exit(void) /* Destructor */
{
    printk(KERN_INFO "Alvida: ofd unregistered");
}

module_init(ofd_init);
module_exit(ofd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>");
MODULE_DESCRIPTION("Our First Driver");

在制作过程中没有错误。但是当我使用时,insmod ofd.ko我无法加载它。在dmesg上面说:

不同意符号module_layout的版本

  • uname -r 返回“ 3.8.0-38-generic”,内核源代码也为3.8。
  • modprobe -f ofd.ko 也失败了

也:

#56~precise1-Ubuntu SMP Thu Mar 13 16:23:47 UTC 2014
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.4 LTS
Release:    12.04
Codename:   precise

怎么了?


一些明显的评论。首先,内核源代码是否与Ubuntu内核完全相同?您应该使用与您的内核完全对应的Ubuntu内核源代码。由于发行版会修补其内核,因此上游可能无法正常工作。其次,afaik可以针对内核头进行编译,不需要内核源代码。标头也应以二进制包的形式提供。您可能还想看看Debian Kernel Handbook,它在Debian上有关于内核等的指导性内容,这也适用于Ubuntu。
Faheem Mitha 2014年

Answers:


13

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

对于使用构建的内核CONFIG_MODVERSIONS,版本号可以不同,但​​是数据结构的布局必须相同。该选项在Ubuntu内核中被激活。使用此选项,除了标题之外,还需要针对正确的Module.symvers文件编译模块。与大多数发行版一样,Ubuntu将此文件包含在与编译产生的内核头文件相同的程序包中。Ubuntu的内核头包被称为,例如。linux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.