我有一个简单的内核模块,它创建一个字符设备并且不对其进行任何操作。
我编写了这个测试字符设备的用户空间程序。
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/