我有一个简单的内核模块,该模块创建字符设备,但不执行任何操作。
我编写了这个用于测试字符设备的用户空间程序。
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 )内核模块的源。
答案 0 :(得分:4)
IIRC,您需要在文件操作结构中设置.owner = THIS_MODULE
,以便正确处理模块的引用计数。