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

Filesystems 将大数据从内核传输到用户空间的最佳方式,filesystems,linux-kernel,linux-device-driver,fifo,Filesystems,Linux Kernel,Linux Device Driver,Fifo,我必须每秒将数兆字节的数据从Linux内核模块传输到用户空间,如果我从模块中读取数据,我不希望错过模块中的任何消息。 最好的方法是什么 对于这一点,有很多可能的解决方案:命名管道、Proc文件和块设备 但我不确定该选择哪一个,哪一个能保证最好的性能,因为我是内核新手 目前,我在内核模块中使用带旋转锁的环形缓冲区来存储消息,如果正在读取Proc文件,我将数据从环形缓冲区放入Proc文件; 在用户端,我有一个反复运行cat/proc/procfile并显示输出的程序。这种解决方案的问题在于 信息1

我必须每秒将数兆字节的数据从Linux内核模块传输到用户空间,如果我从模块中读取数据,我不希望错过模块中的任何消息。 最好的方法是什么

对于这一点,有很多可能的解决方案:命名管道、Proc文件和块设备 但我不确定该选择哪一个,哪一个能保证最好的性能,因为我是内核新手

目前,我在内核模块中使用带旋转锁的环形缓冲区来存储消息,如果正在读取Proc文件,我将数据从环形缓冲区放入Proc文件; 在用户端,我有一个反复运行cat/proc/procfile并显示输出的程序。这种解决方案的问题在于

信息1 信息2 信息3

在输出上,我有时会看到,每几千条消息就有一条

信息1 信息3


我相信这将是一个很好的解决方案。

我相信这将是一个很好的解决方案。

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

请参阅文档/filesystems/relay.txt

从那里:

继电器接口提供了一种方法 使内核应用程序能够高效地 记录并传输大量的数据 从内核到用户空间的数据通过 用户定义的“中继通道”


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

请参阅文档/filesystems/relay.txt

从那里:

继电器接口提供了一种方法 使内核应用程序能够高效地 记录并传输大量的数据 从内核到用户空间的数据通过 用户定义的“中继通道”


实现我所认为的穷人的系统调用始终是可能的:创建一个char设备,然后创建一个具有任何语义的定制ioctl

在本例中,我假设您有一个ioctl,它传入用户空间缓冲区,并从内核中的循环缓冲区返回一块数据


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

始终可以实现我所认为的穷人的系统调用:创建一个char设备,然后创建一个具有任何语义的自定义ioctl

在本例中,我假设您有一个ioctl,它传入用户空间缓冲区,并从内核中的循环缓冲区返回一块数据


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

许多方法都是可用的。然而,Netlink不是其中之一,因为它不像UDP那样是一种可靠的传输。字符设备似乎是有序的,不过您也可以使用TCP套接字cf.nfsd。

许多方法都是可用的。然而,Netlink不是其中之一,因为它不像UDP那样是一种可靠的传输。字符设备似乎是有序的,不过您也可以使用TCP套接字cf.nfsd