我正在努力学习Linux和内核开发。
我能够构建模块,但无法加载它。
HelloWorld.c
/*
* hello-1.c - The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
下面是我的make文件:
KERNEL_SOURCE := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
obj-m += HelloWorld.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
在执行insmod加载模块权限时被拒绝。我甚至尝试用root和modprobe执行此操作,但没有用。
我也试过链接,但问题还是一样。
希望能得到一些帮助。我正在使用ubuntu 18.04LTS。
4条答案
按热度按时间l7wslrjt1#
所以我遇到了同样的问题,这对我很有效:
1.您需要使用mokutil use the first answer in this link禁用安全 Boot
1.通过sudo运行insmod命令。
祝你好运。
hsgswve42#
如果
$ sudo insmod file_name.ko
因上述错误而失败,则执行dmesg | tail -1
并且它将给予安装内核模块时究竟发生了什么错误的想法。
在我的例子中,这是因为另一个模块在相同的/sys/class位置重叠。
在完成
sudo rmmod <that_module.ko>
之后,我能够加载我的新内核模块。x0fgdtte3#
如果您的内核是本地构建的,并且使用生成的签名进行了本地签名,则可以使用相同的密钥对模块进行签名。
https://www.kernel.org/doc/html/v4.15/admin-guide/module-signing.html,https://github.com/jakeday/linux-surface/blob/3267e4ea1f318bb9716d6742d79162de8277dea2/SIGNING.md
w7t8yxp54#
首先,确保在
makefile
中有tab:和clean:not space然后保存它并运行命令make之后,通过以下命令插入内核.$ sudo insmod file_name.ko
最后,显示.$ dmesg | tail -1