我必须每秒从Linux内核模块向用户空间传输几兆字节的数据,如果我从中读取,我不想错过模块中的任何消息。 这样做的最佳方式是什么?
这方面的解决方案很少:命名管道,Proc-File和块设备 但我不确定选择哪一个以及哪一个承诺最佳性能,因为我是内核 - 新手。
目前我在内核模块中使用Ring-Buffer(带有自旋锁)来存储消息,如果正在读取Proc-File,我将数据从Ring-Buffer放入Proc-File;
在用户端,我有一个重复运行cat /proc/procfile
并显示输出的程序。这个解决方案的问题在于,而不是
消息1 消息2 消息3
在输出上,我看到(有时,每隔几千条消息)
消息1 MESSMESSAGE3
答案 0 :(得分:3)
您可能希望使用中继接口,以前称为relayfs。
请参阅Documentation/filesystems/relay.txt
。
从那里:
中继接口提供了一种手段 使内核应用程序高效 记录和转移大量的 从内核到用户空间的数据 用户定义的“中继频道”。
答案 1 :(得分:1)
我相信character device对你来说是个很好的解决方案。
答案 2 :(得分:1)
总是可以实现我所认为的“穷人的系统调用”:创建一个字符设备,然后用你想要的任何语义创建一个自定义的ioctl。
在这种情况下,我假设您有一个传入用户空间缓冲区的ioctl,并从内核中保存的循环缓冲区返回一大块数据。
仔细使用原子变量和自旋锁,您应该能够保证快速,安全地访问数据,甚至在必要时跨多个线程。
答案 3 :(得分:0)
许多方法都可以使用。然而,Netlink不是其中之一,因为它不是可靠的传输(如UDP)。尽管您也可以使用TCP套接字(参见nfsd)。
,但字符设备似乎是有序的