1

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

对于这个问题,可能的解决方案很少:命名管道、Proc-File 和块设备但我不确定要选择哪一个,哪一个可以保证最佳性能,因为我是内核新手。

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

信息 1 信息 2 信息 3

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

信息 1 信息 3

4

4 回答 4

3

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

Documentation/filesystems/relay.txt

从那里:

中继接口为内核应用程序提供了一种方法,可以通过用户定义的“中继通道”有效地记录大量数据并将其从内核传输到用户空间。

于 2010-12-08T05:49:52.963 回答
1

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

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

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

于 2010-12-08T17:47:20.160 回答
1

我相信字符设备对您来说是一个很好的解决方案。

于 2010-12-07T21:08:46.680 回答
0

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

于 2010-12-08T17:55:12.173 回答