学习内核模块,module.ko导致模块已加载?

时间:2016-07-14 00:49:17

标签: linux linux-kernel kernel kernel-module

我现在正在学习内核模块,因此我在虚拟机中设置了带kernel 4.4.0-28-generic的Ubuntu 16.04。

我安装了这个包

# dpkg -l | grep linux
ii  console-setup-linux                  1.108ubuntu15                            all          Linux specific part of console-setup
ii  libselinux1:amd64                    2.4-3build2                              amd64        SELinux runtime shared libraries
ii  linux-base                           4.0ubuntu1                               all          Linux image base package
ii  linux-firmware                       1.157.2                                  all          Firmware for Linux kernel drivers
ii  linux-generic                        4.4.0.28.30                              amd64        Complete Generic Linux kernel and headers
ii  linux-headers-4.4.0-28               4.4.0-28.47                              all          Header files related to Linux kernel version 4.4.0
ii  linux-headers-4.4.0-28-generic       4.4.0-28.47                              amd64        Linux kernel headers for version 4.4.0 on 64 bit x86 SMP
ii  linux-headers-generic                4.4.0.28.30                              amd64        Generic Linux kernel headers
ii  linux-image-4.4.0-28-generic         4.4.0-28.47                              amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-28-generic   4.4.0-28.47                              amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-generic                  4.4.0.28.30                              amd64        Generic Linux kernel image
ii  linux-libc-dev:amd64                 4.4.0-28.47                              amd64        Linux Kernel Headers for development
ii  linux-sound-base                     1.0.25+dfsg-0ubuntu5                     all          base package for ALSA and OSS sound systems
ii  linux-source                         4.4.0.28.30                              all          Linux kernel source with Ubuntu patches
ii  linux-source-4.4.0                   4.4.0-28.47                              all          Linux kernel source for version 4.4.0 with Ubuntu patches
ii  util-linux                           2.27.1-6ubuntu3.1                        amd64        miscellaneous system utilities

我已经将内核源包/usr/src/linux-source-4.4.0.tar.bz2解压缩到/home/test/WorkSpace/Kernel/linux-source-4.4.0

我的系统uname是

# uname -a
Linux ubuntu-ldm 4.4.0-28-generic #47-Ubuntu SMP Fri Jun 24 10:09:13 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

我写了一个测试模块 hello.c

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init (void) {
        printk (KERN_ALERT "Hello, World\n");
        return 0;
}

static void hello_exit (void) {
        printk (KERN_ALERT "Goodbye, cruel world\n");
}

module_init (hello_init);
module_exit (hello_exit);

生成文件

obj-m += module.o

module-objs := hello.o

all:
        make modules M=`pwd` -C /home/test/WorkSpace/Kernel/linux-source-4.4.0

clean:
        make modules clean M=`pwd` -C /home/test/WorkSpace/Kernel/linux-source-4.4.0

但有些事让我很困惑。我制作模块并尝试insmod,我收到了错误

# sudo insmod module.ko
insmod: ERROR: could not insert module module.ko: Invalid module format

导致此错误的原因是什么?

我是否使用了错误版本的内核源代码?

for osgx

尝试 insmod 后, dmesg 的输出中没有其他行。 modinfo显示了这个

# modinfo module.ko
filename:       /home/test/WorkSpace/LDM/hello/module.ko
license:        Dual BSD/GPL
depends:
vermagic:       4.4.13 SMP mod_unload

我尝试更改Makefile中的源路径,重新制作它,然后我获得新的.ko

新.ko的modinfo是

# modinfo module.ko
filename:       /home/joshua/WorkSpace/LDM/hello/module.ko
license:        Dual BSD/GPL
srcversion:     82C361DBCB1C9BB5CA1DB07
depends:
vermagic:       4.4.0-28-generic SMP mod_unload modversions

但问题仍然存在, dmesg 日志看起来像这样

[   28.540701] module: module verification failed: signature and/or required key missing - tainting kernel
[   28.540879] module: module is already loaded

看起来系统中已经有一个名为module的模块,所以我尝试将 Makefile 中的目标名称更改为hello.o,制作新目标名称为hello.ko,之后模块可以正常工作。

但是当我运行lsmod | grep module时,没有名为module的模块?

1 个答案:

答案 0 :(得分:1)

一种可能性是模块是静态加载的。

然后它不会显示在lsmod下,但你仍然可以看到它:

ls /sys/module

另请参阅:https://unix.stackexchange.com/questions/364956/how-can-insmod-fail-with-kernel-module-is-already-loaded-even-is-lsmod-does-not