linux内核和应用层通信效率,linux中应用层与内核通信的netlink机制

62e50291a81fc54b507f33cb80033297.gif linux中应用层与内核通信的netlink机制

(3页)

75e9329a3716752a696e68bdc8ec3f6d.gif

本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!

9.9 积分

Linux屮与内核通信的Netlink机制Netlink在2.6版本的内核中变化也是很大的,在最新的2.6.37内核中,其定义已经改成下面 这种形式,传递的参数己经达到6个。其中第一个参数和mutex参数都是最新添加的。Mutex 也可以为空。这里主要是关于内核空间中的netlink函数的使用。extern struct sock *netlink_kernel_create(struct net *net, int unit,unsigned int groups, void (*input)(struct sk_buff *skb), struct mutex *cb_mutex, struct module ^module);struct net是一个W络名字空间namespace,在不同的名字空间里可以有自己的转发信息 库,有自己的一套neldevice等等。默认情况下都是使用这个全局变量,下面是内 核中调用netlink_kernel_create()函数的一个示例。在闪核屮,audit_sock = netlink_kernel_create(&init_net, NETLINK_AUDIT, 0,audit_receive, NULL,THIS_MODULE);模块调用函数netlink.unicast来发送单播消息:int netlink_unicast(struct sock *ssk, struct $k_buff *skb, u32 pid, int nonblock)参数ssk为函数netlink_kernel_create()返回的socket,参数skb存放消息,它的data字 段指向要发送的netlink消息结构,而skb的控制块保存了消息的地址信息,前面的宏 NETLINK_CB(skb)就用丁?方便设置该控制块,参数pid为接收消息进程的pid,参数nonblock 表示该函数是否为非阻塞,如果为1,该函数将在没有接收缓存可利用时立即返冋,而如果 为0,该函数在没有接收缓存可利用定吋睡眠。netlink的内核实现在.c文件net/core/af_netlink.c中,内核模块要想使用netlink,也必须 包含头文件linux/netlink.h。核使用netlink需要专门的API,这完全不同于用户态应用对 netlink的使用。如果用户需要增加新的netlink协议类型,必须通过修改Hnux/netlink.h来实 现,当然,目前的netlink实现已经包含了一个通用的协议类型NETLINK_GENERIC以方便 用户使用,川户可以直接使川它而不必增加新的协议类型。前面讲到,为了增加新的netlink 协议类型,用户仅需增加如下定义到linux/netlink.h就可以:只要增加这个定义之后,用户就可以在内核的任何地方引用该协议。在lAl核屮,力了创建一个netlink socket用户要调川如下函数:extern struct sock *netlink_kernel_create(struct net *net,int unit,unsigned int groups, void (*input)($truct $k_buff *skb), struct mutex *cb_mutex, struct module ^module);struct net足一个网络名字空间namespace,在不同的名字空间里而可以有向己的转发信息库, 有自己的一套net_device等等。默认情况下都是使用init_net这个全局变量参数unit表示netlink协议类型,如NETL1NK_MYTEST,参数input则为内核模块定 义的netlink消息处理函数,当行消息到达这个netlink socket时,该input函数指针就会被引 用。幽数指针input的参数skb实际上就是函数netlink_kernel_create返回的struct sock指针, sock实际是socket的一个內核表示数掘结构,用户态应用创建的socket托内核屮也会有一 个struct sock姑构来表示。函数i叩ut()会在发送进程执行sendmsgO时被调用,这样处理消息比较及时,但是,如 果消息特别长时,这样处理将增加系统调用sendmsgO的执行时间,也就是说当用户的程序 凋用sendmsg ()函数时,如果input ()函数处理时间过长,也就是说input()函数不执行不完, 用户程序调用的sendmsgO函数就不会返回。只有当内核空间中的i叩vit()函数返回吋,用户 调用的sendmsgO函数才会返回。对于这种情况,可以定义一个内核线程专门负责消息接收, 而函数input的工作只是唤醒该内核线程,这样sendmsg将很快返回。(这里网上的的说明) 不过在查看Linux2.6.37版本的A核时并没有发现这种处理过程,一般都是按下而的方法进 行处理。这里注册的netlink协议力NETLINK_XFRM。nlsk = netlink_kemel_create(net, NETLINK.XFRM, XFRMNLGRP_MAX,xfrm_netlink_rcv, NULL, THIS一MODULE);static void xfrm_netlink_rcv(struct sk_buff *skb){mutex_lock(&xfrm_cfg_mutex);netlink_rcv_skb(skb, &xfrm_user_rcv_msg); mutex_unlock(&xfrm_cfg_mutex);)在netlink_rcv_skb()函数中进行接收处理。int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, u32 group, gfp_t allocation)前面的三个参数与netlinlomicast相同,参数group为接收消息的多播组,该参数的每 一个位代表一个多播组,因此如果发送给多个多播组,就把该参数设置为多个多播组组ID 的位或。参数allocation为内核内存分配类型,一般地为GFP_ATOMIC或GFP_KERNEL, GFP_ATOMIC用于原子的上下文(即不可以睡眠),而GFP_KERNEL用于非原子上下文。NETLINK_CB(skb).pid = 0;NETLINK_CB(skb).dst_pid = 0;NETLINK_CB(skb).dst_group = 1; (),dst_pid表示消息 否则dst_group表示字段pid表示消息发送者进程ID,也即源地址,对于闪核,它为 接收者进程ID,也即目标地址,如果目标为组或内核,它设罝为0, 目标组地址,如果它目标为某一进程或内核,dst_group应当设置为 关 键 词: linux 应用 内核 通信 netlink 机制

524d6daf746efaa52c3c71bbfe7ba172.gif  天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

关于本文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值