linux中与内核通信的netlink机制

linux中与内核通信的netlink机制

ID:14083868

大小:126.50 KB

页数:20页

时间:2018-07-25

linux中与内核通信的netlink机制_第1页
linux中与内核通信的netlink机制_第2页
linux中与内核通信的netlink机制_第3页
linux中与内核通信的netlink机制_第4页
linux中与内核通信的netlink机制_第5页
资源描述:

《linux中与内核通信的netlink机制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux中与内核通信的Netlink机制Netlink在2.6版本的内核中变化也是很大的,在最新的2.6.37内核中,其定义已经改成下面这种形式,传递的参数已经达到6个。其中第一个参数和mutex参数都是最新添加的。Mutex也可以为空。这里主要是关于内核空间中的netlink函数的使用。externstructsock*netlink_kernel_create(structnet*net,intunit,unsignedintgroups,void(*input)(structsk_buff*skb),structmutex*cb_mutex,stru

2、ctmodule*module);structnet是一个网络名字空间namespace,在不同的名字空间里面可以有自己的转发信息库,有自己的一套net_device等等。默认情况下都是使用init_net这个全局变量,下面是内核中调用netlink_kernel_create()函数的一个示例。在内核中,audit_sock=netlink_kernel_create(&init_net,NETLINK_AUDIT,0,audit_receive,NULL,THIS_MODULE);模块调用函数netlink_unicast来发送单播消息:intnetli

3、nk_unicast(structsock*ssk,structsk_buff*skb,u32pid,intnonblock)参数ssk为函数netlink_kernel_create()返回的socket,参数skb存放消息,它的data字段指向要发送的netlink消息结构,而skb的控制块保存了消息的地址信息,前面的宏NETLINK_CB(skb)就用于方便设置该控制块,参数pid为接收消息进程的pid,参数nonblock表示该函数是否为非阻塞,如果为1,该函数将在没有接收缓存可利用时立即返回,而如果为0,该函数在没有接收缓存可利用定时睡眠。netl

4、ink的内核实现在.c文件net/core/af_netlink.c中,内核模块要想使用netlink,也必须包含头文件linux/netlink.h。内核使用netlink需要专门的API,这完全不同于用户态应用对netlink的使用。如果用户需要增加新的netlink协议类型,必须通过修改linux/netlink.h来实现,当然,目前的netlink实现已经包含了一个通用的协议类型NETLINK_GENERIC以方便用户使用,用户可以直接使用它而不必增加新的协议类型。前面讲到,为了增加新的netlink协议类型,用户仅需增加如下定义到linux/net

5、link.h就可以:只要增加这个定义之后,用户就可以在内核的任何地方引用该协议。在内核中,为了创建一个netlinksocket用户需要调用如下函数:externstructsock*netlink_kernel_create(structnet*net,intunit,unsignedintgroups,void(*input)(structsk_buff*skb),structmutex*cb_mutex,structmodule*module);structnet是一个网络名字空间namespace,在不同的名字空间里面可以有自己的转发信息库,有自己的

6、一套net_device等等。默认情况下都是使用init_net这个全局变量参数unit表示netlink协议类型,如NETLINK_MYTEST,参数input则为内核模块定义的netlink消息处理函数,当有消息到达这个netlinksocket时,该input函数指针就会被引用。函数指针input的参数skb实际上就是函数netlink_kernel_create返回的structsock指针,sock实际是socket的一个内核表示数据结构,用户态应用创建的socket在内核中也会有一个structsock结构来表示。函数input()会在发送进程执

7、行sendmsg()时被调用,这样处理消息比较及时,但是,如果消息特别长时,这样处理将增加系统调用sendmsg()的执行时间,也就是说当用户的程序调用sendmsg()函数时,如果input()函数处理时间过长,也就是说input()函数不执行不完,用户程序调用的sendmsg()函数就不会返回。只有当内核空间中的input()函数返回时,用户调用的sendmsg()函数才会返回。对于这种情况,可以定义一个内核线程专门负责消息接收,而函数input的工作只是唤醒该内核线程,这样sendmsg将很快返回。(这里网上的的说明)不过在查看Linux2.6.37版

8、本的内核时并没有发现这种处理过程,一般都是按下面的方

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。