从没有关联 memcpy 的套接字从内核空间读取到用户空间

Posted

技术标签:

【中文标题】从没有关联 memcpy 的套接字从内核空间读取到用户空间【英文标题】:Read from a socket without the associated memcpy from kernel space to user space 【发布时间】:2014-06-11 10:44:46 【问题描述】:

在 Linux 中,有没有办法从套接字读取,同时避免数据从内核空间到用户空间的隐式 memcpy?

也就是说,而不是做

ssize_t n = read(socket_fd, buffer, count);

这显然需要内核从网络缓冲区执行 memcpy 到我提供的缓冲区,我会做类似的事情

ssize_t n = fancy_read(socket_fd, &buffer, count);

返回时,缓冲区指向从网络接收到的非 m​​emcpy() 数据。

【问题讨论】:

我不这么认为,使用shmget @AlterMann shmget() 究竟是如何“从套接字读取”的? EJP,当然是用共享内存代替了套接字的概念;) @AlterMann 您可能认为这回答了有关从套接字读取的问题,但我没有。除非对等方共同驻留在同一主机中,否则它甚至都不会工作,这在问题中没有说明。他确实提到了 network 缓冲区。 EJP,你是对的,@op: 在同一个主机上? 【参考方案1】:

最初我认为套接字系列的 AF_PACKET 选项会有所帮助,但它不能。

尽管如此,这在技术上是可能的,因为没有什么可以阻止您实现内核模块处理系统调用,该调用返回指向内核数据的用户映射指针(即使它不是很安全)。

关于您想接听的电话有几个问题:

    内存管理。你怎么知道fancy_read系统调用返回后内存仍然可以访问? 您将如何告诉内核最终释放该内存?需要有某种形式的内存管理,如果您希望内核为您提供指向非 memcpy 内存的安全指针,那么内核需要进行大量更改才能启用此功能。想象一下,在你告诉它可以释放之前,所有数据都无法释放,因此内核需要跟踪所有这些返回的指针。

这些可以通过很多方式完成,所以基本上是的,这是可能的,但你需要考虑很多事情。

【讨论】:

以上是关于从没有关联 memcpy 的套接字从内核空间读取到用户空间的主要内容,如果未能解决你的问题,请参考以下文章

如何从没有外部 IP 的 GCE VM 中读取存储桶?

Python多处理,从没有缓冲区的远程RTSP相机读取

suricata抓包方式之一 AF_PACKET

Unix下可用的五种 I/O 模型

linux IO模型

uevent 从内核发送到用户空间 (udev)