我对CPU缓存和物理地址之间的“别名”的含义感到有些困惑。 首先,我在维基百科上找到了它的定义:
但是,VIVT遇到别名问题,其中几个不同的虚拟地址可能引用相同的物理地址。另一个问题是同音异义词,其中相同的虚拟地址映射到几个不同的物理地址。
但过了一会儿,我在演示文稿中看到了不同的定义( ppt ) DAC'05:“用于嵌入式处理器的高能效物理标记高速缓存” 虚拟记忆“
缓存别名和同义词:
别名:来自不同上下文的相同虚拟地址映射到不同的物理地址同义词:映射到同一物理地址的不同虚拟地址(数据共享) < / p>
由于我不是母语,我不知道哪个是正确的, 虽然我觉得Wiki的定义是正确的。
修改
CPU缓存中的“别名”概念通常表示“同义词”,相反是“谐音”。在更通用的层面上,“别名”是“令人困惑”或“混乱”或类似的东西。所以在我看来,“混叠”恰恰意味着(X-> Y)的映射是“不是双射的”,其中
“X”=已缓存的物理地址单元的子集。 (每个元素都是一行字节)
“Y”=有效缓存行的集合。 (元素也是“行”)
答案 0 :(得分:12)
您首先需要了解虚拟内存,但基本上就是这样:
程序使用的内存地址不是RAM使用的物理地址;它们是虚拟地址映射到CPU的物理地址。
多个虚拟地址可以指向相同的物理地址。
这意味着你可以在不知道的情况下在缓存的不同部分中拥有相同数据的两个副本......并且它们将无法正确更新,因此您会得到错误的结果。
reference的遗漏:
当内存的物理页的多个映射具有冲突的缓存状态(例如缓存和未缓存)时,会发生缓存别名。由于这些冲突状态,当刷新处理器的高速缓存时,该物理页面中的数据可能会被破坏。如果驱动程序将该页面用于DMA,则可能导致硬件稳定性问题和系统锁定。
For those who are still unconvinced:
在ARMv4和ARMv5处理器上,缓存被组织为虚拟索引的虚拟标记(VIVT)缓存,其中索引和标记都基于虚拟地址。此方法的主要优点是缓存查找更快,因为转换后备缓冲区(TLB)不涉及匹配虚拟地址的缓存行。但是,由于缓存别名,此缓存方法确实需要更频繁的缓存刷新,其中相同的物理地址可以映射到多个虚拟地址 。
答案 1 :(得分:4)
@Wu是的,您确实需要了解虚拟内存,以了解别名。我先谈谈几行解释:
假设我有一个1GB的RAM(物理内存)。我想向程序员展示我有4GB内存然后使用虚拟内存。在虚拟内存中,程序员认为他/她有4GB并从这个角度编写程序。他们不需要知道存在多少物理内存。优点是程序将在具有不同RAM量的计算机上运行。此外,该程序可以与其他程序(也消耗物理内存)一起在计算机上运行。
这就是虚拟内存的实现方式。我将给出一个简单的1级虚拟内存系统(英特尔有一个2/3级系统,这使得解释变得复杂。
我们的问题在于程序员有40亿个地址,我们只有10亿个地方可以存放这40亿个地址。因此,地址是从虚拟地址空间需要映射到物理地址空间的。这是使用一个名为Page Table的简单索引表完成的。您使用虚拟地址访问页表,并为您提供该内存位置的物理地址。
一些细节:请记住,物理空间仅为1GB,因此系统仅保留最近访问的1GB物理内存,并将其余部分保留在系统磁盘中。当程序请求特定地址时,我们首先检查它是否已经在物理内存中。如果是,则返回程序。如果没有,它从磁盘带入并放入物理内存然后返回程序。后者称为Page Fault。
回到虚拟内存环境中的别名:因为虚拟之间存在映射 - &gt;物理地址,可以使两个虚拟地址映射到同一物理地址。如果我查看我的页面表中的虚拟内容就是这么说的 地址X和Y,我将在两种情况下获得相同的物理地址。
我在下面显示了一个8条目页表的简单示例。假设有8个虚拟地址,只有3个物理地址。页表如下所示:
0: 1 1: On disk 2: 2 3: 1 4: On disk 5: On disk 6: On disk 7: 0 This mean that if virtual address 4 is accessed, you will get a page fault. If virtual addresses 3 is accessed, you will get the physical address 1 In this case, virtual addresses 0 and 3 are aliasing to the same physical address 1 for both of them
注意:我在所有地方使用术语物理和虚拟地址来简化概念。在实际系统中,虚拟到物理映射不是基于每个地址。相反,我们将虚拟空间块映射到物理空间。每个块称为页面(这就是为什么映射表称为页表),并且块的大小是ISA的属性,例如,Intel x86具有4Kbyte页面。