防止删除繁忙的内核模块

Bil*_*low 1 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");
}
Run Code Online (Sandbox Code Playgroud)

程序在 10 秒后退出。

但是如果同时我用 rmmod 或 modprobe 删除了模块,那么 10 秒后程序段错误或挂起,并且有一个内核 oops。

如何导致 rmmod 失败,或者是否有安全删除模块的方法?

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

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

可以在此处找到内核模块的源代码(搜索清单 2)。

Dip*_*ick 5

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