加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

内核通信之 Netlink 源码分析和实例解释

发布时间:2021-05-23 23:00:52 所属栏目:Linux 来源:互联网
导读:linux 内核一直存在的一个严重问题就是内核态和用户态的交互的问题,对于这个问题内核大佬们一直在研究各种方法,想让内核和用户态交互能够安全高效的进行。如系统调用,proc,sysfs等内存文件系统,但是这些方式一般都比较简单,只能在用户空间轮询访问内

linux 内核一直存在的一个严重问题就是内核态和用户态的交互的问题,对于这个问题内核大佬们一直在研究各种方法,想让内核和用户态交互能够安全高效的进行。如系统调用,proc,sysfs等内存文件系统,但是这些方式一般都比较简单,只能在用户空间轮询访问内核的变化,内核的变化无法主动的推送出来。

而 netlink 的出现比较好的解决了这个问题,而且 netlink 还有以下一些优势:

 

可以直接使用 socket 套接字的 API 进行内核和用户态的通信,开发使用上相对简单了很多。

利用内核协议栈有了缓冲队列,是一种异步通信机制。

可以是内核和用户态的双向通信,内核可以主动向用户态进程发送消息。这个是以往通信方式不具备的。

针对同一个协议类型的所有用户进程,内核可以广播消息给所有的进程,也可以指定进程 pid 进行消息发送。

目前 netlink 的这种机制被广泛使用在各种场景中,在 Linux 内核中使用 netlink 进行应用与内核通信的应用很多; 包括:路由 daemon(NETLINK_ROUTE),用户态 socket 协议(NETLINK_USERSOCK),防火墙(NETLINK_FIREWALL),netfilter 子系统(NETLINK_NETFILTER),内核事件向用户态通知(NETLINK_KOBJECT_UEVENT)等。具体支持的类型可以查看这个文件 include/uapi/linux/netlink.h。

netlink 内核代码走读

netlink 内核相关文件介绍

netlink 的内核代码在内核代码的 net/netlink/ 目录下,我目前看的是 5.7.10 的内核版本,netlink 内核相关的文件不多,还是比较清晰的:

helightxu@ ? ~/open_code/linux-5.7.10 ? ls net/netlink 

config      Makefile     af_netlink.c af_netlink.h diag.c       genetlink.c 

helightxu@ ? ~/open_code/linux-5.7.10 ? 

文件 描述
af_netlink.c 和 af_netlink.h:   是 netlink 的核心文件,这个也是下面详细走读的内容。  
diag.c   对 netlink sock 进行监控,可以插入到内核或者从内核中卸载  
genetlink.c   这个可以看作是 netlink 的升级版本,或者说是一种高层封装。  

注:

genetlink.c 额外说明:netlink 默认支持了 30 多种的场景,但是对于其它场景并没有具体定义,这个时候这种通用封装就有了很大的好处,可以在不改动内核的前提下进行应用场景扩展,这部分内容可以看这个 wiki:https://wiki.linuxfoundation.org/networking/generic_netlink_howto 

还有一个头文件是在 include 目录,如下所示,这个头文件是一些辅助函数、宏定义和相关数据结构,大家学习的同学一定要看这个文件,它里面的注释非常详细。这些注释对理解 netlink 的消息结构非常有用,建议可以详细看看。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读