用户空间和内核空间通讯之Netlink.pdf

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用户空间和内核空间通讯之Netlink

用户空间和内核空间通讯之【Netlink】 引言 Alan Cox 在内核1.3 版本的开发阶段最先引入了Netlink,刚开始时Netlink 是以字符驱动接口的方式提供内核 与用户空间的双向数据通信;随后,在2.1 内核开发过程中,Alexey Kuznetsov 将Netlink 改写成一个更加灵活、且 易于扩展的基于消息通信接口,并将其应用到高级路由子系统的基础框架里。自那时起,Netlink 就成了Linux 内核 子系统和用户态的应用程序通信的主要手段之一。 2001 年,ForCES IETF 委员会正式对Netlink 进行了标准化的工作。Jamal Hadi Salim 提议将Netlink 定义成一种 用于网络设备的路由引擎组件和其控制管理组件之间通信的协议。不过他的建议最终没有被采纳,取而代之的是我 们今天所看到的格局:Netlink 被设计成一个新的协议域,domain 。 Linux 之父托瓦斯曾说过“Linux is evolution, not intelligent design” 。什么意思?就是说,Netlink 也同样遵循了 Linux 的某些设计理念,即没有完整的规范文档,亦没有设计文档。只有什么?你懂得“Read the f**king source code”。 当然,本文不是分析Netlink 在 Linux 上的实现机制,而是就“什么是 Netlink”以及“如何用好 Netlink”的话题和 大家做个分享,只有在遇到问题时才需要去阅读内核源码弄清个所以然。 什么是Netlink 关于Netlink 的理解,需要把握几个关键点: 1、面向数据报的无连接消息子系统 2、基于通用的BSD Socket 架构而实现 关于第一点使我们很容易联想到UDP 协议,能想到这一点就非常棒了。按着UDP 协议来理解Netlink 不是不无 道理,只要你能触类旁通,做到“活学” ,善于总结归纳、联想,最后实现知识迁移这就是学习的本质。Netlink 可以 实现内核-用户以及用户- 内核的双向、异步的数据通信,同时它还支持两个用户进程之间、甚至两个内核子系统 之间的数据通信。本文中,对后两者我们不予考虑,焦点集中在如何实现用户- 内核之间的数据通信。 看到第二点脑海中是不是瞬间闪现了下面这张图片呢?如果是,则说明你确实有慧根;当然,不是也没关系, 慧根可以慢慢长嘛,呵呵。 在后面实战Netlink 套接字编程时我们主要会用到socket(),bind(),sendmsg() 和recvmsg()等系统调用,当然还有socket 提供的轮训(polling)机制。 Netlink 通信类型 Netlink 支持两种类型的通信方式:单播和多播。 单播:经常用于一个用户进程和一个内核子系统之间1:1 的数据通信。用户空间发送命令到内核,然后从内核 接受命令的返回结果。 多播:经常用于一个内核进程和多个用户进程之间的1:N 的数据通信。内核作为会话的发起者,用户空间的应 用程序是接收者。为了实现这个功能,内核空间的程序会创建一个多播组,然后所有用户空间的对该内核进程发送 的消息感兴趣的进程都加入到该组即可接收来自内核发送的消息了。如下: 其中进程A 和子系统1 之间是单播通信,进程B、C 和子系统2 是多播通信。上图还向我们说明了一个信息。从 用户空间传递到内核的数据是不需要排队的,即其操作是同步完成;而从内核空间向用户空间传递数据时需要排队, 是异步的。了解了这一点在开发基于 Netlink 的应用模块时可以使我们少走很多弯路。假如,你向内核发送了一个 消息需要获取内核中某些信息,比如路由表,或其他信息,如果路由表过于庞大,那么内核在通过 Netlink 向你返 回数据时,你可以好生琢磨一下如何接收这些数据的问题,毕竟你已经看到了那个输出队列了,不能视而不见啊。 Netlink 的消息格式 Netlink 消息由两部分组成:消息头和有效数据载荷,且整个Netlink 消息是4 字节对齐,一般按主机字节序进 行传递。消息头为固定的16 字节,消息体长度可变: Netlink 的消息头 消息头定义在include/linux/netlink.h文件里,由结构体nlmsghdr 表示: 点击(此处)折叠或打开 struct nlmsghdr { __u32 nlmsg_len; /* Length of mes

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档