我对CPU缓存和物理地址之间的"别名"的含义有点困惑。首先我在维基百科上找到了它的定义:
但是,VIVT 存在混叠问题,其中几个不同的虚拟地址可能引用相同的物理地址。另一个问题是同音异义词,其中相同的虚拟地址映射到几个不同的物理地址。
但是过了一会儿,我在演示文稿上看到了不同的定义(ppt)DAC'05:"用于嵌入式处理器的高能效物理标记缓存虚拟内存"
缓存别名和同义词:
别名:来自不同上下文的相同虚拟地址映射到不同的物理地址 同义词:映射到同一物理地址的不同虚拟地址(数据共享)
由于我不是母语人士,我不知道哪个是正确的,虽然我觉得维基的定义是正确的。
编辑:
CPU缓存中"混叠"的概念通常意味着"同义词",相反是"同音异义词"。在更通用的层面上,"别名"是"混乱"或"混乱"或类似的东西。所以在我看来,"混叠"确切地意味着(X->Y)的映射是"非双射的",其中
"X" = 已缓存的物理地址单元的子集。(每个元素都是一行字节)
"Y" = 有效高速缓存行的集合。(元素 a 也是"行")
您需要先了解虚拟内存,但基本上是这样的:
-
程序使用的内存地址不是 RAM 使用的物理地址;它们是 CPU 映射到物理地址的虚拟地址。
-
多个虚拟地址可以指向同一个物理地址。
这意味着您可以在缓存的不同部分拥有相同数据的两个副本,而不知道...而且它们不会正确更新,所以你会得到错误的结果。
<小时 />编辑:
参考资料:
<小时 />当到内存物理页的多个映射具有冲突的缓存状态(如缓存和未缓存)时,会发生缓存别名。由于这些冲突状态,当处理器的缓存被刷新时,该物理页中的数据可能会损坏。如果该页面正由驱动程序用于 DMA,则可能导致硬件稳定性问题和系统锁定。
对于那些仍然不相信的人:
在 ARMv4 和 ARMv5 处理器上,缓存组织为虚拟索引、虚拟标记 (VIVT) 缓存,其中索引和标记都基于虚拟地址。此方法的主要优点是缓存查找速度更快,因为转换后备缓冲区 (TLB) 不参与匹配虚拟地址的缓存行。但是,由于缓存别名,此缓存方法确实需要更频繁的缓存刷新,其中相同的物理地址可以映射到多个虚拟地址。
@Wu是的,您确实需要了解虚拟内存才能理解别名。我先给大家几行解释:
假设我有一个 1GB 的 RAM(物理内存)。我想向我的程序员展示一个观点,即我有 4GB 内存,然后我使用虚拟内存。在虚拟内存中,程序员认为他/她有4GB,并从这个角度编写程序。它们不需要知道存在多少物理内存。优点是该程序将在具有不同RAM量的计算机上运行。此外,该程序可以与其他程序一起在计算机上运行(也消耗物理内存)。
因此,以下是虚拟内存的实现方式。我将给出一个简单的 1 级虚拟内存系统(英特尔有一个 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具有4KB页面。