在 Linux 用户空间应用程序中启用写入组合?

Chr*_*vey 5 linux caching

Linux 用户空间程序是否有一种合理的方法可以为其拥有的内存页面启用/禁用缓存写入组合

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

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

我考虑改为使用非临时写入来填充缓冲区,但它需要比我目前的努力更大的代码重构。

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

这篇 2008 年的论文讨论了用于控制页面缓存模式的不同 API。这似乎表明用户空间应用程序可以使用mmap(参见第 5.3、5.4 和 5.6 节)获得对页面的写组合访问,但文档并不清楚(至少对我而言)关于如何使用这些机制的确切信息。

lem*_*eze 4

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

我想出了这个内核模块,它允许映射用户空间中的未缓存内存。因此,它与您的要求有些不同,但也许您可以对其进行调整以实现您的目标。

让它调用:

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

你应该获得写组合内存。

目前,您必须 mmap() 模块的字符设备(请参阅test演示目录)和内存类型是固定的,但添加 ioctl 来切换它应该不会太难。

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