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

C 编写Linux内核模块是否需要编译自己的内核?,c,linux,module,linux-kernel,linux-device-driver,C,Linux,Module,Linux Kernel,Linux Device Driver,我在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");

我在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);
当我
sudo insmod module.ko
时,我得到
insmod:ERROR:无法插入module module.ko:无效参数
。检查
dmesg

loading out-of-tree module taints kernel
module verification failed: signature and/or required key missing - tainting kernel
重复
insmod
会产生
模块已经加载
,但是
/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操作系统上使用强制签名编写和测试您自己的内核模块,您需要编译和安装您自己的内核吗

编辑
我的
/boot/CONFIG-5.8.0-53-generic
中未设置
CONFIG\u模块\u SIG\u FORCE
,因此我似乎应该能够加载模块,尽管带有受污染的内核消息。那么,为什么我会得到无效的参数呢?

首先检查
insmod
时检查
dmesg
,它说模块已经加载了。因为我以前从未加载过这个,这让我想到这个名字已经被取了。
瞧,重命名
module.c/module.o-->example.c/example.o
修复了这个问题。
invalid parameters
消息是我遇到的麻烦。

这有什么帮助吗?@ChristinaJacob
CONFIG\u MODULE\u SIG\u FORCE
没有在我的
/boot/CONFIG-5.8.0-53-generic
消息中设置,所以看起来我应该能够加载我的模块,尽管带有
受污染的内核。那么,为什么我会得到
无效参数
?检查内核是否支持模块卸载。内核是用这个标志模块构建的_UNLOAD@Varun
CONFIG\u MODULE\u UNLOAD
是在我的内核中设置的。@RyanMcClue在执行rmmod时打印任何dmesg。您为rmmod提供的打印来自用户空间
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