2017-03-06 27 views
2

Linux用户空间程序是否有一个合理的方法来启用/禁用cache write combining它拥有的内存页?在Linux用户空间应用程序中启用写入组合?

我关心的两个目标系统是:3.0内核上的Intel Haswell处理器和4.8内核上的Intel Skylake处理器。

我在调整一个成熟的多线程应用程序,它使用大缓冲区在生产者和消费者之间传输数据。基于分析,我有理由相信,应用程序有时会使用写入组合缓存而不是回写缓存从缓冲区页面中受益。

我认为改为使用非暂时写入填充缓冲区,但它需要比我目前的工作可能需要更大的代码重构。

This questionthis questionthis LWN article讨论的问题,但从设备驱动程序的角度来讨论。就我而言,我正在使用用户空间代码,以非root用户身份运行。

This 2008 paper讨论了用于控制页面缓存模式的不同API。它似乎表明用户空间应用程序可以使用mmap(请参阅5.3,5.4和5.6节)获得对页面的写入组合访问权限,但文档对于如何使用这些机制的准确性(至少对我而言)并不清楚。

+0

https://www.kernel.org/doc/ols/2008/ols2008v2-pages-135-144.pdf的第5.3节5.4是通过'/ proc' /'/ sys' fs访问PCI资源的; 5.5和5.6用'/ dev/mem'来访问所有的计算机内存。两者都需要root权限并直接访问'/ dev/mem'是不安全的。尝试使用'非暂时写入',至少比较是否有改变写入码组合模式的好处。英特尔拥有可以改变组合模式的内存填充硬件检测器,http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual .pdf 3.6.10 7.4.1 – osgx

回答

0

我最近有一个类似的需求,我需要在缓存繁重的多线程应用程序中试验未缓存的内存。

我想出了这个kernel module它允许映射未缓存的内存在用户空间。所以这与你所问的有点不同,但也许你可以调整它来实现你的目标。

让它拨打:中

  • set_memory_wc(),而不是set_memory_uc()
  • pgprot_writecombine()代替pgprot_uncached()

,你应该得到写结合的内存。

目前你必须mmap()模块的字符设备(参见test目录下的demo),内存类型是固定的,但不应该太难以添加ioctl来切换它。

我还没有尝试更改现有用户空间页面的属性,但会使它更好用!

相关问题