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

时间:2014-06-11 10:44:47

标签: c++ c linux sockets networking

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

也就是说,而不是做

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

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

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

并且返回时缓冲区指向从网络接收的非memcpy()'ed数据。

1 个答案:

答案 0 :(得分:3)

最初我认为套接字族的AF_PACKET选项可以提供帮助,但它不能。

然而,从技术上来说,这是可能的,因为没有什么能阻止你实现内核模块处理系统调用,它返回用户映射指向内核数据的指针(即使它不是很安全)。

关于您希望拥有的电话,有几个问题:

  1. 内存管理。你怎么知道在fancy_read系统调用返回后仍然可以访问内存?
  2. 你如何告诉内核最终释放内存?需要某种形式的内存管理,如果你希望内核为你提供一个安全的指向非内存的内存指针,那么需要进入内核以启用此功能。想象一下,在你告诉它之前,所有数据都无法被释放,所以内核需要跟踪所有这些返回的指针。
  3. 这些可以通过很多方式完成,所以基本上是的,这是可能的,但你需要考虑很多事情。