Nyb*_*ble 12 architecture caching cpu-architecture cpu-cache
我对CPU缓存和物理地址之间的"别名"的含义感到有些困惑.首先,我在维基百科上找到了它的定义:
但是,VIVT会遇到别名问题,其中几个不同的虚拟地址可能引用相同的物理地址.另一个问题是同音异义词,其中相同的虚拟地址映射到几个不同的物理地址.
但过了一段时间,我在DAC'05 的演示文稿(ppt)中看到了不同的定义:"具有虚拟内存的嵌入式处理器的节能物理标记缓存"
缓存别名和同义词:
别名:来自不同上下文的相同虚拟地址映射到不同的物理地址同义词:映射到同一物理地址的不同虚拟地址(数据共享)
由于我不是母语,我不知道哪个是正确的,尽管我觉得Wiki的定义是正确的.
编辑:
CPU缓存中"混叠"的概念通常表示"同义词",相反是"谐音".在更通用的层面上,"别名"是"令人困惑"或"混乱"或类似的东西.所以在我看来,"混叠"恰恰意味着(X-> Y)的映射是"不是双射的",其中
"X"=已缓存的物理地址单元的子集.(每个元素是一行字节)
"Y"=有效缓存行的集合.(元素也是"线")
Meh*_*dad 12
您首先需要了解虚拟内存,但基本上就是这样:
程序使用的内存地址不是RAM使用的物理地址; 它们是由CPU 映射到物理地址的虚拟地址.
多个虚拟地址可以指向相同的物理地址.
这意味着您可以在缓存的不同部分中拥有相同数据的两个副本而不知道它...并且它们将无法正确更新,因此您将得到错误的结果.
的Exerpt 参考:
当到内存物理页的多个映射具有冲突的缓存状态(例如缓存和未缓存)时,会发生缓存别名.由于这些冲突状态,当刷新处理器的高速缓存时,该物理页面中的数据可能会被破坏.如果该页面被驱动程序用于DMA,则可能导致硬件稳定性问题和系统锁定.
在ARMv4和ARMv5处理器上,缓存被组织为虚拟索引的虚拟标记(VIVT)缓存,其中索引和标记都基于虚拟地址.此方法的主要优点是缓存查找更快,因为转换后备缓冲区(TLB)不涉及匹配虚拟地址的缓存行.但是,由于缓存别名,此缓存方法确实需要更频繁的缓存刷新,其中相同的物理地址可以映射到多个虚拟地址.
@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 的页面。
| 归档时间: |
|
| 查看次数: |
12042 次 |
| 最近记录: |