2017-10-16 84 views
1

在我的应用程序中,客户端将在UDP数据包中发送一个命令。 我想在内核中收到这个数据包,并尽快发送它的响应。 我知道我可以通过在linux用户空间中创建应用程序来实现此目的,但是当我在用户空间中收到包时存在延迟。 为了避免这种延迟,我想发送来自内核空间的响应。 我的问题是我如何编写特定的代码在内核空间中运行? 它与编写驱动程序类似吗?或者有任何其他方法来完成这项任务?内核驱动程序通过以太网响应特定的打包

回答

0

它与编写驱动程序类似吗?

不完全是。网络驱动程序旨在为定义良好的网络堆栈API提供内核和硬件之间来回转发数据包。而且,虽然您的任务可能可以通过编写自定义网络驱动程序或提供具有某些扩展名的现有网络驱动程序来解决,但这可能是一个可疑的选择。

事实上,除了修改内核代码,有一个通常称为内核旁路和/或零拷贝技术解决方案的一把。例如,如果您使用PACKET_MMAP机制,严格来说不是内核旁路,而是Linux内核中的设施,您仍然可以编写用户空间应用程序来为延迟更低的命令提供服务。它允许为从用户区到内核侧的软件Rx和Tx环制作直接内存映射。因此它可以显着减少延迟。但是,该功能假设数据包的数据包为套接字,因此典型的应用程序必须解析Rx上的数据包标头并在Tx本身上准备它们。希望这不是一项艰巨的任务。

此外,存在多种基于user-space drivers概念的真实内核旁路技术。基本上,使用特殊的内核帮助驱动程序来使用户空间中的某些设备资源可用。然后,用户空间驱动程序可以选择这些资源并直接管理NIC,而无需任何内核参与。通常,此类用户空间驱动程序与帮助程序库结合使用,并以框架的形式分发,例如dataplane kit(请在此处找到指向实际网站的链接)。

把它放在一起,最有可能的是你可能会避免任何内核修改来解决你的问题,因为更灵活的技术存在。