gpt4 book ai didi

c - 在内核中高效分配内存

转载 作者:行者123 更新时间:2023-12-03 00:11:10 24 4
gpt4 key购买 nike

我想编写一个内核模块,以接近 8 mbps 的速度获取 TCP/IP 数据包。我必须将这些数据包存储 500 毫秒。稍后这些数据包应按顺序转发。这些应该为 30 名成员完成。最好的实现方法应该是什么?我应该使用 kmalloc 一次 (kmalloc(64000000, GFP_ATOMIC) 吗?因为每次我都使用 kmallockfree > 这需要时间,导致性能问题。另外,如果我一次性在内核中分配内存,Linux 内核会允许我这样做吗?

最佳答案

我曾经编写过一个处理 10Gbs 链路上的数据包的内核模块。我使用 vmalloc 分配大约 1GByte 的连续(虚拟)内存,将静态大小的哈希表放入其中以执行连接跟踪 ( code )。

如果您知道需要多少内存,我建议您预先分配它。这有两个优点

  • 速度很快(运行时无需分配/释放)
  • 如果 kmalloc(_, GFP_ATOMIC) 无法返回内存,您不必考虑策略。实际上,在重负载下,这种情况经常发生。

缺点

  • 您可能会分配比所需更多的内存。

因此,为了编写专用内核模块,请预先分配尽可能多的内存;)

如果您为许多新手用户使用的商用硬件编写内核模块,那么按需分配内存(并浪费更少的内存)会很好。

<小时/>

你在哪里分配内存? GFP_ATOMIC 只能返回非常少量的内存,并且仅应在内存分配无法休眠时使用。当可以安全 sleep 时(例如不在中断上下文中),您可以使用 GFP_KERNEL。请参阅this question了解更多。在模块初始化期间使用 vmalloc 来预分配所有内存是安全的。

关于c - 在内核中高效分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15632232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com