linux - 防止移除繁忙的内核模块

标签 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() 函数引起的,该函数间接调用了字 rune 件操作中的 release 回调,该 release 函数不再存在,因为该模块已被删除。

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

最佳答案

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

关于linux - 防止移除繁忙的内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51085225/

相关文章:

linux - ifconfig 从不显示当前 IP 地址?

linux - 如何实例化和使用 dma 驱动程序 linux 模块

matlab - 如何在 Matlab 中使用 libsvm?

linux - 打印内核模块中的进程数

c - 系统调用未定义!编译内核模块

c - linux 内核模块 : kernel method undefined (kthread_create_on_cpu)

linux - 在 Bash 中解析 SNMP 输出

linux - 在没有编译器的 Ubuntu 机器上安装 dkms

linux - 界面关闭时未删除 socat 设备文件

linux - cdev_add() 函数如何工作?