我需要将大块数据(~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.* 上运行了测试。
上述结果有意义吗?如果是,有人可以提供一些关于正在发生的事情的背景吗?
谢谢。