我需要从用户空间向我的驱动程序传输大块数据(~6MB)。在驱动程序中,我使用pci_alloc_consistent()为每个块分配2个3MB块。然后我使用vm_insert_page()将每个块(即2个块)mmap()映射到单个vma。这允许用户空间在mmap之后读/写每个块。它似乎有效,但性能是不可接受的。
我还实现了另一种写入/读取驱动程序中pci_alloc_consistent()分配的内存的方式。我使用来自用户空间的write(),然后使用驱动程序中的copy_from_user()将块中每个块的内容移动到上面的内存中。我为读取做了相反的事。
我发现第一种方法至少慢了2-3倍,使用了大约40%的cpu。我预计在第二种情况下引入额外的缓冲区副本会使其变慢。但事实并非如此。
我在x86 64位平台上运行了测试,内核:2.6。*和3。*。
上述结果有意义吗?如果是,有人可以提供一些有关正在发生的事情的背景知识吗?
感谢。
答案 0 :(得分:3)
缓存可能已禁用。你是否ioremap_cache()你分配的块和vm_inserted?我在x86 / x86_64上遇到过这种问题,并且与PAT(页面属性表)有关。您需要ioremap_cache()物理页面将内存类型设置为可缓存,然后调用vm_insert_page。这应该可以解决您的性能问题。