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