內核空间和用户空间之间的数据传递
Wednesday, September 19th, 2007为了完成老大交代的一个任务,最近一直在研究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:
seq_file test case:
debugfs test case:
以上我都试过,能够编译成功,它们的特点我已经在上表列出来了.
按理说来,relayfs应该能够满足我的要求,可惜我在本机上并没有找到这个文件系统(看资料,说2.6.17已经将其编译到內核了.我甚至还重新编译了一下內核,还是没有找到.所以就没有试过这个方法.)
除了上面介绍的方法,应该还有内存共享这种方式,即划出一块buffer,內核空间和用户空间能够共同访问,据说net/packet/af_packet.c是用的这个方法(libpcap&tcpdump的协议).
继续研究中…