3

ネットリンクを介してユーザースペースにメッセージを送信するカーネルモジュールを開発しています。

メッセージ(送信するメッセージ)を作成するには:skb_out = nlmsg_new(msg_size,0);

最初のメッセージを送信した後、2番目のメッセージを送信する前に、でskb_outを解放しようとしました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);
4

1 に答える 1

12

送信後にskbを解放することは許可されていません。nlmsg_unicast()その世話をします。

理由は非常に単純です。メッセージを送信すると、誰かがメッセージを読む前に、しばらくの間netlinkソケットのキューに入れることができます。返されたからnlmsg_unicast()といって、ソケットの反対側がすでにメッセージを受け取っているという意味ではありません。受信する前に解放すると、キューに解放されたメッセージが表示され、カーネルがメッセージを配信しようとしたときにクラッシュが発生します。

すべてのメッセージに新しいskbを割り当てるだけです。

于 2012-04-13T10:09:42.473 に答える