将大数据从内核传输到用户空间的最佳方法

时间:2010-12-07 16:30:25

标签: filesystems linux-kernel linux-device-driver fifo

我必须每秒从Linux内核模块向用户空间传输几兆字节的数据,如果我从中读取,我不想错过模块中的任何消息。 这样做的最佳方式是什么?

这方面的解决方案很少:命名管道,Proc-File和块设备 但我不确定选择哪一个以及哪一个承诺最佳性能,因为我是内核 - 新手。

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

  

消息1   消息2   消息3

在输出上,我看到(有时,每隔几千条消息)

  

消息1   MESSMESSAGE3

4 个答案:

答案 0 :(得分:3)

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

请参阅Documentation/filesystems/relay.txt

从那里:

  

中继接口提供了一种手段   使内核应用程序高效   记录和转移大量的   从内核到用户空间的数据   用户定义的“中继频道”。

答案 1 :(得分:1)

我相信character device对你来说是个很好的解决方案。

答案 2 :(得分:1)

总是可以实现我所认为的“穷人的系统调用”:创建一个字符设备,然后用你想要的任何语义创建一个自定义的ioctl。

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

仔细使用原子变量和自旋锁,您应该能够保证快速,安全地访问数据,甚至在必要时跨多个线程。

答案 3 :(得分:0)

许多方法都可以使用。然而,Netlink不是其中之一,因为它不是可靠的传输(如UDP)。尽管您也可以使用TCP套接字(参见nfsd)。

,但字符设备似乎是有序的