处理器缓存(虚拟地址、物理地址)

省流:Cache Coloring通过将连续的空闲页面分配给处理器,

[!NOTE]

😭←工作了还在学习基础知识的我暗自落泪

缓存类型

CPU发出对某个地址的数据访问,这里的地址是虚拟地址(VA)。VA经MMU转换得到物理地址(PA),才能从物理内存中获取对应的数据。有的时候,因为VA不合法,导致被MMU拦截,这就是MMU的权限检查机制。也就是说,VA到PA的转换是内含权限的检查的。

那么,我们要想在这个过程中应用Cache,应当如何做呢?通常,CPU以缓存行(一般为64Byte)为单位把物理内存中的数据读取到CPU缓存中。为了定位缓存行,物理地址被分为3个部分。

  • Tag:标签,也被称为路(Way)
  • Index:索引,也被称为组(Set)

    >  [!TIP]
    >
    > k路组相联指的是每组内有k个缓存行。
    
  • Offset:偏移量,缓存行中数据的具体位置

以目前常见的48bit虚拟寻址,Cache大小64KB,4路组相联系统,地址组成如下。

| 标题 | Blank | Tag | Index | Offset |
|-|-|-|-|-|
| 位数 | 63-48 | 47-14 | 13-6 | 5-0 |
| 解释 | 保留,ARM64中具有TBI可挪用,x86中必须为空 | 剩余的位 | 64KB/64B/4=256组(8bit) | 64B(6bit) |

使用组相联时,组内为全相联映射,即同一组内数据可出现在组内的任意位置;组间为直接映射,即内存地址对应的组是唯一的。因此,访问Cache的顺序是:

  1. 定位Index,找到地址对应的组;
  2. 在组内顺次寻找Tag对应的缓存行并返回。

这里涉及2个操作,定位组(索引缓存)顺次寻找缓存行(对比地址)。因此这里的缓存设计时,就具有多样性。

  • 最容易想到的方法是,在地址被转换为PA之后,首先查看Cache中是否具有该数据。这种Cache以PA Index作为索引来查找缓存行所在的组,并使用PA Tag顺次寻找所需缓存行。这种组织方式称为物理缓存(PIPT)
  • 此外,能想到的是,如果全部使用VA来作为查找缓存行的依据,那么是不是可以省去VA转换为PA的开销呢?因此,可以使用VA Index查找组,然后使用VA Tag顺次寻找缓存行。这种组织方式称为虚拟缓存(VIVT)

比较两者

PIPT

PIPT是最简单的方式,简单但是性能差。

  • 每次进行访问都需要先经过地址转换才能访问Cache,MMU在访问数据的关键路径中。

VIVT

VIVT是优化性能之后的方式。

  • 不一定需要经过TLB,MMU不一定在关键路径中。

但是,命运早已在暗中标明了价格。

  • 页级保护安全问题:操作系统需要对页面的访问权限进行控制和管理,其确保进程只能访问被授权的内存区域。权限检查的工作是在地址转换的过程中进行的;如果使用虚拟缓存省去了地址转换的过程,那么就不会进行内存页面的权限检查,从而导致安全问题。

    • 解决方案:那就送给MMU转换一下呗,只不过性能可能Fallback到PIPT了
  • VA重用:VA在不同的进程中所指向的PA一般不同,因此在进行进程切换的时候需要将虚拟缓存的内容进行更换(刷新),否则就可能出现“货不对板”的问题。

    • 解决方案:缓存附带PID,用PID+VA区分不同的VA空间。
  • PA重用:不同的VA可能映射到同一个PA,这种重复地址称为别名地址。此时使用虚拟缓存,则会产生多份缓存副本。不仅仅是浪费缓存空间,关键是其中一份的修改无法影响到另一份缓存,可能会导致程序行为不一致。

    • 解决方案:使用Page Coloring,保证每一个缓存块都拥有一个独一无二的物理地址。具体做法是,对虚拟存储器应用组相联映射,使用均匀的分布函数(例如某种Hash函数)等将虚拟地址均匀映射到物理地址上,以增大页面偏移。

两者结合:VIPT

VIPT结合了VIVT和PIPT的优点。VIPT将内存地址分成2个部分:使用PA的PFN部分作为Cache的Tag,使用VA对应的剩余位作为Cache的Index。

不过你可能会说,VIPT不也要用到TLB吗,相比PIPT还更复杂,那么它的优势在哪里?

查找Cache Index和MMU转换地址(一般为TLB翻译得到PFN)是同时进行的。因此性能可以做到与VIVT相近。

但是由于其使用VI,因此在页面数量过多(Index+页内偏移>VI)时会有别名问题。

Ref

  1. Xiao Zhang, Sandhya Dwarkadas, and Kai Shen. 2009. Towards practical page coloring-based multicore cache management. In Proceedings of the 4th ACM European conference on Computer systems (EuroSys '09). Association for Computing Machinery, New York, NY, USA, 89–102. https://doi.org/10.1145/1519065.1519076
  2. 缓存着色技术(Cache Coloring)_cache染色-CSDN博客
  3. Cache coloring - Wikipedia
  4. Page Coloring的历史与发展 (liulei-sys-inventor.github.io)
  5. Page Colouring on ARMv6 (and a bit on ARMv7) - Architectures and Processors blog - Arm Community blogs - Arm Community
  6. PageColoring (washington.edu)
  7. page coloring的介绍 - L (liujunming.top)
  8. Jeongseob/linux-page-coloring: This is an experimental version of page coloring in Linux (github.com)
  9. Page Coloring - HackMD
  10. http://www.eecg.toronto.edu/~tamda/papers/softpart.pdf
  11. Computer Architecture, A Quantitative Approach, 6th.

发表新评论