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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问映射到同一物理地址的虚拟地址是否会受到惩罚?相关的知识,希望对你有一定的参考价值。

鉴于处理操作的虚拟地址与表示内存中实际位置的物理地址之间的分离,您可以发挥一些有趣的技巧:例如创建circular buffer without a discontinuity at the beginning/end of the allocated space

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

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

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

答案

对于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)分支预测实际上是索引的。这意味着如果你有相同代码的多个副本,它会再次变得复杂(例如,它会增加未正确预测的分支的“训练时间”;并且重复可能导致分支数超过分支预测的数量插槽并导致更糟糕的分支预测)。

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

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

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

另一答案

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

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

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

以上是关于访问映射到同一物理地址的虚拟地址是否会受到惩罚?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核 内存管理内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )

静态映射和动态映射

malloc 何时处理从虚拟地址到物理地址的映射?

Linux虚拟地址和物理地址的映射

Linux驱动虚拟地址和物理地址的映射

Linux驱动虚拟地址和物理地址的映射