13

我对CPU-cache 和 Physical address 之间的“别名”的含义有些困惑。首先,我在 Wikipedia 上找到了它的定义:

然而,VIVT存在别名问题,其中几个不同的虚拟地址可能引用同一个物理地址。另一个问题是同音异义词,其中相同的虚拟地址映射到几个不同的物理地址。

但过了一会儿,我在 DAC'05 的演示文稿(ppt)上看到了不同的定义:“具有虚拟内存的嵌入式处理器的节能物理标记缓存”

缓存别名和同义词:

别名:来自不同上下文的相同虚拟地址映射到不同的物理地址同义词:不同的虚拟地址映射到相同的物理地址(数据共享)

由于我不是母语人士,我不知道哪个是正确的,尽管我觉得 Wiki 的定义是正确的。

编辑:

CPU缓存中的“aliasing”概念通常是“同义词”,相反是“同义词”。在更通用的层面上,“混叠”是“混乱”或“混乱”或类似的东西。所以在我看来,“混叠”恰好意味着 (X->Y) 的映射是“非双射的”,其中

“X” = 已缓存的物理地址单元的子集。(每个元素是一行字节)

“Y” = 有效缓存行的集合。(元素a也是“线”)

4

2 回答 2

14

您需要先了解虚拟内存,但基本上是这样的:

  • 您的程序使用的内存地址不是RAM 使用的物理地址;它们是由 CPU映射到物理地址的虚拟地址。

  • 多个虚拟地址可以指向同一个物理地址。

这意味着您可以在不知情的情况下在缓存的不同部分拥有相同数据的两个副本......并且它们不会被正确更新,因此您会得到错误的结果。


编辑:

参考摘录:

当到内存物理页的多个映射具有冲突的缓存状态(例如已缓存和未缓存)时,就会发生缓存别名。由于这些冲突状态,当处理器的缓存被刷新时,该物理页面中的数据可能会损坏。如果该页面正被驱动程序用于 DMA,这可能会导致硬件稳定性问题和系统锁定。


对于那些仍然不相信的人

在 ARMv4 和 ARMv5 处理器上,缓存被组织为虚拟索引、虚拟标记 (VIVT) 缓存,其中索引和标记都基于虚拟地址。这种方法的主要优点是高速缓存查找速度更快,因为翻译后备缓冲区 (TLB) 不参与匹配虚拟地址的高速缓存行。但是,由于缓存别名,这种缓存方法确实需要更频繁的缓存刷新,其中相同的物理地址可以映射到多个虚拟地址

于 2011-05-10T08:22:52.683 回答
5

@Wu 是的,您确实需要了解一点虚拟内存才能了解别名。我先给你解释几行:

假设我有一个 1GB 的 RAM(物理内存)。我想向我的程序员展示我有 4GB 内存然后我使用虚拟内存的观点。在虚拟内存中,程序员认为他/她有 4GB 并从这个角度编写他们的程序。他们不需要知道存在多少物理内存。优点是程序将在具有不同 RAM 量的计算机上运行。此外,该程序可以与其他程序一起在计算机上运行(也消耗物理内存)。

所以这就是虚拟内存的实现方式。我将给出一个简单的 1 级虚拟内存系统(Intel 有一个 2/3 级系统,这使解释变得复杂。

我们这里的问题是程序员有 40 亿个地址,而我们只有 10 亿个地方来放置这 40 亿个地址。所以,地址都来自虚拟地址空间,需要映射到物理地址空间。这是使用称为页表的简单索引表完成的。您使用虚拟地址访问页表,它会为您提供该内存位置的物理地址。

一些细节: 请记住,物理空间只有 1GB,因此系统仅将最近访问的 1GB 值保留在物理内存中,其余的保留在系统磁盘中。当程序请求特定地址时,我们首先检查它是否已经在物理内存中。如果是,则将其返回给程序。如果没有,则从磁盘中取出并放入物理内存,然后返回给程序。后者称为页面错误。

回到虚拟内存上下文中的别名:由于虚拟 -> 物理地址之间存在映射,因此可以使两个虚拟地址映射到相同的物理地址。这就像说如果我查看虚拟地址 X 和 Y 的页表,在两种情况下我都会得到相同的物理地址。

我在下面展示了一个 8 条目页表的简单示例。假设有 8 个虚拟地址,只有 3 个物理地址。页表如下所示:

     0:1
     1:在磁盘上
     2:2
     3:1
     4:在磁盘上
     5:在磁盘上
     6:在磁盘上
     7:0


这意味着如果访问虚拟地址 4,您将遇到页面错误。
如果访问虚拟地址 3,会得到物理地址 1
在这种情况下,虚拟地址 0 和 3 对它们来说都是同一个物理地址 1 的别名

注意:我在所有地方都使用了术语物理地址和虚拟地址来简化概念。在实际系统中,虚拟到物理的映射不是基于每个地址的。相反,我们将虚拟空间块映射到物理空间。每个块称为页(这就是映射表称为页表的原因),块的大小是 ISA 的属性,例如 Intel x86 有 4Kbyte 的页。

于 2011-05-10T15:54:27.823 回答