代码之家  ›  专栏  ›  技术社区  ›  awdz9nld

文件备份内存映射的CPU缓存行为/策略?

  •  15
  • awdz9nld  · 技术社区  · 11 年前

    是否有人知道将哪种类型的CPU缓存行为或策略(例如,不可缓存的写入组合)分配给内存映射 文件备份的 现代x86系统上的区域?

    有没有任何方法可以检测出是哪种情况,并可能覆盖默认行为?

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

    (编者按:这个问题以前的措辞是 memory mapped I/O ,但这个短语有不同的特定技术含义,尤其是在谈到CPU缓存时。即实际的i/O设备,如NIC或视频卡,您可以与负载/存储进行通信。

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

    2 回复  |  直到 6 年前
        1
  •  16
  •   Peter Cordes Steve Bohrer    6 年前

    TL:DR内存映射文件对映射到进程地址空间的页面缓存的页面使用正常的回写策略。如果你想要不是WB的页面,你必须做一些特别的和操作系统特定的事情。


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

    至少有四种缓存策略:

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

      这个 内存映射文件实现使用完全缓存 因为它们完全是由软件(操作系统)实现的,该软件从磁盘读取文件块并将其放入内存,然后将该块(可能经过修改)放回磁盘。硬件会更新页面表中的“脏”位,让操作系统确定需要同步到磁盘的内容。

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

      这种缓存策略对于不写入内存、只读取CPU写入内容的MMIO设备可能很有用。在实践中,它很少用于任何用途。GPU不是那样的,而且它确实写视频内存,所以它不用于视频RAM。(GPU没有使该区域的CPU缓存无效的机制,因为GPU不是CPU缓存一致性域的一部分)

    3. 不可缓存,写组合(WC又名USCW) :通常用于映射视频RAM的弱有序内存。就像不可缓存一样,除了NT存储可以让您一次高效地写入整个缓存行。 movntdqa loads let you efficiently read whole cache lines ,这是从WC区域无法执行的任何其他方式。普通加载为每个加载单独获取数据,即使是在同一行中,因为它是不可缓存的。
    4. 已禁用缓存。(UC) 应用于几乎所有的IO设备,因为写入内存映射的IO设备寄存器必须立即生效,并且从内存映射的I/O设备寄存器读取必须返回设备的实际数据给读取器。如果缓存将应用于内存映射IO设备,那么将引入两个负面影响:
      1. 对存储器映射IO设备寄存器的写入将被延迟,直到高速缓存控制器决定用写入的数据刷新高速缓存线的时刻。因此,驱动程序将无法知道写入设备的命令何时生效。
      2. 可以缓存从存储器映射IO设备寄存器读取的数据。从相同的内存映射IO设备寄存器中读取的后续数据可以从缓存中返回的不是设备中的实际数据,而是过时的数据。因此,驱动程序将很难捕捉设备的实际状态。

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

        2
  •  2
  •   MSalters    11 年前

    再加上查拉图斯特拉现有的答案:在Windows上, SEC_NOCACHE 这种缓存的次数。有一个 SEC_WRITECOMBINE ,但似乎已损坏(仅适用于 SEC_RESERVE SEC_COMMIT ,这意味着只使用页面文件,并且您不想设置 秒写入合并 关于这一点)。