防止删除繁忙的内核模块

时间:2018-06-28 14:18:48

标签: linux kernel kernel-module

我有一个简单的内核模块,该模块创建字符设备,但不执行任何操作。

我编写了这个用于测试字符设备的用户空间程序。

int main()
{
    int fd;

    fd = open("/dev/ebbchar", O_RDWR);
    if (fd < 0)
        err(1, "open");

    sleep(10);

    ret = close(fd);
    if (ret < 0)
        err(1, "close");
}

程序在10秒后退出。

但是,如果与此同时我使用rmmod或modprobe删除模块,则10秒钟后程序将出现段错误或挂起,并且出现内核哎呀。

如何导致rmmod失败,或者有没有一种方法可以安全地删除模块?

我的模块可以通过其__exit函数关闭文件描述符吗?

我认为崩溃是由close()函数引起的,该函数间接调用了字符文件操作中的release回调,并且该release函数不再存在,因为已删除了该模块

可以找到here(搜索清单2 )内核模块的源。

1 个答案:

答案 0 :(得分:4)

IIRC,您需要在文件操作结构中设置.owner = THIS_MODULE,以便正确处理模块的引用计数。