无法删除可加载模块

无法删除可加载模块

我正在尝试了解 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 hellohello 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 hellohello 12422 0 - Unloading 0x0000000000000000 (POF-)

我的问题是如何删除该模块?序列/代码有什么问题?

答案1

首先,你的中有一个return语句我的退出导致此问题的函数。

至于卸载部分,如果你想强制删除一个模块,那么你必须启用CONFIG_MODULE_FORCE_UNLOAD在内核中。否则,您必须重新启动系统。

相关内容