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



linux用户空间程序启用/禁用缓存写入组合的内存页面有合理的方法吗?

我关心的两个目标系统:3.0内核上的英特尔·哈斯韦尔处理器,以及4.8个内核上的英特尔skylake处理器。

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

我考虑的是使用非时空写作来填充缓冲区,但是它需要比我当前的努力更大的代码重构。

这个问题,这个问题和本LWN文章讨论了该问题,但从设备驱动程序的角度来看。就我而言,我正在使用用户空间代码,以非根源运行。

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

我最近有类似的要求,我需要在高速缓存的多线程应用程序中尝试未缓解的内存。

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

呼叫:

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

您应该得到写入组合记忆。

目前,您必须MMAP()模块的字符设备(请参见Demo的test目录),并且内存类型已固定,但不应该添加IOCTL来切换它。

我尚未尝试更改现有用户空间页面的属性,将使使用更好!

最新更新