【问题标题】:Best way to transfer large data from kernel to user-space将大数据从内核传输到用户空间的最佳方法
【发布时间】:2010-12-09 05:34:52
【问题描述】:
我必须每秒将几兆字节的数据从 Linux 内核模块传输到用户空间,如果我从中读取,我不想错过来自模块的任何消息。
最好的方法是什么?
这方面可能的解决方案很少:命名管道、Proc-File 和块设备
但是由于我是内核新手,我不确定要选择哪一个,以及哪一个可以保证最好的性能。
目前我在内核模块中使用 Ring-Buffer(带有自旋锁)来存储消息,如果正在读取 Proc-File,我将数据从 Ring-Buffer 放入 Proc-File;
在用户端,我有一个重复运行cat /proc/procfile 并显示输出的程序。这个解决方案的问题是,而不是得到 p>
消息 1
信息 2
消息 3
在输出中,我看到(有时,每几千条消息一次)
消息 1
消息3
【问题讨论】:
标签:
filesystems
linux-kernel
linux-device-driver
fifo
【解决方案1】:
您可能想使用中继接口,以前称为relayfs。
见Documentation/filesystems/relay.txt。
从那里:
中继接口提供了一种手段
让内核应用程序有效地
记录并传输大量
从内核到用户空间的数据通过
用户定义的“中继通道”。
【解决方案2】:
始终可以实现我认为的“穷人的系统调用”:创建一个 char 设备,然后使用您想要的任何语义创建一个自定义 ioctl。
在这种情况下,我假设您有一个 ioctl,它传入用户空间缓冲区,并从您保存在内核中的循环缓冲区返回一大块数据。
通过仔细使用原子变量和自旋锁,您应该能够保证快速、安全地访问数据,必要时甚至可以跨多个线程。
【解决方案4】:
许多方法都是可用的。然而,Netlink 不是其中之一,因为它不是可靠的传输(如 UDP)。字符设备似乎是有序的,但您也可以使用 TCP 套接字(参见 nfsd)。