gpt4 book ai didi

linux-kernel - mmap() 比 write() copy_form_user() 慢,为什么?

转载 作者:行者123 更新时间:2023-12-04 04:12:20 25 4
gpt4 key购买 nike

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

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

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

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

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

谢谢。

最佳答案

缓存可能被禁用。你 ioremap_cache() 你分配的 block 和 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com