netfilter与用户空间通信二法

转载 2012年03月30日 15:20:43

原文:http://blog.csdn.net/wangxing1018/article/details/4295536


1 先说明一下环境。Linux 内核代码的运行环境有三种:用户上下文环境、硬中断环境和软中断环境。但三种环境的局限性分两种,因为软中断环境只是硬中断环境的延续。

内核态环境 介绍 局限性
用户上下文 内核态代码的运行与一用户空间进程相关,如系统调用中代码的运行环境。 不可直接将本地变量传递给用户态的内存区,因为内核态和用户态的内存映射机制不同。
硬中断和软中断环境 硬中断或软中断过程中代码的运行环境,如 IP 数据报的接收代码的运行环境,网络设备的驱动程序等。 不可直接向用户态内存区传递数据;
代码在运行过程中不可阻塞。

 

2 传统进程间通信的局限性。Linux 传统的进程间通信有很多,如各类管道、消息队列、内存共享、信号量等等。但它们都无法介于内核态与用户态使用,原因如表:

通信方法 无法介于内核态与用户态的原因
管道(不包括命名管道) 局限于父子进程间的通信。
消息队列 在硬、软中断中无法无阻塞地接收数据。
信号量 无法介于内核态和用户态使用。
内存共享 需要信号量辅助,而信号量又无法使用。
套接字 在硬、软中断中无法无阻塞地接收数据。

 

3解决办法。Linux内核态与用户态进程通信方法的提出与实现。分为用户上下文环境、硬中断和软中断环境两种情况。

3.1 用户上下文环境

运行在用户上下文环境中的代码是可以阻塞的,这样,便可以使用消息队列和 UNIX域套接字来实现内核态与用户态的通信。但这些方法的数据传输效率较低,Linux 内核提供copy_from_user()/copy_to_user()函数来实现内核态与用户态数据的拷贝,但这两个函数会引发阻塞,所以不能用在硬、软中断中。一般将这两个特殊拷贝函数用在类似于系统调用一类的函数中,此类函数在使用中往往"穿梭"于内核态与用户态。

3.2 硬、软中断环境

比起用户上下文环境,硬中断和软中断环境与用户态进程无丝毫关系,而且运行过程不能阻塞。在 Linux 2.4 版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的,netlink 套接字的最大特点是对中断过程的支持,同时还使用 netlink 实现了 ip queue 工具,但 ip queue 的使用有其局限性,不能自由地用于各种中断过程。还有重要的一点:netlink 套接字是不用经过TCP/IP协议栈处理的,效率方面没的说。赞。

了这么多,都是别人的东西。但是磨刀不误砍柴工,没有前面的知识铺垫,只怕你对怎么样,为什么这样用也是一知半解,这可是工程技术人员的大忌。

4 netfilter与用户空间通信二法

netfilter的五个钩子在内核TCP/IP协议栈的作用和布局,我就不废话了。杨沙洲的Linux Netfilter实现机制和扩展技术还不错滴。

法1:nf_sockopt_ops通信方式

此法在内核模块中注册nf_register_sockopt一个nf_sockopt_ops结构体。比如:

其中命令字不能和内核已有的重复,宜大不宜小。命令字很重要,是用来做标识符的。set/get处理函数是直接由用户空间的set/getsockopt函数调用的。setsockopt函数向内核写数据,用getsockopt向内核读数据。

nf_sockopt通信

从上图可以看到,其实此法的本质,就是使用copy_from_user()/copy_to_user()完成内核和用户的通信的,效率其实不高,多用在传递控制选项信息,不适合做大量的数据传输。

法2:netlink套接字

netlink通信流图

上图很清楚的描述了netlink套接字的通信过程。具体细节,大家可以参考上面两篇文章。

总结:

法一:多用在用户上下文环境,适合做控制选项,传递少量的控制信息。

法二:多用在硬、软中断环境,也就是处理网络数据报的接收等,适合大量处理数据的传输。我用它粗略实现过类似ethereal的功能,层层吧IP分组剥开。

二者使用环境不一样,使用目的不一样,完全可以在一起发挥更大的作用。

netfilter与用户空间通信二法

netfilter与用户空间通信二法 分类: 网络部分 2009-06-24 19:01 982人阅读 评论(1) 收藏 举报 linuxlinux内核user技术人stru...
  • lionzl
  • lionzl
  • 2013年10月09日 09:34
  • 776

netfilter与用户空间通信

在做p2p流控的时候,学习到了linux用户空间与内核通信的方法。在http://www.ibm.com/developerworks/cn/linux/l-netlink/index.html一文中...
  • jiangyi711
  • jiangyi711
  • 2009年11月06日 02:38
  • 411

linux 内核与用户空间通信

Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V ...
  • shuilaner_
  • shuilaner_
  • 2016年05月27日 22:50
  • 2432

linux用户空间与内核空间的通信技术总结

原文地址:http://bbs.chinaunix.net/thread-1940094-1-1.html 多数的 Linux 内核态程序都需要和用户空间的进程交换数据,但 Linux 内核态无法对...
  • okbaozhen
  • okbaozhen
  • 2012年04月11日 22:27
  • 4452

十进制数转换为二进制数的除2取余法和乘2取整法的依据

下面是一个公式 y=\begin{cases} -x & x x & x\geq0 \end{case} 看到了吗
  • dazuo_01
  • dazuo_01
  • 2013年10月03日 10:03
  • 2476

linux内核空间与用户空间通信

由用户空间主动发起的信息交互编写自己的系统调用目前linux大致提供了两百多个标准的系统调用,并且允许我们添加自己的系统调用来实现和内核的信息交互。编写驱动程序read, write, ioctl使用...
  • luckywang1103
  • luckywang1103
  • 2015年11月16日 20:22
  • 672

用netfilter hook开发LKM[转]

在原有的网络部分的LKM中,如果对网络部分进行处理,一般是先生成 struct packet_type 结构,在用dev_add_pack 将其插入网络层(注意此时的 packet_type 实际相...
  • freeman1975
  • freeman1975
  • 2015年10月21日 10:11
  • 784

除二反序取余法:十进制转二进制

下面来看十进制怎么换算成二进制。我们知道 13=1×2 3 +1×2 2 +0×2 1 +1×2 0 所以13换算成二进制应该是(1101) 2 。问题是怎么把13分解成等号右边的形式呢?注意到等...
  • e421083458
  • e421083458
  • 2014年09月12日 14:22
  • 3114

linux内核空间和用户空间的介绍和通信

linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。   Linux简化了分段机制,使得虚拟地址与线性地址总是一致...
  • Jkf40622
  • Jkf40622
  • 2014年10月14日 12:55
  • 1627

linux netfilter/iptables 架构分析及nelink的使用

本文主要介绍,分为三部分: 1.linux netfilter/iptables组织架构,及其如何扩展netfilter模块。 2.linux netlink机制及其使用方式。 3.介绍内核模块的编写...
  • linux_embedded
  • linux_embedded
  • 2013年09月29日 11:14
  • 2580
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netfilter与用户空间通信二法
举报原因:
原因补充:

(最多只允许输入30个字)