3

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

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

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

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

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

谢谢。

4

1 回答 1

3

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

于 2013-06-28T19:55:49.870 回答