【问题标题】:L1 Buffer handlingL1 缓冲区处理
【发布时间】:2014-08-29 18:34:06
【问题描述】:

L1 指令高速缓存包含.....指令。对于什么类型的指令,CPU 会从 icache 中获取指令,然后需要使用 L1 指令转换后备缓冲区 (iTLB) 查找虚拟地址?我可以看到为什么会提取一条指令,然后使用 L1 数据 TLB 来查找虚拟地址,但我不明白为什么要使用 iTLB?什么类型的 x86 指令会导致这种情况?

【问题讨论】:

  • 全部。每当处理器到达新页面时。
  • 但是包含当前指令的页面已经在内存中,因为该指令在 L1 指令中。缓存?
  • 在内存中有一个页面并不能保证它的翻译在 TLB 中。计算您的内存中可以驻留多少页,并检查您的 iTLB 中有多少条目(如果有的话,甚至是二级 TLB)。

标签: x86 cpu paging cpu-architecture tlb


【解决方案1】:

你在这里交换了订单。

如果 L1 指令缓存是物理标记的(就像在绝大多数 CPU 中一样),那么您首先访问 iTLB 以将指令指针/程序计数器从虚拟地址转换为物理地址,然后才能访问 L1用那个。

因此,由于在 x86 中,所有指令都是通过指令指针(LIP,或 64 位模式下的 RIP)中的虚拟地址访问的,除了实模式或不可缓存代码的某些极端情况外,所有代码提取都将具有在访问指令缓存(或任何进一步的缓存/内存级别,以防未命中)之前完成此过程并从 iTLB 开始。

如果缓存也被虚拟索引(VIPT,这也很常见),那么您可以并行访问它们并读取整个集合,同时访问 iTLB 进行翻译。在某些情况下,它甚至可能导致更早地访问 L1 缓存(如果 iTLB 受到其他请求的压力,或者您错过并不得不进行页面遍历),但您最终仍需要翻译以识别正确的行通过它的物理标签,然后你才能真正开始使用该指令,将其发送到管道中。

请注意,在某些 CPU 中,您可能有其他形式的代码缓存(例如 Intel 的 uop 缓存),这可能会提供替代路径。我不认为实际的细节是可用的,但是当你已经知道代码是什么时,可能会有一些形式的“宽松”TLB检查,只需要检查TLB属性以确保没有发生任何不好的事情(比如一些其他线程更改您脚下的页面地图)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 2021-11-29
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    相关资源
    最近更新 更多