L1 指令高速缓存包含......指令。对于什么类型的指令,CPU 会从 icache 中获取指令,然后需要使用 L1 指令转换后备缓冲区 (iTLB) 查找虚拟地址?我可以看到为什么会提取一条指令,然后使用 L1 数据 TLB 来查找虚拟地址,但我不明白为什么要使用 iTLB?什么类型的 x86 指令会导致这种情况?
问问题
136 次
1 回答
3
你在这里交换了订单。
如果 L1 指令缓存被物理标记(如在绝大多数 CPU 中),那么您首先访问 iTLB 以将指令指针/程序计数器从虚拟地址转换为物理地址,然后才能访问 L1。
因此,由于在 x86 中,所有指令都是通过指令指针(LIP,或 64 位模式下的 RIP)中的虚拟地址访问的,除了实模式或不可缓存代码的某些极端情况之外,所有代码提取都必须进行这个过程并在访问指令缓存(或任何进一步的缓存/内存级别,以防丢失)之前从 iTLB 开始。
如果缓存也是虚拟索引的(VIPT,这也很常见),那么您可以并行访问它们并读取整个集合,同时您还可以访问 iTLB 进行翻译。在某些情况下,它甚至可能导致更早地访问 L1 缓存(如果 iTLB 受到其他请求的压力,或者您错过并不得不进行页面遍历),但您最终仍需要翻译以识别正确的行通过它的物理标签,在您可以通过将其发送到管道中实际开始使用该指令之前。
请注意,在某些 CPU 中,您可能有其他形式的代码缓存(例如 Intel 的 uop 缓存),这可能会提供替代路径。我不认为实际的细节是可用的,但是当你已经知道代码是什么时,可能会有一些形式的“宽松”TLB检查,只需要检查TLB属性以确保没有发生任何不好的事情(比如一些其他线程更改您脚下的页面地图)。
于 2014-07-09T15:49:35.300 回答