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

标签 c linux-kernel

我想编写一个内核模块,以接近 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/

相关文章:

c - 如何使用可选参数和非可选参数?

ios - 通过另一个类中的类方法执行Restkit配置

linux - 有没有办法找出特定 Raspberry Pi 内核的确切源代码树

c - 如何与 unsigned short int -1L 进行比较

C - 链表排序无限循环

c - 我需要在 C 中释放 strerror() 的结果吗?

Linux 2.6.31 调度程序和多线程作业

linux - 如何在Linux中定期删除内存缓存?

c - 什么是内核线程中的 set_current_state() 宏?

linux - 这些内核 panic 错误是什么意思?