一、问题现象
某内核模块中实现网络套接字操作,用户空间程序运行后,卸载模块时出现 "Module is in use" 错误。通过调试发现,在套接字创建代码中缺少 sock_put(sk)
调用,补充后模块可正常卸载。本文将以 inet_create
函数为切入点,深入分析套接字引用计数机制。
二、inet_create
函数中的引用计数初始化
在 Linux 内核中,inet_create
函数负责创建 IPv4 套接字(socket),其关键流程如下:
// net/ipv4/af_inet.c sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot, kern); sock_init_data(sock, sk); // 关键初始化
1. sock_init_data
的核心作用
该函数初始化套接字基础数据结构,其中包含对引用计数的操作:
// net/core/sock.c void sock_init_data(struct socket *sock, struct sock *sk) { sk_init_common(sk); sk->sk_sock =