编写Linux内核模块是不是需要编译自己的内核?

Posted

技术标签:

【中文标题】编写Linux内核模块是不是需要编译自己的内核?【英文标题】:Does Writing Linux Kernel Module Require Compiling Own Kernel?编写Linux内核模块是否需要编译自己的内核? 【发布时间】:2021-08-03 09:23:45 【问题描述】:

我在 Ubuntu x86_64 上有一个简单的 hello world 内核模块:

#include <linux/module.h>

static int 
mod_init(void)

  printk(KERN_INFO "RYANhello world\n");
  return 0;


static void 
mod_exit(void)

  printk(KERN_INFO "RYANgoodbye world\n");


MODULE_LICENSE("GPL");

module_init(mod_init);
module_exit(mod_exit);

生成文件:

KERNEL_DIR := /lib/modules/$(shell uname -r)/build
CUR_DIR := $(shell pwd)
obj-m := module.o

default:
    $(MAKE) -C $(KERNEL_DIR) M=$(CUR_DIR) modules

当我sudo insmod module.ko 时,我得到insmod: ERROR: could not insert module module.ko: Invalid parameters。检查dmesg

loading out-of-tree module taints kernel
module verification failed: signature and/or required key missing - tainting kernel

重复insmod 产生module is already loaded 但是/var/log/syslog 没有显示它加载的痕迹(即printk 消息不存在)。另外,运行sudo rmmod module.ko

rmmod: ERROR: ../libkmod/libkmod-module.c:1941 kmod_module_get_holders() could not open '/sys/module/module/holders': No such file or directory
rmmod: ERROR: Module unloading is not supported

这似乎表明它没有加载,即使dmesg 说它是?

解决常见问题;我的主机内核和 gcc 版本与我编译时使用的相同。

因此,这使我认为未签名的模块是问题所在。要禁用此功能,我是否必须使用适当的.config 编译和安装我自己的内核?换句话说,要在具有强制签名的现代 GNU/Linux 操作系统上编写和测试您自己的内核模块,您是否必须编译和安装您自己的内核?

编辑 CONFIG_MODULE_SIG_FORCE 没有在我的/boot/config-5.8.0-53-generic 中设置,所以看起来我应该能够加载我的模块,尽管带有受污染的内核消息。那么,为什么我会收到Invalid parameters?

【问题讨论】:

askubuntu.com/questions/483283/… 有什么帮助吗? @ChristinaJacob CONFIG_MODULE_SIG_FORCE 没有在我的/boot/config-5.8.0-53-generic 中设置,所以看起来我应该能够加载我的模块,尽管带有tainted kernel 消息。那么,为什么我会收到Invalid parameters 检查内核是否支持模块卸载。内核是用这个标志 MODULE_UNLOAD 构建的 @Varun CONFIG_MODULE_UNLOAD 在我的内核中设置。 @RyanMcClue 在执行 rmmod 时打印任何 dmesg。您为 rmmod 提供的打印来自用户空间 【参考方案1】:

首先检查dmesg insmod 它说模块已经加载。由于我以前从未加载过这个,这促使我认为这个名字已经被占用了。 低头,重命名module.c/module.o --&gt; example.c/example.o 解决了这个问题。 invalid parameters 消息让我大吃一惊。

【讨论】:

以上是关于编写Linux内核模块是不是需要编译自己的内核?的主要内容,如果未能解决你的问题,请参考以下文章

实验二 内核模块编译

在linux中编写了一个小的内核模块,怎么编译成.ko文件?

已编译模块的数量是不是会影响 RAM 中 Linux 内核的大小?

linux内核模块编译makefile

Linux驱动模块编译进内核中

编写简单的内核模块