我正在开发一个内核模块,它通过netlink将消息发送到用户空间。
创建消息(要发送的消息):skb_out = nlmsg_new(msg_size,0);
。
发送第一条消息后,在发送第二条消息之前,我尝试用nlmsg_free(skb_out)
释放skb_out,但此函数导致内核崩溃。
或
源代码之后:
skb_out = nlmsg_new(msg_size,0);
if(!skb_out)
{
printk(KERN_ERR "Failed to allocate new skb\n");
return;
}
nlh=nlmsg_put(skb_out,0,0,NLMSG_DONE,msg_size,0);
NETLINK_CB(skb_out).dst_group = 0; /* not in mcast group */
strncpy(nlmsg_data(nlh),msg,msg_size);
res=nlmsg_unicast(nl_sk,skb_out,pid);
if(res<0)
{
printk(KERN_INFO "Error while sending bak to user\n");
}
nlmsg_free(skb_out);
答案 0 :(得分:10)
在您发送之后,您不允许释放skb。 nlmsg_unicast()
会照顾到这一点。
原因很简单:一旦发送消息,它就可以在netlink套接字中排队一段时间,然后才能读取它。仅仅因为nlmsg_unicast()
返回它并不意味着套接字的另一端已经收到消息。如果在收到之前将其释放,则最终会在队列中释放一条释放的消息,这会在内核尝试传递时导致崩溃。
只需为每条消息分配一个新的skb。