mmap() 比 write() copy_from_user() 慢,为什么?

问题描述 投票:0回答:1

我需要将大数据块(~6MB)从用户空间传输到我的驱动程序。在驱动程序中,我使用 pci_alloc_concient() 为每个块分配 2 个 3MB 块。然后我使用 vm_insert_page() 将每个块(即 2 个块) mmap() 到单个 vma。这允许用户空间在映射每个块后读取/写入每个块。看起来可行,但性能不可接受。

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

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

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

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

谢谢。

linux-kernel linux-device-driver dma pci-e
1个回答
3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.