3

我正在开发一个内核模块,它通过 netlink 向用户空间发送消息。

创建消息(要发送的消息):skb_out = nlmsg_new(msg_size,0);

在发送第一条消息之后,在发送第二条消息之前,我试图释放 skb_out ,nlmsg_free(skb_out)但是这个函数会导致内核崩溃。

  • 如何解决此崩溃?

或者

  • 发送消息后,还有其他替代 fre 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);
4

1 回答 1

12

发送后不允许释放 skb。nlmsg_unicast()会处理的。

原因很简单:一旦你发送了消息,它可以在 netlink 套接字中排队一段时间,然后才能被任何人阅读。仅仅因为nlmsg_unicast()返回它并不意味着套接字的另一端已经收到消息。如果你在收到它之前释放它,你最终会在队列中得到一条释放的消息,这会在内核尝试传递它时导致崩溃。

只需为每条消息分配一个新的 skb。

于 2012-04-13T10:09:42.473 回答