我需要将大块数据(~6MB)从用户空间传输到我的驱动程序。在驱动程序中,我使用 pci_alloc_consistent() 为每个块分配了 2 个 3MB 的块。然后我使用 vm_insert_page() 将每个块(即 2 个块)mmap() 到单个 vma。这允许用户空间在 mmap'ing 之后读/写每个块。它似乎有效,但性能 Not Acceptable 。

我还实现了另一种写入/读取驱动程序中 pci_alloc_consistent() 分配的内存的方法。我从用户空间使用 write() 然后在驱动程序中使用 copy_from_user() 将块中每个块的内容移动到上述内存。我做相反的阅读。

我发现第一种方法至少慢了 2-3 倍,并且使用了大约 40% 的 CPU。我预计在第二种情况下引入额外的缓冲区副本会使其变慢。然而,情况并非如此。

我在 x86 64 位平台上运行了大多数测试,内核:2.6.* 和 3.*。

以上结果有意义吗?如果是,有人可以提供一些关于正在发生的事情的背景吗?

谢谢。

最佳答案

缓存可能被禁用。您是否 ioremap_cache() 您分配和 vm_inserted 的块?我在 x86/x86_64 上遇到过这种问题,与 PAT(页面属性表)有关。您需要对物理页进行 ioremap_cache() 以将内存类型设置为可缓存,然后调用 vm_insert_page。那应该可以解决您的性能问题。

关于linux-kernel - mmap() 比 write() copy_form_user() 慢,为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16628164/

10-14 16:30