没有合适的资源?快使用搜索试试~ 我知道了~
Linux内核与用户空间通信的方式目前主要有9种,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs。Netlink是一种特殊的文件描述符(套结字),为2.6.14及更高版本的Linux所特有,是一种在内核与用户应用间进行双向数据交互的便捷方式,用户态应用调用标准的套结字API 可以使用netlink提供的强大功能,内核态需要调用专门的内核 API 来使用netlink。Netlink应用已经相当广泛,例如,Linux系统的网络防火墙分为内核态的netfilter和用户态的iptables,netf
资源推荐
资源详情
资源评论
Netlink实现实现Linux内核与用户空间通信内核与用户空间通信
Linux内核与用户空间通信的方式目前主要有9种,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、
procfs、seq_file、debugfs和relayfs。Netlink是一种特殊的文件描述符(套结字),为2.6.14及更高版本的Linux所特有,是一
种在内核与用户应用间进行双向数据交互的便捷方式,用户态应用调用标准的套结字API 可以使用netlink提供的强大功能,内
核态需要调用专门的内核 API 来使用netlink。Netlink应用已经相当广泛,例如,Linux系统的网络防火墙分为内核态的netfilter
和用户态的iptables,netfilter与iptables的数据交换是通过Netlink机制来完成。
一、采用Netlink进行内核与用户空间交互的优势
Netlink相对于系统调用、ioctl以及proc文件系统等其他内核与用户空间的数据交换方式而言具有以下优点:
1、使用 netlink,用户仅需要在 include/linux/netlink.h 中增加一个新类型的 netlink 协议定义即可, 如 #define
NETLINK_MYTEST 17 然后,内核和用户态应用可以立即通过套结字API使用该 netlink 协议类型进行数据通信。但系统调用
需要增加新的系统调用,ioctl 则需要增加设备或文件, 那需要不少代码,proc 文件系统则需要在 /proc 下添加新的文件或目
录,那将使本来混乱的 /proc 目录更加混乱。
2、netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中,发送消息只是把消息保
存在接收者的socket的接收队列,而不需要等待接收者收到消息,但系统调用与 ioctl 则是同步通信机制,如果传递的数据太
长,将影响调度速度。
3、使用 netlink 的内核部分可以采用模块的方式实现,使用 netlink 的应用部分和内核部分没有编译时依赖,但系统调用
有依赖,而且新的系统调用的实现必须静态地连接到内核中,它无法在模块中实现,使用新系统调用的应用在编译时需要依赖
内核。
4、netlink 支持多播,内核模块或应用可以把消息多播给一个netlink组,属于该neilink 组的任何内核模块或应用都能接收
到该消息,内核事件向用户态的通知机制使用了这一特性,任何对内核事件感兴趣的应用都能收到该子系统发送的内核事件。
5、内核可以使用 netlink 首先发起会话,但系统调用和 ioctl 只能由用户应用发起调用。
6、netlink 使用标准的套结字API,因此很容易使用,但系统调用和 ioctl则需要专门的培训才能使用。
二、Netlink用户空间调用方式
用户态应用使用标准的socket API, socket(), bind(), sendmsg(), recvmsg() ,recv()和 close() 能很容易地使用
netlink socket,查询手册页可以了解这些函数的使用细节,本文只是讲解使用 netlink 的用户应该如何使用这些函数。注意,
使用 netlink 的应用必须包含头文件linux/netlink.h。当然 socket 需要的头文件也必不可少,sys/socket.h。
为了创建一个 netlink socket,用户需要使用如下参数调用 socket():
view plaincopy to clipboardprint?
int ntSocket;
ntSocket = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
第一个参数必须是 AF_NETLINK 或 PF_NETLINK,在 Linux 中,它们俩实际为一个东西,它表示要使用netlink,第二个
参数必须是SOCK_RAW或SOCK_DGRAM,第三个参数指定netlink协议类型,NETLINK_KOBJECT_UEVENT意为“内核事
件向用户态通知”,绑定该协议创建的ntSocket可以接收到来自内核的通知事件(如USB热插拔)。
内核预定义的协议类型有:
#define NETLINK_ROUTE 0 //路由守护进程
#define NETLINK_W1 1 //1-wire 子系统
#define NETLINK_USERSOCK 2 //用户态套结字协议
#define NETLINK_FIREWALL 3 //防火墙
#define NETLINK_INET_DIAG 4 //套结字监视
#define NETLINK_NFLOG 5 //网络数据过滤日志
#define NETLINK_XFRM 6 //ipsec 安全策略
#define NETLINK_SELINUX 7 //SELinux 事件通知
#define NETLINK_ISCSI 8 //iSCSI网络存储子系统
#define NETLINK_AUDIT 9 //进程审计
#define NETLINK_FIB_LOOKUP 10 //转发信息表查询
#define NETLINK_CONNECTOR 11 //netlink连接器
#define NETLINK_NETFILTER 12 //网络数据过滤系统
#define NETLINK_IP6_FW 13 //IPv6 防火墙
#define NETLINK_DNRTMSG 14 //DECnet路由信息
#define NETLINK_KOBJECT_UEVENT 15 //内核事件向用户态通知
#define NETLINK_GENERIC 16 //通用netlink(用户自定义功能)
对于每一个netlink协议类型,可以有多达 32多播组,每一个多播组用一个位表示,netlink 的多播特性使得发送消息给同
一个组仅需要一次系统调用,因而对于需要多拨消息的应用而言,大大地降低了系统调用的次数。
函数 bind() 用于把一个打开的 netlink socket 与 netlink 源 socket 地址绑定在一起。netlink socket 的地址结构如下:
view plaincopy to clipboardprint?
struct sockaddr_nl {
sa_family_t nl_family;
unsigned short nl_pad;
__u32 nl_pid;
__u32 nl_groups;
};
字段 nl_family 必须设置为 AF_NETLINK 或着 PF_NETLINK,字段 nl_pad 当前没有使用,因此要总是设置为 0,字段
nl_pid 为接收或发送消息的进程的 ID,如果希望内核处理消息或多播消息,把该字段设置为 0,否则设置为处理消息的进程
ID。字段 nl_groups 用于指定多播组,bind 函数用于把调用进程加入到该字段指定的多播组,如果设置为 0,表示调用者不加
入任何多播组。
资源评论
weixin_38679839
- 粉丝: 4
- 资源: 975
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 四川采矿场尾矿库安全管理规定.docx
- 四川采矿场提升运输系统管理规定.docx
- 四川采矿场消防管理规定.docx
- 基于 TensorFlow.js 的 YOLOv5 实时目标检测项目(源码+运行说明文档)
- 毕业设计-基于 TensorFlow.js 的 YOLOv5 实时目标检测项目(源码+运行说明文档)
- 基于yolov5实现目标检测+双目摄像头实现距离测量源码
- 毕业设计-基于yolov5实现目标检测+双目摄像头实现距离测量源码
- 网络工程 实验 SNMP本机测试
- 湿地检测14-YOLO(v5至v8)、COCO、CreateML、Darknet、Paligemma、VOC数据集合集.rar
- 【java毕业设计】智慧社区网服门户(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区服务网门(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区信息门户(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区门户平台(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区应用门户(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区网端门户(源代码+论文+PPT模板).zip
- Java Swing + MyBatis框架实现的学生信息管理系统(源码+数据库)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功