我正在尝试了解 Linux 设备驱动程序。我正在尝试使用安装模块插入模块从命令行。插入后,我尝试删除加载的模块,但失败并出现错误,
could not remove module hello: Device or resource busy
我发现这个链接但它似乎没有提供有效的答案。
hello.c
下面是该模块的C代码( ):
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */
static int data __initdata = 3;
#ifdef USE_OLDER_NAMING
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
return -1;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
#else
static int __init my_init(void)
{
printk(KERN_ALERT "Hello Module Inserted : %d \n",data);
return 0;
}
static void __exit my_exit(void)
{
printk(KERN_ALERT "Hello Module removed : %d \n",data);
return;
}
module_init(my_init);
module_exit(my_exit);
#endif
我正在使用以下 Makefile 编译此模块:
obj-m += hello.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
编译后,我使用命令安装模块sudo insmod ./hello.ko
。我可以在 中看到加载的模块/proc/modules
。的输出cat /proc/modules | grep hello
是hello 12490 0 - Live 0x0000000000000000 (POF)
.
当我签入时dmesg
,我可以看到日志Hello Module Inserted : 3
。当我尝试删除模块时,出现以下错误
rmmod: ERROR: ../libkmod/libkmod-module.c:769 kmod_module_remove_module() could not remove 'hello': Device or resource busy
rmmod: ERROR: could not remove module hello: Device or resource busy
的输出cat /proc/modules | grep hello
是hello 12422 0 - Unloading 0x0000000000000000 (POF-)
我的问题是如何删除该模块?序列/代码有什么问题?
答案1
首先,你的中有一个return语句我的退出导致此问题的函数。
至于卸载部分,如果你想强制删除一个模块,那么你必须启用CONFIG_MODULE_FORCE_UNLOAD在内核中。否则,您必须重新启动系统。