1

据说在ARM11中,Cache是​​物理寻址的,解决了很多缓存别名问题,减少了上下文切换开销

如何理解物理地址?它如何帮助解决缓存别名问题并减少上下文切换开销?

4

1 回答 1

8

有三种常见的缓存类型。

  • VIVT = 虚拟索引虚拟标记
  • VIPT = 虚拟索引物理标记
  • PIPT = 物理索引物理标记

还有

  • PIVT = 物理索引虚拟标记

PIPT 通常用于 2 级和更深的缓存,因为此时无论如何都必须知道物理地址,但 armv7 还引入了 PIPT L1 DCache。PIVT 不是很实用,因此没有在现实世界中使用。

不同之处在于高速缓存线如何连接到底层内存。

虚拟索引意味着纯高速缓存行查找是使用虚拟地址完成的,因此可以在任何虚拟到物理地址转换之前完成。然后,标记将决定缓存行是否真的映射到您的底层内存或包含恰好映射到同一缓存行的其他内存位置的数据。

如果标记是使用虚拟地址完成的,那么碰巧使用相同虚拟地址的两个进程可能会相互绊倒,因为一个进程可能会访问另一个进程放入缓存的数据。因此,对于 VIVT 缓存的 CPU,内核必须在上下文切换上刷新整个缓存。因此新进程不会意外访问不正确的数据,这通常意味着上下文切换在 VIVT 缓存的 CPU 上是一项非常昂贵的操作。在 ARMv5 及更高版本上,支持所谓的快速上下文切换扩展,它使用标签修改虚拟地址。但这涉及很多限制。

相比之下,VIPT 仍将使用虚拟地址来查找缓存行,但随后将根据物理地址检查标签,因此 MMU 查找可以与缓存行查找并行完成。

别名是 VIVT 缓存的另一个大问题。因为两个虚拟地址可能指向同一个物理内存位置(当您在用户和内核空间之间共享内存时可能会发生这种情况)。因此,您的缓存中可能有两个具有不同数据的位置,这可能很难正确管理(以正确的顺序显式刷新和使缓存无效)。

于 2012-07-05T15:19:28.337 回答