內核空间和用户空间之间的数据传递


为了完成老大交代的一个任务,最近一直在研究Linux从內核空间向用户空间传递数据的问题,特此总结一下.(虽然最终还是放弃了这个方案 :-( )

kernel space user space 传递数据的主要方式如下:

1 內核启动参数:编译之前进行

2 模块参数:装载模块的时候附加参数

3 sysfs

4 sysctl

5 系统调用:常用

copy_to_user()/copy_from_user();

ioctrl();

put_user()/__put_user(),get_user()/__get_user();

6 netlink;(暂时没研究)

7 虚拟文件系统


名称

开始版本

特点

方向

Profs

2.4

小数据传送;通常为1 page;cat/echo

双向

seq_file

2.4.15~2.6

大文件;

单向(U->K)

debugfs

2.6.11

输出调试信息;需要mount

双向

relayfs

2.6.14

高效,可靠大量数据传送

双向

具体参考资料:

http://www.ibm.com/developerworks/cn/linux/l-kerns-usrs/

http://www.ibm.com/developerworks/cn/linux/l-kerns-usrs2/

http://www.ibm.com/developerworks/cn/linux/l-cn-relay/

http://www-128.ibm.com/developerworks/cn/linux/l-netlink/?ca=dwcn-newsletter-linux

由于我要实现从內核传递大量数据到用户空间,所以打算选择虚拟文件系统的方式,于是对它们进行了一番研究.下面是具体的example代码:

Porfs test case:

http://www.code.sh/c1311

http://www.code.sh/c1711

seq_file test case:

http://www.code.sh/c3111

http://www.code.sh/c2211

debugfs test case:

http://www.code.sh/c3211

以上我都试过,能够编译成功,它们的特点我已经在上表列出来了.

按理说来,relayfs应该能够满足我的要求,可惜我在本机上并没有找到这个文件系统(看资料,2.6.17已经将其编译到內核了.我甚至还重新编译了一下內核,还是没有找到.所以就没有试过这个方法.)

除了上面介绍的方法,应该还有内存共享这种方式,即划出一块buffer,內核空间和用户空间能够共同访问,据说net/packet/af_packet.c是用的这个方法(libpcap&tcpdump的协议).

继续研究中

Leave a Reply