Linux 用户空间程序是否有一种合理的方法可以为其拥有的内存页面启用/禁用缓存写入组合?
我关心的两个目标系统:3.0 内核上的 Intel Haswell 处理器和 4.8 内核上的 Intel Skylake 处理器。
我正在调整一个成熟的多线程应用程序,该应用程序使用大缓冲区在生产者和消费者之间传输数据。基于分析,我有理由相信应用程序有时会从缓冲区的页面中受益,这些页面有时会使用写组合缓存,而不是回写缓存。
我考虑改为使用非临时写入来填充缓冲区,但它需要比我目前的努力更大的代码重构。
This question,this question和this LWN article讨论了这个问题,但从设备驱动程序的角度来看。就我而言,我正在使用以非 root 身份运行的用户空间代码。
这篇 2008 年的论文讨论了用于控制页面缓存模式的不同 API。这似乎表明用户空间应用程序可以使用mmap(参见第 5.3、5.4 和 5.6 节)获得对页面的写组合访问,但文档并不清楚(至少对我而言)关于如何使用这些机制的确切信息。
我最近有一个类似的要求,我需要在缓存密集的多线程应用程序中试验未缓存的内存。
我想出了这个内核模块,它允许映射用户空间中的未缓存内存。因此,它与您的要求有些不同,但也许您可以对其进行调整以实现您的目标。
让它调用:
set_memory_wc()而不是set_memory_uc()和pgprot_writecombine()代替pgprot_uncached()你应该获得写组合内存。
目前,您必须 mmap() 模块的字符设备(请参阅test演示目录)和内存类型是固定的,但添加 ioctl 来切换它应该不会太难。
我还没有尝试过更改现有用户空间页面的属性,这会让它更好用!
| 归档时间: |
|
| 查看次数: |
1182 次 |
| 最近记录: |