文件支持的内存映射的 CPU 缓存行为/策略?

2024-03-08

有谁知道哪种类型的CPU缓存行为或策略(例如不可缓存的写组合)被分配给内存映射文件支持现代 x86 系统上的区域?

有什么方法可以检测是哪种情况,并可能覆盖默认行为吗?

Windows 和 Linux 是人们感兴趣的主要操作系统。

(编者注:这个问题之前被表述为内存映射 I/O https://en.wikipedia.org/wiki/Memory-mapped_I/O,但该短语具有不同的特定技术含义,尤其是在谈论 CPU 缓存时。即实际的 I/O 设备,例如您与负载/存储通信的 NIC 或显卡。

这个问题实际上是关于你从什么样的记忆中获得的mmap(some_fd, ...),当您不使用 MAP_ANONYMOUS 并且它由磁盘上的常规文件支持时。)


TL:DR 内存映射文件对映射到进程地址空间的页面缓存页面使用正常的回写策略。如果您想要非 WB 的页面,则必须执行一些特殊且特定于操作系统的操作。


应用于地址空间区域的缓存策略通常与操作系统无关,并且仅取决于地址空间页面后面的设备类型。事实上,操作系统可以自由地将任何缓存策略应用于任何内存区域,但错误分配的缓存策略可能会降低系统性能或完全破坏系统逻辑。

至少有四种缓存策略:

  1. 完全缓存(回写式,又名 WB)。 应用于映射到主存(RAM)的物理地址空间。用于提高内存子系统的性能。此类设备的主要特性是其状态只能由软件改变并且只能影响软件。

    The 内存映射文件实现使用完全缓存因为它们完全由软件(操作系统)实现,从磁盘读取文件块并将其放置在内存中,然后将该块(可能已修改)放回磁盘。硬件更新页表中的“脏”位,让操作系统找出需要同步到磁盘的内容。

  2. 直写式缓存。 (WT)此类设备的主要特性是其状态只能通过软件更改,但更改必须立即对设备产生影响。根据这个策略,写入内存映射IO设备寄存器的数据将同时放置在两个地方:缓存中和设备中。但是,当启动数据读取时,将从缓存中捕获数据,而无需对设备进行昂贵的访问。

    此缓存策略对于不写入内存、仅读取 CPU 写入内容的 MMIO 设备可能很有用。实际上,它很少用于任何用途。 GPU 则不然,它会写入视频内存,因此它不用于视频 RAM。 (GPU 没有机制使该区域的 CPU 缓存无效,因为 GPU 不是 CPU 缓存一致性域的一部分)

  3. 不可缓存、写组合(WC 又名 USCW):弱有序内存,通常用于映射视频 RAM。与不可缓存类似,不同之处在于 NT 存储可以让您一次高效地写入整个缓存行。movntdqa负载让您可以有效地读取整个缓存行 https://software.intel.com/en-us/articles/copying-accelerated-video-decode-frame-buffers,您无法从 WC 区域通过任何其他方式执行此操作。正常加载会为每个加载单独获取数据,即使在同一行中也是如此,因为它是不可缓存的。
  4. Disabled caching. (UC) Applied to the almost all IO device, because the writing to the memory-mapped IO device register must have immediate effect and read from the memory-mapped IO device register must return to the reader actual data from the device. If caching will be applied to memory-mapped IO device, then two negative effects will be introduced:
    1. 对内存映射 IO 设备寄存器的写入将被延迟,直到缓存控制器决定用写入数据刷新缓存行。因此,驱动程序将无法知道写入设备的命令何时生效。
    2. 从内存映射IO设备寄存器读取的数据可以被缓存。随后从同一内存映射 IO 设备寄存器读取的数据可能返回的不是来自设备的实际数据,而是来自缓存的过时数据。因此,驱动程序将很难捕获设备的实际状态。

由于软件指定缓存策略的方式仅依赖于处理器,因此相同的算法可以应用于任何操作系统。 最简单的方法是捕获 CR3 寄存器的内容,并使用它找到适合您想要了解缓存策略的地址的页表条目,并检查 PCD 和 PWT 标志。但这种方式并不完整,因为几乎没有其他功能会影响缓存(例如,可以在 CR0 上完全禁用缓存,另请参阅 MTRR、PAT)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文件支持的内存映射的 CPU 缓存行为/策略? 的相关文章

随机推荐