我们有一个应用程序,需要大约1MB缓冲区才能填充硬件设备,因此我们编写了一个使用kmalloc()分配缓冲区的内核模块.我们没有使用dma_alloc_coherent(),因为我们需要操纵缓冲区,因此希望它们被缓存(我们在需要时刷新缓存).其中一个操作是内核模块将一个缓冲区复制到另一个缓冲区.在计时这些副本时,我们看到复制缓冲区需要大约2ms.该时间不包括任何缓存刷新.
由于这似乎很慢,我们编写了一个标准的用户空间测试应用程序,它使用malloc()创建1MB缓冲区并复制它们.用户空间副本大约需要0.5毫秒,这大约是在我们正在使用的处理器/内存配置上移动此内存量的正确时间.
认为我们尝试过:为了确保它在内核空间和用户空间中不是一个不同的memcpy(),我们编写了自己的NEON优化副本,但没有任何区别.将缓冲区大小从100KB更改为10MB并没有任何区别.所有时间都超过10份,但始终非常一致.时间例程在用户空间中使用gettimeofday().
我们唯一可以想到的是,对于kmalloc()'ed memory然后malloc()'ed memory,数据缓存设置不同?
我们正在研究iMX6 ARM,Linaro kerne.
我正在测试Linux上接口的吞吐量.我正在使用DMA todo进行数据传输.DMA需要连续的内存位置.但是kmalloc无法分配超过1MB.有没有其他方法可以创建高达100M字节的大缓冲区位置?
我想编写一个内核模块,在那里我获得接近 8 mbps 的 TCP/IP 数据包。我必须将这些数据包存储 500 毫秒的持续时间。稍后这些数据包应按顺序转发。这些应该为 30 名成员完成。什么应该是最好的实施方法?我应该使用kmalloc一次(kmalloc(64000000, GFP_ATOMIC)吗?因为每次如果我这样做kmalloc,kfree都需要时间,从而导致性能问题。另外,如果我一次性在内核中分配内存,Linux 内核会允许我这样做吗?
更多的是概述问题而不是技术问题。我可以看到周围的 Linux 内核开发人员职位,我想知道您希望成为什么内核模块?与使用系统调用和执行其他操作相比,哪些类型的任务最适合作为内核模块完成?
less /proc/modules在我的系统上显示 dm_log,设备映射器的记录器。为什么日志记录是从内核完成的,而不是在用户空间完成的?
我们可以在一次调用中使用 kzalloc() 分配的最大大小是多少?
这是一个非常常见的问题。另外请让我知道我是否可以验证该值。