9

我知道信息交换可以通过内核和用户空间程序之间的以下接口进行

  • 系统调用

  • ioctl

  • /proc & /sys

  • 网联

我想知道

  • 如果我错过了任何其他界面?

  • 其中哪一种是交换大量数据的最快方式?(如果有任何文件/邮件/解释支持我可以参考的这种主张)

  • 哪一种是推荐的交流方式?(我认为它的网络链接,但仍然很想听听意见)

4

6 回答 6

7

交换大量数据的最快方法是内存映射。mmap 调用可以用于设备文件,然后相应的内核驱动程序可以决定将内核内存映射到用户地址空间。一个很好的例子是 Video For Linux 驱动程序,我想帧缓冲区驱动程序的工作方式相同。要很好地解释 V4L2 驱动程序的工作原理,您有:

对于大量数据,您无法击败内存映射,因为不涉及类似 memcopy 的操作,物理底层内存在内核和用户空间之间有效共享。当然,就像在所有共享内存机制中一样,您必须提供一些同步,以便内核和用户空间不会认为它们同时拥有所有权。

于 2009-06-03T07:43:26.200 回答
6

内核和使用空间之间的共享内存是可行的。

http://kerneltrap.org/node/14326

有关说明/示例。

您还可以使用非常快的命名管道。

所有这一切实际上取决于您共享的数据、是否同时访问以及数据的结构。对于简单的数据,调用可能就足够了。

Linux 内核 /proc FIFO/管道

也可能有帮助

祝你好运

于 2009-06-02T22:46:14.773 回答
5

您还可以考虑使用中继(以前称为 relayfs):

“基本上,relayfs 只是一堆可以从内核代码有效写入的 per-cpu 内核缓冲区。这些缓冲区表示为可以在用户空间中映射并直接读取的文件。此设置的目的是提供最简单的机制,允许潜在的大量数据记录在内核中并“中继”到用户空间。”

http://relayfs.sourceforge.net/

于 2009-07-07T05:49:10.713 回答
2

您显然可以使用 copy_from_user 等进行共享内存,您可以轻松设置字符设备驱动程序,基本上您所要做的就是创建一个 file_operation 结构,但这不是最快的方法。我没有基准,但现代系统上的系统调用应该是最快的。我的理由是它是最优化的。过去从用户到内核必须创建一个中断,然后进入中断表(一个数组),然后找到中断句柄(0x80),然后进入内核模式。这真的很慢,然后是 .sysenter 指令,这基本上使这个过程非常快。不详述,.sysenter 立即从寄存器 CS:EIP 中读取,并且更改非常快。相反,共享内存需要写入和读取内存,

于 2009-06-03T04:29:07.133 回答
1

这是所有可能接口的可能编译,尽管在某些方面它们相互重叠(例如,套接字和系统调用都有效地使用系统调用):

Procfs
Sysfs
Configfs
Debugfs
Sysctl
devfs (eg, Character Devices) 
TCP/UDP Sockets
Netlink Sockets 
Ioctl
Kernel System Calls
Signals
Mmap
于 2015-06-22T01:45:09.750 回答
1

至于共享内存,我发现即使使用 NUMA,运行在两个不同内核上的两个线程通过共享内存进行通信仍然需要从 L3 缓存写入/读取,如果幸运的话(在一个套接字中)它比 syscall 慢大约 2 倍,如果(不是在一个套接字上),比系统调用慢 5X-UP,我认为系统调用的硬件机制有所帮助。

于 2018-06-27T06:38:26.187 回答