关于TLB&数据缓存

时间:2014-08-28 09:17:31

标签: memory memory-management operating-system paging tlb

我知道cpu如何在TLB&帮助下访问数据缓存。 但我有困惑,无论是数据缓存还是数据缓存。 TLB共享相同的CPU缓存,或者MMU硬件具有用于TLB的单独缓存。当上下文切换发生时,谁将刷新TLB和数据缓存的内容?

1 个答案:

答案 0 :(得分:0)

这在很大程度上取决于CPU。

既然你在谈论“MMU硬件”,我认为你有一本非常古老的书。至少在过去的20年里,MMU已经非常紧密地集成到大多数CPU中。

无论如何,让我们从缓存开始。在您每天都会遇到的大多数CPU上,例如i386和x86_64,缓存都是物理索引的。这意味着它们会在物理内存访问上缓存内容,因此无需在上下文切换时刷新它们。

在具有虚拟缓存的其他CPU架构上,有多种机制可确保缓存一致性。在某些具有完全虚拟地址缓存的情况下,操作系统的工作是在上下文切换时刷新整个缓存。在某些情况下,虚拟索引缓存还有一个物理标记,以确保我们从缓存中获得的任何内容都是正确的(缓存行查找与TLB查找并行完成,因此检查物理地址不是问题)。在其他情况下,操作系统为每个不同的上下文分配一个显式的上下文编号,这也是缓存查找的一部分,并且不需要在上下文切换时刷新缓存。

对于TLB,基本上有三种主要口味。一个是具有显式上下文编号的缓存,就像缓存一样,因此您不需要在上下文切换上执行任何操作。第二个flavor在加载新页表时自动刷新TLB(这是i386和x86_64)。加载新页表后,一些较旧的CPU需要显式TLB刷新。执行TLB的第三种方法是将它们完全填入特殊陷阱处理程序的软件中。

关于TLB和普通高速缓存是否共享内存的问题。通常没有。在你需要多少TLB和缓存之间很难找到一个很好的平衡点。此外,在TLB和缓存中查找的内容完全不同,并且存在保持一致性的不同需求。话虽这么说,经典的TLB总是从物理内存加载,一些CPU甚至需要缓存刷新才能加载TLB。在Core 2中,英特尔开始从CPU缓存中加载TLB,这导致早期Core 2 CPU中出现了大量漏洞,甚至对低级内存管理文档进行了一些重写,这些文档基本上使所有未来的Intel CPU都不向后兼容,并且有很多旧版本操作系统内核无法在Core 2和更新的Intel CPU上正常运行。