Archive for September, 2007

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

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:

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的协议).

继续研究中

diglog

Friday, September 14th, 2007

diglog提交了一下code.sh,结果带来了300多的ip,果然厉害!

collect,save and share your code online

Wednesday, September 12th, 2007

code.share,share your code

911

Tuesday, September 11th, 2007

手里的工作进展缓慢.
实现内核空间向用户空间的数据传递.
debugfs好像还是不能满足要求.
relayfs按理说来是最好的选择,可是为什么在本机上就找不到这个本应该存在的文件系统呢?
或许再看看procfs
如果用文件系统中转的话,又要涉及到数据同步的问题
====
收到邮件,pligg 8.0 发布了.
====
上午得知我们driver team 将有两人离职.