在我的应用程序中,客户端将在UDP数据包中发送一个命令。 我希望在内核中收到此数据包并尽快发送其响应。 我知道我可以通过在linux用户空间中创建应用程序来实现这一点,但是当我在用户空间中收到包时会有延迟。 为了避免这种延迟,我想从内核空间发送响应。 我的问题是如何编写在内核空间中运行的特定代码? 它与写作驱动程序类似吗?或任何其他方法来实现这一任务?
答案 0 :(得分:0)
是否与编写驱动程序类似?
不完全是。网络驱动程序旨在为明确定义的网络堆栈API提供服务,以在内核和硬件之间来回转发数据包。而且,虽然您的任务可能可以通过编写自定义网络驱动程序或为现有网络驱动程序提供一些扩展来解决,但这可能是一个可疑的选择。
事实上,除了修改内核代码之外,还有一些通常称为内核绕过和/或零拷贝技术的解决方案。 例如,您仍然可以编写用户空间应用程序来以较低的延迟提供命令,前提是您使用的PACKET_MMAP机制严格来说不是内核旁路,而是Linux内核中的工具。它允许用户从用户域到内核端进行软件Rx和Tx环的直接内存映射。因此,它可以显着减少延迟。但是,该功能假设数据包套接字,因此典型应用程序必须解析Rx上的数据包标头并在Tx本身上进行准备。希望这不是一项艰巨的任务。
此外,存在多种真正的内核旁路技术,这些技术通常基于user-space drivers的概念。基本上,使用特殊的内核辅助驱动程序来在用户空间中提供一些设备资源。然后,用户空间驱动程序可以选择这些资源并直接管理NIC而无需任何内核参与。通常,此类用户空间驱动程序与帮助程序库结合使用,并以框架的形式分发,例如dataplane kit(请找到指向实际网站的链接)。
要把它放在一起,很可能你可以避免任何内核修改来解决你的问题,因为存在更灵活的技术。