我在用户空间和内核空间之间进行了基于Nelink的单播通信,并且效果很好。
下面的调用通过netlink套接字将消息从内核空间发送到用户空间。
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);
现在我想从内核向用户空间发送3次相同的数据副本。
因此,我看到当nlmsg_unicast
返回时,skb_out不存在,可能已经是skb_free。
因此,在致电nlmsg_unicast
之前,我想像下面将skb_get(skb_out)
的skb_out用户数增加。
skb_get(skb_out);
skb_get(skb_out);
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);
我的解释是,我现在应该能够发送3次相同的味精,因为skb_free
不能释放skb_out。但是,内核冻结了。
当我使用skb_copy()
而不是skb_get()
重复同一件事时,我可以多次发送msg。
我的问题是:skb_copy()是昂贵的操作,我应该能够将相同的内存缓冲区发送到用户空间而不创建副本。
对于我在这里缺少的任何帮助,我们将不胜感激。