编写Linux内核模块是否需要编译自己的内核?
Does Writing Linux Kernel Module Require Compiling Own Kernel?
我在 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 OS 上编写和测试您自己的内核模块,您是否必须编译和安装您自己的内核?
编辑
CONFIG_MODULE_SIG_FORCE
没有在我的 /boot/config-5.8.0-53-generic
中设置,所以看起来我应该能够加载我的模块,尽管有一个受污染的内核消息。那么,为什么我会得到 Invalid parameters?
首先 insmod
检查 dmesg
它说模块已经加载。因为我以前从未加载过这个,所以这促使我认为这个名字已经被使用了。
瞧,重命名 module.c/module.o --> example.c/example.o
解决了这个问题。 invalid parameters
消息让我震惊。
我在 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 OS 上编写和测试您自己的内核模块,您是否必须编译和安装您自己的内核?
编辑
CONFIG_MODULE_SIG_FORCE
没有在我的 /boot/config-5.8.0-53-generic
中设置,所以看起来我应该能够加载我的模块,尽管有一个受污染的内核消息。那么,为什么我会得到 Invalid parameters?
首先 insmod
检查 dmesg
它说模块已经加载。因为我以前从未加载过这个,所以这促使我认为这个名字已经被使用了。
瞧,重命名 module.c/module.o --> example.c/example.o
解决了这个问题。 invalid parameters
消息让我震惊。