2010-12-07 111 views
1

我必须每秒从Linux内核模块向用户空间传输数兆字节的数据,并且我不希望错过来自模块的任何消息if我从中读取。 这样做的最好方法是什么?将大数据从内核传输到用户空间的最佳方式

这里有很多可能的解决方案:命名管道,proc文件和块设备 但我不确定哪一个可以选择,哪一个承诺最好的性能,因为我是一个内核新手。

目前我在内核模块中使用Ring-Buffer(带有自旋锁)来存储消息,并且如果正在读取Proc文件,我将来自Ring-Buffer的数据放到Proc文件中; 在用户端我有一个程序重复运行cat /proc/procfile并显示输出。这种解决方案的问题是,而不是让

消息1 消息2 消息3

的输出,我看(有时,一次几千元的消息)

MESSAGE 1 MESSMESSAGE3

回答

1

实现我认为的“穷人的系统调用”始终是可能的:创建一个char设备,然后使用任何你想要的语义创建一个自定义ioctl。

在这种情况下,我认为你会有一个传入用户空间缓冲区的ioctl,并从内核中的循环缓冲区返回一大块数据。

在仔细使用原子变量和自旋锁的情况下,您应该能够保证快速,安全地访问数据,即使在多个线程中也是如此(如有必要)。

3

您可能想要使用中继接口,以前称为relayfs。

请参阅Documentation/filesystems/relay.txt

从那里:

中继接口提供了一种手段 内核应用程序高效 日志和来自内核传送大量数据 经由 用户定义“中继信道”用户空间。

0

许多方法都可用。然而,Netlink不是其中之一,因为它不是可靠的传输方式(如UDP)。字符设备似乎是按顺序排列的,尽管您也可以使用TCP套接字(参见nfsd)。

相关问题