我们有一个应用程序需要大约 1MB 的缓冲区来填充硬件设备,因此我们编写了一个内核模块,使用 kmalloc() 分配缓冲区。我们没有使用 dma_alloc_coherent() 因为我们需要操纵缓冲区,因此希望它们被缓存(我们在需要时刷新缓存)。完成的操作之一是内核模块将一个缓冲区复制到另一个缓冲区。在计时这些副本时,我们看到复制缓冲区大约需要 2 毫秒。该时间不包括任何缓存刷新。
由于这看起来很慢,我们编写了一个标准的用户空间测试应用程序,它使用 malloc() 创建 1MB 缓冲区并复制它们。用户空间副本大约需要 0.5 毫秒,这大约是在我们正在使用的处理器/内存配置上移动这么多内存的正确时间。
我们尝试过的想法:为了确保它在内核空间和用户空间中不是不同的 memcpy(),我们编写了自己的 NEON 优化副本,但没有任何区别。将缓冲区大小从 100KB 更改为 10MB,没有任何区别。所有时间都超过 10 份,但总是非常非常一致。时间例程在用户空间中使用 gettimeofday()。
我们唯一能想到的是,kmalloc()'ed 内存和 malloc()'ed 内存的数据缓存设置不同???
我们正在研究 iMX6 ARM、Linaro 内核。