访问映射到同一物理地址的虚拟地址是否会受到惩罚?

时间:2017-12-24 02:10:13

标签: performance memory-management x86 cpu-architecture mmap

鉴于进程操作的虚拟地址与表示内存中实际位置的物理地址之间存在分离,您可以发挥一些有趣的技巧:例如创建{ {3}}

我想知道在这种情况下,这种映射技巧是否会对数据读取或写入访问造成损害:

  • 对物理页面的访问主要通过相同的虚拟映射,但偶尔通过其他映射进行。
  • 对映射到同一物理地址的虚拟地址之间或多或少均匀地分布对物理页面的访问。

我特别感兴趣的是过去十年左右发布的x86芯片,还有现代ARM和POWER芯片。

2 个答案:

答案 0 :(得分:4)

对于80x86(我不了解其他架构):

a)正常的指令/数据/统一缓存被物理索引(因此不受分页技巧的影响)

b)TLB实际上是索引的。这意味着(取决于很多东西),对于你的循环缓冲技巧,你可能会期望比没有循环缓冲技巧时更多的TLB未命中。可能重要的事情包括区域的大小和使用的TLB条目的类型数量(4 KiB,2 MiB / 1 GiB);如果CPU预取TLB条目(最近的CPU那么做)并且花费了足够的时间做其他工作以确保预取的TLB在它们需要之前到达;并且如果CPU缓存更高级别的分页结构(例如页面目录)以避免在TLB未命中时获取每个级别(例如,因为页面目录被缓存,则单独使用页表条目;或者PML4条目然后PDPT条目然后PD条目然后页面表条目)

c)任何uop缓存(例如作为循环流检测器的一部分,或旧的Pentium 4"跟踪缓存")都被虚拟索引或根本没有索引(例如CPU只记得"从循环开始的uops")。除非你有多个代码副本,否则这不重要;如果你有多个代码副本,它会变得复杂(例如,如果重复导致uop的数量超过uop缓存的大小)。

d)分支预测实际上是索引的。这意味着如果你有相同代码的多个副本,它会再次变得复杂(例如,它会增加#34;训练时间和#34;对于没有正确静态预测的分支;并且重复可能导致分支数量超过分支预测时隙的数量并导致更糟糕的分支预测。)

e)返回缓冲区实际上已编入索引,但我无法想到这有多重要(重复代码不会增加调用图的深度)。

f)对于商店缓冲区(用于商店转发);如果商店在不同的虚拟页面上,则他们必须假设商店可能是别名,无论是否存在;因此无所谓。

g)用于写入组合缓冲区;老实说,我不确定他们是否真的被索引或物理索引。如果它可能很重要,你可能会用尽#34;写出组合插槽"在它真正重要之前。

答案 1 :(得分:0)

如果您正在寻找可能的处罚,我将从加载商店转发逻辑开始。如果您有一个存储到虚拟地址A,以及稍后从B加载,并且这两个地址都映射到同一物理地址,那么您将混淆CPU的地狱。

主要问题是必须尽早解决这些冲突,以便加载速度快(大多数微体系结构通常都是优化的),因此如果您了解某些设计可能会匹配虚拟地址(或部分设计)及时(如果没有,你可以使用内存消歧,但这是一个不同的故事)。 请记住,L1集映射通常会查看12个较低的addr位,这样可以并行执行L1查找和TLB查找 - 如果您还必须等待与任何早期存储的完全匹配,则这是不可能的。在系统中。幸运的是,如果你想要虚拟页面的别名,你仍然会得到相同的低12位,这要归功于最小的4k粒度,所以这个匹配仍然可以。

但是,为了在功能上万无一失,以后必须进行完整的物理匹配(一旦你有完整的负载转换和所有旧商店),所以设计可能在那时决定是否要基于部分匹配转发数据(并且必须清除所有内容的风险),或者等待完全匹配。无论哪种方式都可能会产生一些延迟,但我不认为混叠会对它产生影响,除非你打破了之前的部分检查。