内核模块中错误调用kernel_thread创建内核线程导致模块无法卸载

本文探讨了内核模块在初始化过程中错误调用kernel_thread创建内核线程,导致模块无法正常卸载的场景。问题关键在于线程的CLONE_FILES标志设置,这使得文件描述符在进程间共享,影响了模块卸载。
摘要由CSDN通过智能技术生成

 先介绍一下创建线程的大致流程:在模块的初始化函数中,调用netlink_kernel_create来注册自己的netlink协议,然后返回,接收netlink消息的函数为fcluster_netlink_recv,真正的初始化操作是在接收到netlink报文后才做,创建线程的操作也是在fcluster_netlink_recv中,如下图所示:


调用kernel_thread的语句为:

kernel_thread(fcluster_rcv_handoff, NULL, 0);

按照这样的处理流程,在卸载模块时会提示  " module is in use". 通过lsmod命令查看自己的模块,发现引用数为1(模块引用数为0时才能卸载),但是却没有看到是哪个模块在引用。经过多次的重复测试,发现问题就出现在内核线程的创建上。因为如果把kernel_thread的调用放在fcluster_init函数中,这样模块的引用数为0,模块就可以卸载。现在就可以判断,出现模块无法卸载的原因就是调用 kernel_thread创建内核线程的时机不对,或者指定的参数不对。
  为了定位问题,开始在不同的情况下增加调试代码来查找问题。
 第一个测试是kernel_thread放在 fcluster_init 的情况下,在 fcluster_rcv_handoff(内核线程的处理函数)、fcluster_init、 fcluster_netlink_re
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值