处理器缓存(虚拟地址、物理地址)
省流: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的顺序是:
- 定位Index,找到地址对应的组;
- 在组内顺次寻找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
- 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
- 缓存着色技术(Cache Coloring)_cache染色-CSDN博客
- Cache coloring - Wikipedia
- Page Coloring的历史与发展 (liulei-sys-inventor.github.io)
- Page Colouring on ARMv6 (and a bit on ARMv7) - Architectures and Processors blog - Arm Community blogs - Arm Community
- PageColoring (washington.edu)
- page coloring的介绍 - L (liujunming.top)
- Jeongseob/linux-page-coloring: This is an experimental version of page coloring in Linux (github.com)
- Page Coloring - HackMD
- http://www.eecg.toronto.edu/~tamda/papers/softpart.pdf
- Computer Architecture, A Quantitative Approach, 6th.