【问题标题】: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,它传入用户空间缓冲区,并从您保存在内核中的循环缓冲区返回一大块数据。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-14
            • 2013-09-15
            • 2014-08-02
            相关资源
            最近更新 更多