【问题标题】:Dirty Cache lines and Page eviction脏缓存行和页面驱逐
【发布时间】:2024-04-12 12:20:01
【问题描述】:

当操作系统选择它所在的页面进行驱逐时,尚未写回的脏缓存行(假设写回缓存)会发生什么情况。换句话说,当一个页面被选择从主内存中驱逐时,页面的缓存行会发生什么。

一般的假设是,当页面从内存中被逐出时,它已经足够冷而不会被缓存。但是,这会在更大的缓存中造成问题吗?如果说我们有足够的缓存行来容纳每页的 1 行?

【问题讨论】:

  • 有趣的地方。存在一个问题,因为内存是通过 DMA 从主内存复制到磁盘的,并且无法访问 CPU 的缓存。*的 DMA 文章 mentions this issue。对于 x86 硬件,另一个 SO question 询问了这个问题。 *.com/questions/7132284/…。显然,这些天硬件可以/确实有 DMA 缓存窥探。现代 CPU 中的内存控制器是内置在 CPU 内核中的,因此它们检查缓存并不难。
  • 我在linux dma cache coherence 上搜索到了很多点击,所以试试吧。

标签: caching operating-system hardware x86-64 page-fault


【解决方案1】:

缓存行不会直接发生任何事情。在操作系统中,我们必须始终假设最坏的可能性,即使是小缓存也可能面临您提出的方案。但是,操作系统不需要直接对缓存行做任何事情,正常的分页过程会处理这种情况。

当操作系统决定驱逐一个页面时,它将首先将其内容写入磁盘(因为处理器会将页表条目标记为脏,表示该页面已被写入)。在此过程中,操作系统将从包括脏缓存行在内的整个页面中读取值,因此它们将被写回,至少写入磁盘。

接下来,作为驱逐页面的一部分,操作系统将使将虚拟地址映射到物理地址的转换无效。即使缓存行仍然是脏的,它们也不能再被进程(即程序)访问。在这一步之后,操作系统会将不同的数据写入物理页,这个动作会使缓存行失效。最后,新改用的物理页面将被映射到一个虚拟地址。

【讨论】:

  • 我同意操作系统不需要对缓存行做任何事情,因为它们是由硬件管理的。但是,当 DMA 控制器将内存页面写入磁盘时,该位置的最新副本必须来自脏缓存行。这表明 DMA 控制器具有访问高速缓存行的总线。从硬件的角度来看,这就是它的工作原理吗?
  • @adarshpatil 我想,在这种情况下,WBINVD 会有所帮助吗?
  • @AlexeyFrunze:现在似乎有 DMA 缓存窥探,但在此之前,您需要循环运行 CLFLUSH 的页面。 WBINVD 清除了整个缓存,包括所有 8MiB 的共享 L3 或您拥有的任何大小,对于具有大型缓存的现代系统而言,这方式太昂贵了。跨度>
  • @PeterCordes 你说得对,WBINVD 太贵了。 OTOH,我不记得曾经需要在 x86 PC 上显式刷新缓存。在大多数情况下(从 80486 开始,因为 80386 没有内部缓存)看起来像缓存侦听,芯片组会自动为您执行此操作。
  • @Brian:当你review first-posts时,更正标签,记住这是一个一次性队列,所以更愿意跳过:*.com/posts/35319533/revisions跨度>
最近更新 更多