【问题标题】:Sending Data over network inside kernel在内核内部通过网络发送数据
【发布时间】:2012-07-06 18:10:33
【问题描述】:

我正在 Linux 内核中编写一个通过网络发送数据的驱动程序。现在假设我要发送的数据(缓冲区)在内核空间中。我如何在不创建套接字的情况下发送数据(首先这是一个好主意吗?)。我正在寻找代码中的性能而不是简单的编码。我如何设计接收端?没有套接字连接,我可以在接收端获取和查看数据吗(如何)?如果缓冲区在用户空间中,所有这些都会改变(包括性能)(如果有的话,我会从用户那里复制:-))?

【问题讨论】:

  • 这是什么设备?什么样的网络?
  • 我想实现一个适用于所有网络设备的通用驱动程序。好吧,我已经阅读了太多禁止我在内核空间内编写网络代码的文章。想看看如果我这样做会发生什么
  • 我今天遇到了一个新想法。如果我在用户空间中创建一个套接字描述符并在我的驱动程序的模块插入期间传递它并使用它直到它被卸载,这是否有意义> 它仍然可以帮助我节省上下文切换的时间。只是一个随机的想法需要知道这是否比我原来的问题更好

标签: linux network-programming linux-kernel linux-device-driver


【解决方案1】:

如果您希望在没有套接字的情况下在网络上发送数据,您需要连接到网络驱动程序并通过它们发送原始数据包,并为您想要劫持的那些过滤它们的传入数据包。我认为性能优势不会大到足以证明这一点。

我什至认为网络驱动程序中没有正常的钩子,我过去做了一些相关的事情来实现防火墙。您可以想象使用 netfilter 挂钩来执行类似的操作,以便从网络驱动程序附加到接收端。

【讨论】:

  • 嗯。好吧,现在我开始不喜欢从内核内部通过网络发送数据的想法了。也许我可以创建一个一次性套接字描述符并将其传递给内核并永久使用它。见我上面写的cmets
【解决方案2】:

您可能应该使用netlink,如果您想真正与远程主机通信(例如通过 TCP/IPv6),请使用用户级代理应用程序。 (因此内核模块使用 netlink 到您的应用程序代理,它可以使用 TCP,甚至通过 ssh 或 HTTP,远程发送数据,或将其存储在磁盘上......)。

我认为让内核模块直接与远程主机通信是没有意义的(例如安全问题、过滤、路由、iptables ...)

真正的瓶颈几乎总是(物理)网络本身。 1Gbit 以太网几乎总是比内核模块或应用程序可持续产生的速度慢得多(还有延迟问题)。

【讨论】:

  • 网联?我没有创建一个用户空间应用程序来支持这个设备。整个设备位于内核空间。
猜你喜欢
  • 2014-01-02
  • 2011-12-29
  • 1970-01-01
  • 2018-02-28
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多