用户空间和内核空间通讯之netlink

上传人:F****n 文档编号:100279205 上传时间:2019-09-23 格式:DOC 页数:12 大小:27.50KB
返回 下载 相关 举报
用户空间和内核空间通讯之netlink_第1页
第1页 / 共12页
用户空间和内核空间通讯之netlink_第2页
第2页 / 共12页
用户空间和内核空间通讯之netlink_第3页
第3页 / 共12页
用户空间和内核空间通讯之netlink_第4页
第4页 / 共12页
用户空间和内核空间通讯之netlink_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《用户空间和内核空间通讯之netlink》由会员分享,可在线阅读,更多相关《用户空间和内核空间通讯之netlink(12页珍藏版)》请在金锄头文库上搜索。

1、用户空间和内核空间通讯之Netlink 引言 Alan Cox在内核1.3版本的开发阶段最先引入了Netlink,刚开始时Netlink是以字符驱动接口的方式提供内核与用户空间的双向数据通信;随后,在2.1内核开发过程中,Alexey Kuznetsov将Netlink改写成一个更加灵活、且易于扩展的基于消息通信接口,并将其应用到高级路由子系统的基础框架里。自那时起,Netlink就成了Linux内核子系统和用户态的应用程序通信的主要手段之一。 2001年,ForCES IETF委员会正式对Netlink进行了标准化的工作。Jamal Hadi Salim提议将Netlink定义成一种用于网络

2、设备的路由引擎组件和其控制管理组件之间通信的协议。不过他的建议最终没有被采纳,取而代之的是我们今天所看到的格局:Netlink被设计成一个新的协议域,domain。 Linux之父托瓦斯曾说过“Linuxis evolution, not intelligent design”。什么意思?就是说,Netlink也同样遵循了Linux的某些设计理念,即没有完整的规范文档,亦没有设计文档。只有什么?你懂得-“Read the f*king source code”。 当然,本文不是分析Netlink在Linux上的实现机制,而是就“什么是Netlink”以及“如何用好Netlink”的话题和大家做

3、个分享,只有在遇到问题时才需要去阅读内核源码弄清个所以然。什么是Netlink 关于Netlink的理解,需要把握几个关键点: 1、面向数据报的无连接消息子系统 2、基于通用的BSD Socket架构而实现 关于第一点使我们很容易联想到UDP协议,能想到这一点就非常棒了。按着UDP协议来理解Netlink不是不无道理,只要你能触类旁通,做到“活学”,善于总结归纳、联想,最后实现知识迁移这就是学习的本质。Netlink可以实现内核->用户以及用户->内核的双向、异步的数据通信,同时它还支持两个用户进程之间、甚至两个内核子系统之间的数据通信。本文中,对后两者我们不予考虑,焦点集中在如何

4、实现用户<->内核之间的数据通信。 看到第二点脑海中是不是瞬间闪现了下面这张图片呢?如果是,则说明你确实有慧根;当然,不是也没关系,慧根可以慢慢长嘛,呵呵。 在后面实战Netlink套接字编程时我们主要会用到socket(),bind(),sendmsg()和recvmsg()等系统调用,当然还有socket提供的轮训(polling)机制。 Netlink通信类型 Netlink支持两种类型的通信方式:单播和多播。 单播:经常用于一个用户进程和一个内核子系统之间1:1的数据通信。用户空间发送命令到内核,然后从内核接受命令的返回结果。 多播:经常用于一个内核进程和多个用户进程之间的

5、1:N的数据通信。内核作为会话的发起者,用户空间的应用程序是接收者。为了实现这个功能,内核空间的程序会创建一个多播组,然后所有用户空间的对该内核进程发送的消息感兴趣的进程都加入到该组即可接收来自内核发送的消息了。如下: 其中进程A和子系统1之间是单播通信,进程B、C和子系统2是多播通信。上图还向我们说明了一个信息。从用户空间传递到内核的数据是不需要排队的,即其操作是同步完成;而从内核空间向用户空间传递数据时需要排队,是异步的。了解了这一点在开发基于Netlink的应用模块时可以使我们少走很多弯路。假如,你向内核发送了一个消息需要获取内核中某些信息,比如路由表,或其他信息,如果路由表过于庞大,那

6、么内核在通过Netlink向你返回数据时,你可以好生琢磨一下如何接收这些数据的问题,毕竟你已经看到了那个输出队列了,不能视而不见啊。Netlink的消息格式 Netlink消息由两部分组成:消息头和有效数据载荷,且整个Netlink消息是4字节对齐,一般按主机字节序进行传递。消息头为固定的16字节,消息体长度可变:Netlink的消息头 消息头定义在<include/linux/netlink.h>文件里,由结构体nlmsghdr表示:struct nlmsghdr _u32 nlmsg_len; /* Length of message including header */ _

7、u16 nlmsg_type; /* Message content */ _u16 nlmsg_flags; /* Additional flags */ _u32 nlmsg_seq; /* Sequence number */ _u32 nlmsg_pid; /* Sending process PID */; 消息头中各成员属性的解释及说明:nlmsg_type:消息的类型,即是数据还是控制消息。目前(内核版本2.6.21)Netlink仅支持四种类型的控制消息,如下: NLMSG_NOOP-空消息,什么也不做; NLMSG_ERROR-指明该消息中包含一个错误; NLMSG_DONE-如果内核通过Netlink队列返回了多个消息,那么队列的最后一条消息的类型为NLMSG_DONE,其余所有消息的nlmsg_flags属性都被设置NLM_F_MULTI位有效。 NLMSG_OVERRUN-暂时没用到。nlmsg_flags:附加在消息上的额外说明信息,如上面提到的NLM_F_MULTI。摘录如下:标记作用及说明NLM_F_REQUEST如果消息中有该标记位,说明这是一个请求消息。所有从用户空间到内核空间的消息都要设置该位,否则内核将向用户返回一个EINVAL无效参数的错误NLM_F_MULTItd style

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号