Filesystems 将大数据从内核传输到用户空间的最佳方式
我必须每秒将数兆字节的数据从Linux内核模块传输到用户空间,如果我从模块中读取数据,我不希望错过模块中的任何消息。 最好的方法是什么 对于这一点,有很多可能的解决方案:命名管道、Proc文件和块设备 但我不确定该选择哪一个,哪一个能保证最好的性能,因为我是内核新手 目前,我在内核模块中使用带旋转锁的环形缓冲区来存储消息,如果正在读取Proc文件,我将数据从环形缓冲区放入Proc文件; 在用户端,我有一个反复运行cat/proc/procfile并显示输出的程序。这种解决方案的问题在于 信息1 信息2 信息3 在输出上,我有时会看到,每几千条消息就有一条 信息1 信息3Filesystems 将大数据从内核传输到用户空间的最佳方式,filesystems,linux-kernel,linux-device-driver,fifo,Filesystems,Linux Kernel,Linux Device Driver,Fifo,我必须每秒将数兆字节的数据从Linux内核模块传输到用户空间,如果我从模块中读取数据,我不希望错过模块中的任何消息。 最好的方法是什么 对于这一点,有很多可能的解决方案:命名管道、Proc文件和块设备 但我不确定该选择哪一个,哪一个能保证最好的性能,因为我是内核新手 目前,我在内核模块中使用带旋转锁的环形缓冲区来存储消息,如果正在读取Proc文件,我将数据从环形缓冲区放入Proc文件; 在用户端,我有一个反复运行cat/proc/procfile并显示输出的程序。这种解决方案的问题在于 信息1
我相信这将是一个很好的解决方案。我相信这将是一个很好的解决方案。您可能想使用中继接口,以前称为中继 请参阅文档/filesystems/relay.txt 从那里: 继电器接口提供了一种方法 使内核应用程序能够高效地 记录并传输大量的数据 从内核到用户空间的数据通过 用户定义的“中继通道”
您可能想使用中继接口,以前称为中继 请参阅文档/filesystems/relay.txt 从那里: 继电器接口提供了一种方法 使内核应用程序能够高效地 记录并传输大量的数据 从内核到用户空间的数据通过 用户定义的“中继通道”
实现我所认为的穷人的系统调用始终是可能的:创建一个char设备,然后创建一个具有任何语义的定制ioctl 在本例中,我假设您有一个ioctl,它传入用户空间缓冲区,并从内核中的循环缓冲区返回一块数据
通过仔细使用原子变量和自旋锁,您应该能够保证快速、安全地访问数据,必要时甚至可以跨多个线程访问数据。始终可以实现我所认为的穷人的系统调用:创建一个char设备,然后创建一个具有任何语义的自定义ioctl 在本例中,我假设您有一个ioctl,它传入用户空间缓冲区,并从内核中的循环缓冲区返回一块数据
仔细使用原子变量和自旋锁,您应该能够保证快速、安全地访问数据,必要时甚至可以跨多个线程访问。许多方法都是可用的。然而,Netlink不是其中之一,因为它不像UDP那样是一种可靠的传输。字符设备似乎是有序的,不过您也可以使用TCP套接字cf.nfsd。许多方法都是可用的。然而,Netlink不是其中之一,因为它不像UDP那样是一种可靠的传输。字符设备似乎是有序的,不过您也可以使用TCP套接字cf.nfsd